java三大特性之【继承】

概念

继承就是将多个类的共性抽取出来,提出继承的概念。就是在进行共性抽取,实现代码复用。
在这里插入图片描述
提高代码的复用性,方便进行子类,子功能的扩展,将所有共性的内容放在父类(基类),子类只需要关注子类独有的属性和功能

父类和子类成员关系

  1. 父类和子类不存在同名的属性和方法
    在这里插入图片描述
  2. 子类和父类成员变量重名
    编译器的就近匹配原则:若子类中不存在该属性,才会从父类中寻找同名属性;若父类中也没找到同名属性,编译报错。
    在这里插入图片描述

问题:如果父类中的成员为私有,则变量为父类还是子类?

在这里插入图片描述

由于c在父类中是私有权限,在子类中不能直接使用
当父类中存在private私有域,子类在继承父类时,私有域无法直接使用,这种继承称为隐式继承

  1. 父类和子类中的方法调用
    当通过子类对象访问方法时
  • 若子类中存在该方法,则优先访问子类的同名方法:子类和父类完全想通过,方法名称,参数类型,则优先访问子类中的方法。
  • 若子类不存在该方法,则会从父类中寻找是否存在该方法,存在则调用,不存在则编译出错,一定注意隐式继承的问题。

继承中构造对象的产生顺序

继承的使用规则: 当产生子类对象时,默认先调用父类的构造方法产生父类对象后调用子类构造方法产生子类对象。
(先有父才有子,先产生父类对象然后产生子类对象)
在这里插入图片描述

super关键字

表示直接从父类中寻找成员变量或成员方法

1. super修饰属性,表示直接寻找父类的同名属性

在这里插入图片描述
私有属性无法被调用!

2. super修饰方法
2.1 super修饰普通成员方法

表示直接在父类中寻找同名方法
在这里插入图片描述
this和super的使用

  • this.方法是在当前类中寻找同名方法
  • super.方法是在父类中寻找同名方法
2.2 super修饰构造方法

表示显示在子类构造方法中调用父类的构造方法

  • 如果父类中没有无参构造,只包含一个有参构造,则在子类的构造方法中首行必须显式使用super(参数)关键字来调用父类的有参构造;
  • 若父类存在无参构造,则子类的构造方法首行可以不写super()

在这里插入图片描述
当存在父类继承时,一般在子类中不出现this的构造方法调用。
原因:
子类的构造方法首行必须使用super;
this的构造方法调用也得放在首行。

笔试题

在这里插入图片描述
静态块>构造块>构造方法

  • 静态块在类加载时执行一次,和具体产生对象无关,用于初始化静态变量
  • 类中的静态代码块还会优先于主方法执行

输出顺序:7,3,2,1,6,5,4,2,1,5,4,8
正确顺序:3,6,7,2,1,5,4,2,1,5,4,8

分析

  1. 主方法存在主类中,要执行主方法需要加载主类D,由于D继承于B,因此先加载B
    一旦加载类,静态代码块就会执行,则3(B的静态代码块),6(D的静态代码块)
  2. 进入主方法,输出7
  3. 产生子类对象D,首先需要产生父类对象B。
    对象的产生构造块和构造方法都会执行,则2154,2154执行两次
  4. 输出8

protected关键字

  • 在不同包的具有继承关系的之间可见,和对象是没有关系的。
  • 权限修饰符指的是在哪些“类”的内部可见,与具体的对象无关。
    由于default权限,是在同一个包的不同类之间可见
    protected(不同包之间的具有继承关系的类之间可见)>default
    因此,在同一个包的毫无关系的不同类之间,protected仍然可见!!!
    default有的权限,protected一定具备。

继承关系

java的单继承局限:一个类只能使用extends直接继承一个父类,不允许多重继承,但是允许多层继承

多重继承(不允许!!!):

public class C extends A,B{}

多层继承:

public class C extends B{}
public class B extends A{}

不同类继承于同一个类:

public class A{}
public class B extends A{}
public class C extends A{}

单继承:

public class A{}
public class B extends A{}

final关键字—终结器,到此为止

  1. final 修饰基本数据类型
    final 修饰的属性称为常量,一旦被final修饰的变量成为常量,初始化之后值不能修改

  2. final 修饰引用数据类型
    final 修饰的变量数值不能改,对于基本数据类型来说,就是具体的数值;对于引用数据类型,不可变的是引用类型的数值,即地址!!!与对象内部的内容无关。

final A a=new A()
//a对象内部的属性随意修改,但是a的指向不能修改
a.b=10;
a.b=20;
//报错,a无法再次指向别的A对象
a=new A();

a指向的对象不能修改

  1. final 修饰的属性使用之前必须进行赋值,一旦赋值,无法修改
  2. final 修饰的方法无法被重写/覆写
  3. final 修饰的类不能有子类
    JDK中String类就是final类

类和类之间的关系:继承和组合

  • 继承表示的是类之间的 is a 关系
//天然的继承关系,Dogs具备了Animal类中的所有属性和方法
Dog is a Animal;
  • 组合表示的是类之间的 has a 关系
School has a Student;
School has a Teacher;

组合关系也可以实现代码的复用,组合类的内部包含了其他类,直接调用其他类对象的属性和方法,实现代码复用。

总结:
组合和继承都可以实现代码复用,具体使用哪个关系需要根据具体场景进行判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值