java三大特性之【继承】

news/2024/12/3 7:32:18/

概念

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

父类和子类成员关系

  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;

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

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


http://www.ppmy.cn/news/376680.html

相关文章

小米各机型 MIUI 历史版本下载网址推荐,免费!!!免登录!!!

小米各机型 MIUI 历史版本免费下载网站:xiaomirom.com 此网站完全免费,也比miuiver更全面。 良心推荐。

红米k50至尊版和小米12spro区别 哪个好

一、相同点 1.红米k50至尊版和小米12spro搭载的是都是高通骁龙 8处理器。 2.红米k50至尊版和小米12spro都是双卡双待5G全网通手机。 我用的红米手机就是活动时8折抢购的 机会不容错过 http://xiaomi.adiannao.cn/1 3.红米k50至尊版和小米12spro都有8GB128GB、8GB256GB、12GB256…

小米用上鸿蒙系统,红米小米手机刷新了鸿蒙系统后还能用吗 红米小米手机刷鸿蒙系统图文攻略...

鸿蒙系统是华为新上线的系统。除了华为,不少其他品牌机型的网友也想使用,红米小米手机可以使用鸿蒙系统吗?下面一起来看看如何操作吧。 【红米小米手机刷新了鸿蒙系统后还能用吗】 目前来说小米、红米手机还不能刷鸿蒙系统,要等20…

小米为什么拆分红米? | 畅言

小米效仿荣耀,将红米品牌独立,但双品牌策略也许并非一步好棋…… 赶在春节来临之前,小米前阵子做出了一个大动作——对外宣布将子品牌红米独立,并由金立原总裁卢伟冰负责运营。 在手机行业中,双品牌策略其实并不新鲜&a…

小米,红米 root Magisk(面具)安装教程

小米手机通用面具安装,root获取 需要准备手机系统包zip一份,数据线一个,电脑一个,手机一个BootLoader已解锁(必须解锁) 此方法优势 1.无需第三方Recovery 2.不影响系统升级(完整包升级) 第二篇 安装面具apk,提取小米系统rom中的boot.img 如果你没有读上一…

小米/红米手机刷面具(ROOT)和类原生(米家/刷机/recovery)

BootLoader是什么?刷机为什么需要解锁? BootLoader是开机时CPU执行的第一个程序,用来初始化硬件 自从Android5.1开始以后,很多手机厂商都不会开放BootLoader,这就会刷机造成影响,即使到现在,手机…

红米k30至尊纪念版刷鸿蒙系统,红米k30s至尊纪念版MIUI刷机包

红米k30s至尊纪念版MIUI刷机包是一份红米k30s至尊纪念版MIUI最新稳定版官方原版系统卡刷固件下载,前几天切换到手机系统的最新开发版本,使用三天感觉很费电,于是想自己切换回稳定版,接下来就使用这个系统。目前使用感觉很省电&…

小米红米手机root刷机教程

前提: 新出的小米手机一般都有BL锁,其中比较典型的机型如红米Note3,红米Note4,红米Pro,红米3S,小米5,小米5s,小米5s plus,小米note2,小米MIX等,针对此类机型,…