Java-Java基础学习(1)-重写和多态对比分析

Java中的重写(Override)和多态(Polymorphism)是两个核心概念,它们在面向对象编程中扮演着非常重要的角色。下面我将对这两个概念进行详细的对比分析,包括它们的区别、联系以及应用场景,并附上相应的代码示例。

1.1. 重写(Override)

定义
重写是子类对父类中允许访问的且非final的实例方法的一种覆盖。子类的方法名和参数列表必须与父类中被重写的方法名和参数列表相同,并且子类方法的返回类型必须与父类方法返回类型相同或是其子类。重写时,子类方法的访问权限不能低于父类方法的访问权限。

应用场景
当子类需要改变或扩展父类的某个方法的行为时,可以使用重写。这允许子类根据自身的需求提供特定的实现。

示例代码1:

1.1.1
class Animal {  
    public void makeSound() {  
        System.out.println("The animal makes a sound");  
    }  
}  
  
class Dog extends Animal {  
    @Override  
    public void makeSound() {  
        System.out.println("The dog barks");  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        Animal myDog = new Dog();  
        myDog.makeSound(); // 输出 "The dog barks"  
    }  
}

示例代码2:

1.1.2 
A.java
    public class A {

    public  static void test(){
        System.out.println("A->test()");
    }
}

B.java
    public class B extends A{

    public static void test(){
        System.out.println("B->test()");
    }
}
    
OverrideDemo01.java
    public class OverrideDemo01 {
    public static void main(String[] args) {
        B b = new B();
        b.test();

        A a =  new B();
        a.test();
    }
}

结果:
    B->test()
    A->test()
1.1.3 在test方法中,去掉static ,重写
A.java
    public class A {

    public   void test(){
        System.out.println("A->test()");
    }
}

B.java
    public class B extends A{

    public  void test(){
        System.out.println("B->test()");
    }
}
    
OverrideDemo01.java
    public class OverrideDemo01 {
    public static void main(String[] args) {
        B b = new B();
        b.test();

        A a =  new B();
        a.test();
    }
}

结果:
    B->test()
    B->test()

分析:

  1. 重写:需要有继承关系,子类重写父类的方法

    • 方法名必须相同;
    • 参数列表必须相同;
    • 修饰符:范围可以扩大但不能缩小: public > protected>default>private;
    • 抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException ---->Exception(大)
  2. 重写:子类的方法和父类必须一致,方法体不同;

  3. 什么需要重写?

    • 父类的功能,子类不一定需要,或者不满足
    • Alt +Insert

1.2. 多态(Polymorphism)

定义
多态是允许你使用父类类型的引用来引用子类对象。运行时,Java虚拟机(JVM)会根据对象的实际类型来决定调用哪个方法。这是面向对象编程的三大特性之一。

应用场景
多态常用于实现接口或继承的类之间的通用性。它允许我们编写可重用的代码,而无需关心具体对象的类型。

示例代码1:

1.2.1 
class Shape {  
    public void draw() {  
        System.out.println("Drawing a generic shape");  
    }  
}  
  
class Circle extends Shape {  
    @Override  
    public void draw() {  
        System.out.println("Drawing a circle");  
    }  
}  
  
class Rectangle extends Shape {  
    @Override  
    public void draw() {  
        System.out.println("Drawing a rectangle");  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        Shape[] shapes = new Shape[2];  
        shapes[0] = new Circle();  
        shapes[1] = new Rectangle();  
  
        for (Shape shape : shapes) {  
            shape.draw(); // 分别输出 "Drawing a circle" 和 "Drawing a rectangle"  
        }  
    }  
}

示例代码2:

1.2.2 多态 重写
 Person.java
    public class Person {

    public  void  run(){
        System.out.println("Person run!");
    }
}

Stuednt.java
    public class Student extends Person {
    @Override
    public void run() {
       // super.run();
        System.out.println("Student run!");
    }
}

PolymorphicDemo01.java
    public class PolymorphicDemo01 {
    public static void main(String[] args) {

        Student s1 = new Student();
        Person s2 = new Student();

        s1.run();
        s2.run();

    }
}

结果:
    Student run!
    Student run!

 1.2.3 
Person.java
    public class Person {

    public  void  run(){
        System.out.println("Person run!");
    }
}

Stuednt.java
    public class Student extends Person {
    //    @Override
    //    public void run() {
    //       // super.run();
    //        System.out.println("Student run!");
    //    }
}

PolymorphicDemo01.java
    public class PolymorphicDemo01 {
    public static void main(String[] args) {

        // 一个对象的实际类型是确定的
        // new Student();
        // new Person();
        
        // 可以指向的引用类型就不确定了:父类的引用指向子类
        // Student 能调用的方法都是自己的或者继承父类的
        Student s1 = new Student();
        
        // Person 父类型,可以指向子类,但是不能调用子类独有的方法
        Person s2 = new Student();

        // 对象能执行哪些方法,需要看左边的类型,和右边关系不大
        s1.run();
        s2.run();

    }
}

结果:
Person run!
Person run!

多态注意事项:

    1. 多态是方法的多态,属性没有多态;
    2. 父类和子类,有联系 类型转换异常! ClassCastException!
    3. 存在条件:继承关系,方法需要重写,父类引用指向子类对象!Father f1 = new Son();
  • 不能多态的
    1. Static 方法,属于类,它不属于实例;
    2. final常量;
    3. private方法

1.3. 区别和联系

区别

  • 重写:是子类对父类方法的覆盖,关注的是子类如何改变父类的方法行为。
  • 多态:是父类引用指向子类对象,关注的是使用统一的接口处理不同的对象。

联系

  • 多态往往依赖于重写。如果子类没有重写父类的方法,那么多态调用时仍会执行父类的方法。
  • 重写是多态实现的基础。多态通过方法重写实现运行时方法的动态绑定。

1.4 应用场景说明

​ 重写通常用于扩展或改变父类的行为,而多态则用于实现代码的通用性和扩展性。例如,在一个绘图程序中,你可以定义一个Shape类作为基类,并定义draw方法。然后,你可以创建不同的子类如CircleRectangle等,并重写draw方法以实现各自的绘制逻辑。在主程序中,你可以使用Shape类型的数组或集合来存储不同的形状对象,并调用它们的draw方法。由于多态的特性,你无需关心每个对象的具体类型,只需调用draw方法即可。这样,你可以轻松地添加新的形状类,而无需修改主程序的代码。

​ 重写和多态的结合使用使得代码更加灵活、可维护和可扩展。通过重写,子类可以提供特定于自己的实现;通过多态,我们可以编写通用的代码来处理不同的对象类型。

1.5. main_args参数测试

public static void main(String[] args) {
  for (int i = 0; i < args.length; i++) {
      System.out.println("args["+i+"]:"+args[i]);
  }
}
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/466417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么关掉了公众号留言功能?

为什么公众号没有留言功能&#xff1f;根据要求&#xff0c;自2018年2月12日起&#xff0c;新申请的微信公众号默认无留言功能。有些人听过一个说法&#xff1a;公众号粉丝累计到一定程度或者原创文章数量累计到一定程度就可以开通留言功能。其实这个方法是2018年之前才可以&am…

2024年阿里云服务器所在机房位置详细说明

阿里云服务器地域和可用区有哪些&#xff1f;阿里云服务器地域节点遍布全球29个地域、88个可用区&#xff0c;包括中国大陆、中国香港、日本、美国、新加坡、孟买、泰国、首尔、迪拜等地域&#xff0c;同一个地域下有多个可用区可以选择&#xff0c;阿里云服务器网aliyunfuwuqi…

Linux应用 线程同步之自旋锁

1、概念 1.1 定义 自旋锁&#xff08;Spinlock&#xff09;是一种特殊的锁机制&#xff0c;当线程尝试获取锁而锁不可用时&#xff0c;线程会进入忙等待&#xff08;即循环检查锁是否可用&#xff09;&#xff0c;而不是进入睡眠状态。这种机制适用于锁持有时间非常短的场景&…

深度学习指标| 置信区间、Dice、IOU、MIOU、Kappa

深度学习部分指标介绍 置信区间混淆矩阵DiceIOU和MIOUKappa 置信区间 95%CI指标 读论文的时候&#xff0c;常会看到一个“95%CI”的评价指标。 其中CI指的是统计学中的置信区间&#xff08;Confidence interval&#xff0c;CI&#xff09;。在统计学中&#xff0c;一个概率样…

用python写网络爬虫:2.urllib库的基本用法

文章目录 urllib库抓取网页data参数timeout参数更灵活地配置参数登录代理Cookies 参考书籍 建议新入门的小伙伴先看我同一专栏的文章&#xff1a;用python写网络爬虫&#xff1a;1.基础知识 urllib库 urllib是python中一个最基础的HTTP库&#xff0c;一般是内置的&#xff0c;…

Linux网络基础2

目录 实现网络版本计算器 自己定协议实现用json协议实现 重谈OSI七层模型HTTP协议 域名介绍url介绍HTTP请求和响应 实现一个简易的HTTP服务器 实现简易Http服务器初级版实现简易Http服务器中级版 实现一个简易的HTTP服务器最终版 请求方法HTTP状态码HTTP常见的Header 实现网…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— Progress进度条组件

概述 Progress为进度条组件&#xff0c;用于显示各种进度。 参数 Progress组件的参数定义如下 Progress(options: {value: number, total?: number, type?: ProgressType})● value value属性用于设置当前进度值。 ● total total属性用于设置总值。 ● type type属…

加拿大光量子计算公司Xanadu入局英国多企业量子合作计划

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1200字丨8分钟阅读 英国航空发动机制造商罗尔斯罗伊斯&#xff08;Rolls-Royce&#xff09;、英国量子计算公司Riverlane和加拿大量子计算公…

【赠书】从深度学习到图神经网络:模型与实践

文章目录 赠书&#xff1a;《从深度学习到图神经网络&#xff1a;模型与实践》一、编辑推荐二、内容简介三、作者简介张玉宏杨铁军 四、精彩书评五、目录第1章 图上的深度学习 11.1 人工智能与深度学习 21.2 图神经网络时代的来临 61.3 图数据处理面临的挑战 91.4 图神经网络的…

AS-V1000视频监控平台如何加强系统安全,满足等保2.0规范要求

目 录 一、概述 &#xff08;一&#xff09;信息安全技术网络安全等级保护标准 &#xff08;二&#xff09;解读 1、等级保护工作的内容 2、等级保护的等级划分 3、不同等级的安全保护能力 第一级安全保护能力 第二级安全保护能力 第三级安全保护能力 第…

电子科技大学链时代工作室招新题C语言部分---题号D

1. 题目 这道题大概的意思就是对一个整形数组的元素进行排序&#xff0c;然后按新的顺序打印原本的下标&#xff1b; 例如&#xff0c;在题目给出的Note部分&#xff0c;{a1, a2, a3, a4, a5}进行排序之后变为了{a2, a1, a4, a3, a5}&#xff0c;于是输出2 1 4 3 5。 排序的规则…

MyBatisPlus中MetaObjectHandler的使用

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 起因是公司一个同事接到需求,让把一条数据录入时createTime字段,设置为…

DM数据库(docker)

docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 配置阿里云Docker Yum源: yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新yum缓存 yum makecache fast 安装docker-CE: y…

抛弃Superhuman?这些替代方案让你眼前一亮!

Superhuman是一个极好的人工智能工具在电子邮件助理领域。根据SimilarWeb的最新统计&#xff0c;它在全球网站排名中排名第21980位&#xff0c;月访问量为1751798。然而市场上还有许多其他优秀的选择。为了帮助您找到最适合您需求的解决方案&#xff0c;我们为您精心挑选了10种…

海淘注意事项,海淘虚拟卡

2024年海淘visa信用卡&#xff0c;点击获取卡片 海淘注意事项 海淘&#xff08;跨境购物&#xff09;可以让人们在国外购买到更多种类的商品&#xff0c;但是也需要注意一些事项&#xff0c;以确保购物的顺利进行和商品的质量。以下是一些建议&#xff1a; 海淘网站的选择&…

零代码编程:用kimichat合并一个文件夹下的多个文件

一个文件夹里面有很多个srt字幕文件&#xff0c;如何借助kimichat来自动批量合并呢&#xff1f; 在kimichat对话框中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;完成如下的编程任务&#xff1a; 这个文件夹&#xff1a;D:\downloads\life.on.our.planet.(202…

C++中的using关键字

1. 类型别名 using关键字可以用来为类型创建一个新的名字&#xff0c;这在代码的可读性和维护性方面非常有帮助。 // 定义类型别名 using IntPtr int*;// 使用 int value 5; IntPtr ptr &value;2. 命名空间别名 如果你正在使用一个非常长的命名空间&#xff0c;可以使…

如何在MT4平台查询自己的账户杠杆?

如何在MT4平台查询自己的账户杠杆?MT4中直接没有这个选项&#xff0c;犟嘴的投资者千万不要犟嘴&#xff0c;说可以根据保证金水平计算。其实在交易账户中有3中方法可以查询自己的账户&#xff0c;投资者可以在这里开立一个MT4帐户&#xff0c;并将其附加到具有登录名和密码的…

Jenkins-pipeline流水线构建完钉钉通知

添加钉钉机器人 在钉钉群设置里添加机器人拿出Webhook地址&#xff0c;设置关键词 Jenkins安装钉钉插件 Dashboard > 系统管理 > 插件管理&#xff0c;搜索构建通知&#xff0c;直接搜索Ding Talk也行 安装DingTalk插件&#xff0c;重启Jenkins 来到Dashboard > 系…

想要了解更多商品信息?淘宝天猫详情接口API助你一键搞定!

想要了解更多商品信息&#xff1f;淘宝天猫详情接口API是你的理想选择&#xff01;作为唯一提供官方商品数据的接口&#xff0c;它能够帮助你快速获取商品的多种详细信息&#xff0c;联讯数据让你在购物过程中做出更明智的决策。 简介&#xff1a;淘宝天猫详情接口API的功能及…