Java:继承——继承概念+父子类成员、构造访问顺序+super、this关键字(代码+画图超详解!)

一、什么是继承

1、继承的概念

举例理解:

根据打印机的原理,我们可以知道不管是彩色打印机还是黑白打印机,实现的都是一个功能:打印,这是二者的共性。彩色打印机和黑白打印机都继承了打印机的打印功能,且二者在打印机的基础上增加了自己特有的功能。

继承的概念:

        程序员在保持原本特性的基础上进行扩展,增加新功能,产生的新的类,这种类称为派生类,也称为子类,被扩展的类被称为父类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用

2、代码示例

2.1 继承的语法

在Java中要表现类与类间的继承关系,需要借助extends关键字:

修饰符  class  子类  extends  父类  {

        //…………

}

2.2 代码实现

例如:猫和狗都是动物,他们是动物这个类之下的细分。

class Animal {//  Animal 是 Cat、Dog 的父类
}
class Cat extends Animal {// Cat 是 Animal 的子类
}
class Dog extends Animal {// Dog 是 Animal 的子类
}

2.3 注意

1、子类会继承父类中的成员变量或成员方法。

2、子类继承父类后,必须要新添加自己特有的成员,体现出与父类的不同,否则就没有继承必要了。

class Animal {//  Animal 是 Cat、Dog 的父类public void eat() {System.out.println("吃吃吃");}
}
class Cat extends Animal {// Cat 是 Animal 的子类public void cry() {System.out.println("喵喵喵");}
}
public class test1 {public static void main(String[] args) {Cat cat = new Cat();cat.eat();    //Cat从Animal中继承了 eat方法,所以可以直接调用cat.cry();    }

运行结果:

二、super、this 关键字

1、super

作用:在子类方法中访问父类的成员

代码示例:

class Base {int a = 10;public void methodA() {System.out.println("Base————A");}
}
class Child extends Base {int a = 100;public void methodA() {System.out.println("Child————A");}public void method() {System.out.println(a);          //100System.out.println(super.a);    //10methodA();                      //Child————Asuper.methodA();                //Base————A}
}

总结:当想明确访问父类中成员时,借助super关键字即可

注意:只能在非静态方法中使用

2、this

作用:想明确访问本类的成员时,借助this关键字即可

代码示例:

class Base {int a = 10;public void methodA(int a) {this.a = a;//当前代码中有两个 a,使用this可以明确给成员变量 a 赋值为参数 a }
}

3、super和this的相同与不同

相同点:

1、二者都是Java中的关键字

2、都只能在类的非静态方法中使用,用来访问非静态的成员方法和变量

3、在构造方法中使用时,必须是第一条语句,并且二者不能同时存在

不同点:

1、this是当前对象的引用,当前对象即调用实例方法的对象;super是子类对象中对父类继承下来的部分成员的引用

2、在非静态成员中:this用来访问本类的方法和属性;super用来访问父类继承下来的方法和属性

3、在构造方法中:this(…)用来调用本类的构造方法;super(…)用来调用父类的构造方法;二者不能同时出现

4、构造方法中一定会出现super(…)的调用,用户没有写编译器也会自动添加,而this(…)用户不写就没有

三、父子类成员访问顺序

1、子类中访问父类的成员变量

代码示例:

class Animal {int age = 0;double weight = 5.0;
}
class Cat extends Animal {double weight = 9.5;String color = "Black";String name = "花花";public void display() {String name = "小黑";System.out.println(age);    //0System.out.println(weight);     //9.5System.out.println(color);      //BlackSystem.out.println(name);       //小黑}
}

总结:1、父类有子类没有的,访问从父类继承的成员变量

           2、父类有子类也有的,访问子类自己的成员变量

           3、父类没有子类有的,访问子类自己的成员变量

           4、子类父类都没有的,编译报错

           5、局部变量访问优先级高于成员变量

成员变量访问就近原则:自己有先访问自己的,自己没有再去父类中找

2、子类中访问父类的成员方法

2.1 成员方法名字不同

代码示例:

class Animal {public void methodA() {System.out.println("Animal————A");}
}
class Cat extends Animal {public void methodB() {System.out.println("Cat————B");}public void method() {methodA();  //Animal————AmethodB();  //Cat————B    //methodC();//编译报错}
}

总结:成员方法名不同时,在子类方法中或通过子类对象访问时,优先访问自己的,自己没有的时候再到父类中找,如果父类中也没有,则报错。

2.1 成员方法名字相同

代码示例:

class Animal {public void methodA() {System.out.println("Animal————A");}public void methodB() {System.out.println("Animal————B");}
}
class Cat extends Animal {public void methodA(int num) {System.out.println("Cat————A");}public void methodB() {System.out.println("Cat————B");}public void method() {methodA();      //Animal————AmethodA(1);     //Cat————AmethodB();      //Cat————B}
}

总结:1、方法同名时,如果参数列表相同,则就近访问

           2、如果参数列表不同,则根据参数选择合适的方法访问(方法的重载)

           3、如果没有该方法就报错

四、父子类构造访问顺序

父子即先有父,后有子。子类对象构造时,需先调用父类的构造方法。

代码示例:

class Base {public Base() {System.out.println("Base构造方法");}}class Child extends Base {public Child() {//super();//没写时编译器会自动添加 且一定是方法中的第一条语句System.out.println("Child构造方法");}
}

所以当我们要实例化一个Child类的对象时,会先后输出:

因为在Child类的构造方法中,会自动添加super()在第一条语句,调用父类的构造方法。

        所以我们可以知道,在我们构造子类对象时,先执行父类的构造方法,再执行子类的构造方法

注意:

1、若父类定义无参或默认的构造方法,则在子类构造方法的第一条默认会有隐含的super()调用。

2、如果父类定义的是有参的构造方法,则在子类中一定要显示定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。

3、在子类构造方法中,super(…)调用父类构造时,必须为方法中第一条语句

4、super(…)只能在子类构造中出现一次,不能与this(…)同时出现。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B端系统从0到1:有几步,其中需求分析要做啥?

一款B系统从无到有都经历了啥,而其中的需求分析又要做什么?贝格前端工场给老铁们做一下分析,文章写作不易,如果咱们有界面设计和前端开发需求,别忘了私信我呦,开始了。 一、B端系统从0到1都有哪些要走的步骤…

【C语言】指针专项练习 都是一些大厂的笔试真题 附有详细解析,带你深入理解指针

一.sizeof()与strlen() sizeof是一个操作符,而strlen是一个库函数。 数组名代表首元素地址,有两种情况例外,第一种是数组名单独放在sizeof内部,第二种是&数组名,这两种情况下数组名代表的是整个数组。sizeof(arr…

数据密集型应用系统设计

数据密集型应用系统设计 原文完整版PDF:https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人,知识面广得惊人,也善于举一反三,知识之间互相关联,比如有个地方把读路径比作programming …

【微服务】skywalking自定义告警规则使用详解

目录 一、前言 二、SkyWalking告警功能介绍 2.1 SkyWalking告警是什么 2.2 为什么需要SkyWalking告警功能 2.2.1 及时发现系统异常 2.2.2 保障和提升系统稳定性 2.2.3 避免数据丢失 2.2.4 提高故障处理效率 三、 SkyWalking告警规则 3.1 SkyWalking告警规则配置 3.2 …

嵌入式系统中常见传感器介绍

(本文为简单介绍,内容取材网络) 传感器是嵌入式系统接入外部环境信息的重要接口,根据测量物理量的不同,传感器可以分为温度传感器、湿度传感器、压力传感器、加速度传感器等多种类型。选择合适的传感器,对于实现嵌入式系统的控制和互动功能至…

auto关键字详讲

目录 1.问题思考 2.auto关键字介绍 3. 早期auto的缺陷: 4.什么叫自动存储器? 5. c标准auto关键字 5.1auto的使用细节 5.2 auto什么时候不能推导变量的类型呢? 5.3基于范围的for循环 5.3.1范围for的用法 5.3.2 范围for的使用条件 6.…

kali无线渗透之用wps加密模式破解出wpa模式的密码12

WPS(Wi-Fi Protected Setup,Wi-Fi保护设置)是由Wi-Fi联盟推出的全新Wi-Fi安全防护设定标准。该标准推出的主要原因是为了解决长久以来无线网络加密认证设定的步骤过于繁杂之弊病,使用者往往会因为步骤太过麻烦,以致干脆不做任何加密安全设定&…

【51单片机】一个简单的例子TMOD&TCON带你永远理解【(不)可位寻址】

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》专栏YY的《数据…

【Java EE初阶十二】网络初识

1. 网络发展史 网络发展的几个主要时期: 单机时代->局域网时代->广域网时代->移动互联网时代 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成 业务,就有了网络互…

点击侧边栏菜单时只切换 <router-view> 中的内容,而不是进行整个页面的路由跳转(动态路由)

解决方法&#xff1a;在 <el-menu> 的 select 事件中调用了 handleMenuSelect 方法来处理菜单项的选择。你可以在 handleMenuSelect 方法中根据菜单项的 index 来执行相应的操作&#xff0c;例如更新组件内的数据或者切换组件。由于整个页面的路由路径并没有改变&#xf…

jenkins-maven环境的安装

jenkins-maven环境的安装

Three.js学习9:Three.js 响应式设计

当浏览器窗口尺寸变化的时候&#xff0c;Three.js 渲染的场景&#xff0c;也就是 canvas 不会变化。 让 canvas 随着窗口的尺寸变化&#xff0c;可以利用 window 对象的 resize 事件实现响应式变化。 window.onresize function(){winH window.innerHeight;winW window.inn…