当前位置: 首页 > news >正文

java基础:继承和多态

目录

  • 一、继承
    • 继承的注意事项
  • 二、多态
    • 1、多态的定义
    • 2、多态的优点
    • 3、多态的缺点
  • 三、继承和多态的综合练习

一、继承

继承是java面对对象的三大特征之一,继承是子类继承父类的方法和属性,使子类可以使用父类的属性和方法。
继承关键字:extends
继承的定义方式:

class 父类{
}
class 子类 extends 父类{
}

继承的目的:代码复用。

继承的注意事项

1、Java之中只允许多层继承,不允许多重继承,Java存在单继承局限。
2、子类构造方法会默认调用父类的无参构造。
3、private修饰的方法和属性不可以被继承,final修饰的方法和属性不可以被继承。
4、方法签名必须相同,被static和final修饰的方法不可以被重写,访问权限比父类更加宽松。
5、子类实例化时,父类也会被实例化。
6、定义的类都会默认继承object类
7、instanceof 和类型转换, java语言编译时向下强制转换,不会报错,但是会有运行时错误。
代码如下:

Parent p = new Child();
if (p instanceof Child) {Child c = (Child) p; // 安全转换
}

二、多态

1、多态的定义

多态是java面对对象的三大特征之一,多态分为:编译时多态运行时多态
编译时多态:编译器在编译时可以识别一个方法的多种形态,它指的是方法的重载。
运行时多态:编译器在编译时无法最终确定匹配哪个方法,在真正运行时,才能确定执行哪个类的哪个方法,它指的是方法的重写。
语法规则:

父类 变量名 = new 子类();

实现多态的必要性:继承、重写、父类引用指向子类对象
编译时看左边,看父类。
运行时右边,看子类。
1、如果子类没有重写父类的方法,当调用方法的时候,只能够调用父类的方法。
2、使用多态后,可以调用父类特有的方法,但是不可以调用子类中特有的方法。
3、当使用多态的时候,会在堆中先开辟父类,再开辟子类,变量名指向父类,当有重写的方法时,该方法会调用子类当中重写的方法。

2、多态的优点

  1. 消除类型之间的耦合关系
  2. 可替换性
  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性
  7. 提高代码的复用性

3、多态的缺点

不能够使用子类当中特有的方法和属性,以及没有重写父类的方法也只能够调用父类的情况。

三、继承和多态的综合练习

分别定义四个类 : A、B、C、D,各种类之间存在继承关系。
A类定义如下:


public class A {public String show(D obj){return "A and D";}public String show(A obj){return "A and A";}
}

B类定义如下:


public class B extends A{public String show(Object obj){return "B and B";}public String show(A obj){return "B and A";}public String show(D obj){return "A and D";}
}

C类定义如下:

public class C extends B{
}

D类定义如下:

public class D extends B{
}

以及Test用于测试的类


public class Test {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println(a1.show(b));System.out.println(a1.show(c));System.out.println(a1.show(d));System.out.println(a2.show(b));System.out.println(a2.show(c));System.out.println(a2.show(d));System.out.println(b.show(b));System.out.println(b.show(c));System.out.println(b.show(d));System.out.println("--------------------");}
}

分析如下:
1、a1::正常定义的A类的对象,并未实现多态,因此可以调用本身的方法以及父类的方法。

A a1 = new A();

可以调用:
在这里插入图片描述
在这里插入图片描述
2、a2:是使用多态定义出来的,编译时看左侧,运行时看右侧。
a2可以调用:

在这里插入图片描述
在这里插入图片描述
3、b:正常定义出来的B类的实例化对象。
b可以调用:本身自己的方法和父类继承下来的方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4、c:定义的C类的实例化对象
可以调用:本身自己没有定义方法,但是可以继承父类的方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、d:定义的D类的实例化对象
可以调用:本身自己没有定义方法,但是可以继承父类的方法。
在这里插入图片描述
分析下面运行代码:

        System.out.println(a1.show(b));System.out.println(a1.show(c));System.out.println(a1.show(d));System.out.println(a2.show(b));System.out.println(a2.show(c));System.out.println(a2.show(d));System.out.println(b.show(b));System.out.println(b.show(c));System.out.println(b.show(d));

1、System.out.println(a1.show(b));
符合上面的a1中的show(A)的方法,因为用到了参数的多态
所以结果为:
在这里插入图片描述
2、 System.out.println(a1.show©);
符合上面的a1中的show(A)的方法,因为用到了参数的多态
所以结果为:
在这里插入图片描述
3、System.out.println(a1.show(d));
符合上面a1方法的show(d)。
结果如下:在这里插入图片描述
4、 System.out.println(a2.show(b));
符合a2中的show(A)
所以结果是:
在这里插入图片描述
5、 System.out.println(a2.show©);
符合a2中的show(A)
所以结果是:
在这里插入图片描述
6、 System.out.println(a2.show(d));
符合a2中的show(D)
所以结果是:
在这里插入图片描述
7、 System.out.println(b.show(b));
符合a2中的show(A)
所以结果:
在这里插入图片描述
8、 System.out.println(b.show©);
符合a2中的show(A)
所以结果:
在这里插入图片描述
9、 System.out.println(b.show(d));
符合a2中的show(D)
所以结果:
在这里插入图片描述

相关文章:

  • ChatGPT深度研究功能革新:GitHub直连与强化微调
  • Linux 文件系统中的数据定位:inode 与 dentry 的技术解析
  • 基于DeepSeek的韦恩图绘制:方法、优化与应用
  • 驱动-互斥锁
  • 从粗放管控到数字治能——安科瑞智能监测系统助力污水厂能耗下降15%+
  • 生成自定义的androidjar文件具体操作
  • React+Taro选择日期组件封装
  • 《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
  • Android设备序列号获取方式全解析
  • 【彻底卸载nginx并部署nginx1.22.1+ssl模块等】
  • Azure资源创建与部署指南
  • 全场景漏洞检测工具深度解析:从 AppScan 版本差异到多工具协同实战
  • Spring创建的线程池
  • springboot3 + mybatis-plus3 创建web项目实现表增删改查
  • shell脚本基础详细学习(更新中)
  • 仿真每日一练 | 有限元模态分析详解
  • 使用 ANSYS AEDT(单向耦合)进行高功率同轴射频滤波器的热分析
  • 介质访问控制(MAC)
  • 【PostgreSQL】不开启归档模式,是否会影响主从库备份?
  • 从零打造企业级Android木马:数据窃取与远程控制实战
  • 拿出压箱底作品,北京交响乐团让上海观众享受音乐盛宴
  • 习近平会见塞尔维亚总统武契奇
  • 新华时评:直播间里“家人”成“韭菜”,得好好管!
  • 迪拜金融市场CEO:2024年市场表现出色,超八成新投资者来自海外
  • 鸿蒙电脑正式亮相,五年布局积累超2700项核心专利
  • 诺和诺德一季度减重版司美格鲁肽收入增83%,美国市场竞争激烈下调全年业绩预期