Java_1_09

本文深入解析Java中的继承概念,包括类的抽象、代码复用、多态性、构造方法调用顺序、成员方法重写与重载的区别,以及final关键字的作用。同时探讨了继承带来的优缺点,如何正确使用继承,以及在子类中如何调用父类的构造方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承

  • 一个类的对象可以使用另一个类的对象里的成员变量和成员方法
  • 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。
  • 提高代码的复用性!
  • extands 的意思是“扩展”。子类是父类的扩展
  • 不同的叫法:超类、父类、基类、子类、派生类

好处:

  • 通过继承可以简化类的定义,实现代码的复用性
  • 让类与类之间产生了关系,这是多态的前提条件

开发原则:高内聚,低耦合

坏处:

  • 提高了代码的耦合性

特点:

  • java中只有单继承,不可以多继承;可多层继承,不可循环继承
  • java中的多继承,可以通过接口来实现

注意:

  • 子类继承父类的成员变量和成员方法
  • 子类不继承父类的构造方法
  • 不能为了获取某个功能,就随便地去继承某个类
  • 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object

继承的使用时机

  • 当两个类之间存在 “is a” 的关系

子类继承中构造方法之间的关系

  • 1.子类构造方法中默认第一行均为 super(); 前提:第一行不是 this();
  • 2.子类构造方法第一行,要么是super(参数),要么是this(参数),super和this不能共存
  • 3.子类中所有构造方法中,至少有一个构造方法中第一行是super();(避免 this 循环调用,死循环)

子类继承中成员方法之间的关系

super 关键字

父类内存空间的标记,在用法上可以当做父类对象的引用来使用;但这并不代表 super 就是父类对象的引用。

重写 override

子类中出现了与父类中 声明(方法名和参数列表) 完全一致的方法

  • 在子类中可以根据需要对从基类中继承来的方法进行重写。
  • 重写方法必须和被重写方法具有相同方法名称、参数列表返回值类型
  • 重写方法不能使用比被重写方法更严格的访问权限。(由于多态)

重写与重载的区别

  • 重写
    • 在子父类继承中,子类出现了与父类中方法的声明完全一致的方法
  • 重载
    • 在同一个类中,出现两个方法的名字相同,但参数列表不同的方法
  • 在子类的重写方法上加上 @Override 判断

注意

  • 1.子类不能重写父类中私有的成员方法
  • 2.子类不能重写父类中被 final 修饰的成员方法
  • 3.子类重写父类中的方法:重写方法的权限必须 >= 父类中的方法
  • 4.static 方法不能被重写(静态重写静态方法知识看着像,但依旧不是重写)

父类方法的重写:

+ “**==**”:方法名、形参列表相同。 
+ “**<=**”:返回值类型和异常类型,子类小于等于父类。 
+ “**>=**”:访问权限,子类大于等于父类 
  • 构造方法调用顺序:
  • 根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造方法。
  • 先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。

final 关键字

修饰符,“最终的”,可以修饰成员变量、方法和类
特点:

  • 1.被 final 修饰的 不可以被继承
  • 2.被 final 修饰的 成员方法 不能被重写(覆盖)
  • 3.被 final 修饰的 成员变量 一旦被初始化便不能被改变了,相当于常量
    • 如果变量是 基本类型,数据值不能发生改变
    • 如果变量是 引用类型,地址值不变,但内容可以改变

Object 类

  • Object 类是所有Java类的超类
  • 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
  • 重写:toString方法:
    • 默认返回:包名+类名+@+哈希码
    • 可以重写!
  • 打开API文档,开始熟悉!

对象的比较 —— == 和 equals()

  • ==
    • 比较两基本类型变量的是否相等
    • 比较两个引用类型的值即内存地址是否相等,即是否指向同一对象。
  • equals()
    • 两对象的内容是否一致
  • 示例
    • object1.equals(object2) 如:p1.equals(p2)
      • 比较所指对象的内容是否一样
      • 是比较两个对象,而非两个基本数据类型的变量
    • object1 == object2 如:p1==p2
      • 比较p1和p2的值即内存地址是否相等,即是否是指向同一对象。
  • 自定义类须重写equals(),否则其对象比较结果总是false

代码块

局部代码块

  • 定义在方法中的代码块
  • 能让局部变量能更早地在内存中消失,节省内存空间

构造代码块

  • 定义在类中方法外的代码块
  • 构造代码块是在创建对象时执行,且优先于构造方法执行
  • 可以将多个构造方法中的共性内容抽取出来,放到构造代码块中执行

静态代码块

  • 在构造代码块前面加上 static 关键字的代码块
  • 静态代码块是随着 .class 文件的加载而执行的;又.class文件只会加载进方法区一次,所以静态代码块只执行一次;
  • 当我们第一次创建该类对象时,.class文件会加载进方法区;所以第一次创建对象,静态代码执行一次之后,不管再创建多少次该类对象,静态代码块都不会执行。

实例化子类对象

  • 首先要加载父类的class文件进内存,静态代码块由于有static修饰,所以是随着类的创建而执行,所以父类静态代码块最先被执行;

  • 子类class文件再被加载,同理静态代码块被先执行;

  • 实例化子类对象要先调用父类的构造方法,而调用父类构造方法前会先执行父类的构造代码块。

  • ————>>父类静态代码块——>子类静态代码块——>父类构造块——>父类构造方法——>子类构造块——>子类构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值