JAVA系列 小白入门参考资料 继承

目录

1. 为什么需要继承

2. 继承的概念

3. 继承的语法

4. 父类成员访问 

        4.1 子类中访问父类的成员变量

                  1. 子类和父类不存在同名成员变量

                  2.  子类和父类成员变量同名  

4.2 子类中访问父类的成员方法 

1. 成员方法名字不同

2. 成员方法名字相同  

​5. super关键字

6. 子类构造方法

7. super和this  

相同点

不同点

8. 继承关系的执行顺序

9. 继承方式 

单继承

多层继承 

不同类继承同一个类 

10. final关键字


1. 为什么需要继承

Java 中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联。因此需要一些程序设计来解决这个问题。
下面通过代码来发现问题
//定义一个狗类
class Dog{public String name;public int age;public String color;public void eat() {System.out.println(this.name + "在吃东西");}public void run() {System.out.println(this.name + "在跑");}
}//定义一个鸟类
class Bird{public String name;public int age;public String color;public void eat() {System.out.println( this.name + "在吃东西");}public void fly() {System.out.println( this.name + "在飞");}
}public class blog {public static void main(String[] args) {Dog dog = new Dog(); //创建对象//初始化dog.name = "小灰";dog.age = 10;dog.color = "灰色";//调用方法dog.eat();dog.run();Bird bird = new Bird();bird.name = "小花";bird.age = 10;bird.color = "花色";bird.eat();bird.fly();}
}

我们可以看到Dog类和Bird类中有以下相同的成员变量和成员方法

    public String name;public int age;public String color;public void eat() {System.out.println(this.name + "在吃东西");}

因此 我们为了节省代码,提高代码的复用性,我们引入了继承这个概念。

2. 继承的概念

继承 (inheritance) 机制 :是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性
的基础上进行 扩展,增加新功能 ,这样产生新的类,称 派生类 。继承呈现了面向对象程序设计的层次结构, 体现了
由简单到复杂的认知过程。继承主要解决的问题是: 共性的抽取,实现代码复用

3. 继承的语法

修饰符 class 子类 extends 父类 {
      // ...
}
关键字是 extends

因为 小狗和小鸟 都是属于动物,他们有自己的年龄、颜色等等属性。也会吃东西等等相同动作,并且作为宠物都会给他们给予名字 。

因此 我们创建一个新的类(Animals) 作为父类,并将 这些相同的属性和动作作为成员变量和成员方法  放入其中。

以下代码为使用继承之后。我们可以明显的看到 代码少了很多。

并且在现实生活中我们只需要关注子类特有的属性和方法即可

class Animals{public String name;public int age;public String color;public void eat() {System.out.println(this.name + "在吃东西");}
}class Dog extends Animals{public void run() {System.out.println(this.name + "在跑");}
}class Bird extends Animals{public void fly() {System.out.println( this.name + "在飞");}
}public class blog {public static void main(String[] args) {Dog dog = new Dog();dog.name = "小灰";dog.age = 10;dog.color = "灰色";dog.eat();dog.run();Bird bird = new Bird();bird.name = "小花";bird.age = 10;bird.color = "花色";bird.eat();bird.fly();}
}

4. 父类成员访问 

4.1 子类中访问父类的成员变量

        1.子类和父类不存在同名成员变量
class Father {public int a = 10;public int b = 20;
}class Son extends Father {public int c = 30;public void Method(){System.out.println(a);System.out.println(b);System.out.println(c);}
}public class Test {public static void main(String[] args) {Son son = new Son();son.Method();}
}

程序正常运行,并且子类可以访问父类的成员变量,并打印值。 

2. 子类和父类成员变量同名  

使用关键字 super

我们先来看 如果  子类和父类成员变量同名 会输出什么?

class Father {public int a = 10;public int b = 20;
}class Son extends Father {public int a = 100;  // 如果子类有  先访问子类的。  子类没有的  才会去看父类是否有public int c = 30;   public void Method(){System.out.println(a);System.out.println(b);System.out.println(c);}
}public class Test {public static void main(String[] args) {Son son = new Son();son.Method();}
}

由此我们可知,会输出子类的 同名成员变量。

那么如果我们非要访问 父类变量呢?

就是前面所提的 super 

class Father {public int a = 10;public int b = 20;
}class Son extends Father {public int a = 100;public int c = 30;public void Method(){System.out.println(super.a);// 输出父类的 aSystem.out.println(this.a);// 谁调用 就输出谁的a System.out.println(b);System.out.println(c);}
}public class Test {public static void main(String[] args) {Son son = new Son();son.Method();}
}

在子类方法中 或者 通过子类对象访问成员时
1.如果访问的成员变量子类中有,优先访问自己的成员变量。
2.如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
3.如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找

4.2 子类中访问父类的成员方法 

1. 成员方法名字不同

class Father{public void Func() {System.out.println("Func");}
}class Son extends Father{public void Func2() {System.out.println("Func2");}public void Func3() {Func();Func2();}
}public class Test {public static void main(String[] args) {Son son = new Son();son.Func3();}
}

2. 成员方法名字相同  

 我们在Son类中添加一个   和 Father类一模一样Func成员方法,看结果如何?

class Father{public void Func() {System.out.println("Func");}
}class Son extends Father{public void Func() {System.out.println("Son::Func");}public void Func2() {System.out.println("Func2");}public void Func3() {Func();Func2();}
}public class Test {public static void main(String[] args) {Son son = new Son();son.Func3();}
}

结果是 子类有同名方法,先调用自己的方法。 

如果想要在子类调用 父类中的同名成员方法,还是需要用到关键字super

//在此就不过多 赘写代码了 
//基于上面的代码
//这里我将最核心的代码修改部分,单提了出来public void Func3() {this.Func();super.Func();this.Func2();}

5. super关键字

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

如何使用,前面代码已经展示了其作用。

注意事项:
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。 

6. 子类构造方法

父子,即先有父,后有子。所以在我们的代码中,当我们想创建子类对象时,要先调用和实现父类的构造方法,然后再实现子类构造方法 

在之前的代码中,虽然父类和子类都没有显式的定义构造方法。但其实 子类中 有隐藏的代码

public class Father {public Father(){System.out.println("Father()");} 
}public class Son extends Father{public Son(){// super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,// 并且只能出现一次System.out.println("Son()");}
}

下面代码是父类已经有定义好的构造方法

class Animals{public String name;public int age;public String color;//父类的构造方法public Animals(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public void eat() {System.out.println(this.name + "在吃东西");}
}class Dog extends Animals {//子类的构造方法public Dog() {super("小罗",10,"白色");}public void run() {System.out.println(this.name + "在跑");}
}class Bird extends Animals {//子类的构造方法public Bird(String name, int age, String color) {super(name, age, color);}public void fly() {System.out.println( this.name + "在飞");}
}public class Blog {public static void main(String[] args) {Dog dog = new Dog();// 根据构造方法   //第一种初始化方式dog.name = "小灰";dog.age = 10;dog.color = "灰色";dog.eat();dog.run();Bird bird = new Bird("小辣椒",10,"红色");// 根据构造方法  //第二种初始化方法bird.eat();bird.fly();}
}

注意:

1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

7. superthis  

super  和  this  都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

相同点

1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

不同点

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造 方法中出现
4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

8. 继承关系的执行顺序

在之前的学习中我们知道了

1.静态代码块先执行,并且只执行一次,在类加载阶段执行

2.当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

class Persons{String name;int age;public Persons(String name, int age) {this.name = name;this.age = age;System.out.println("Person构造方法被调用");}{System.out.println("Person实例代码块被调用");}static {System.out.println("Person静态代码块被调用");}
}class Students extends Persons{public Students(String name, int age) {super(name, age);System.out.println("Students构造方法被调用");}{System.out.println("Students实例代码块被调用");}static {System.out.println("Students静态代码块被调用");}}public class job {public static void main(String[] args) {Students students = new Students("小罗",18);Students students2 = new Students("小米",18);}
}

无奖竞猜:大家猜一下输出结果是什么?

通过分析执行结果,得出以下结论
1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

9. 继承方式 

单继承

多层继承 

 不同类继承同一个类 

 最重要的是,不可以同一个类继承不同的类

10. final关键字

final关键可以用来修饰变量、成员方法以及类。

1.修饰变量或字段,表示常量(即不能修改)

2.修饰类:表示此类不能被继承

3.修饰方法:表示该方法不能被重写 

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

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

相关文章

golang beego结合wire依赖注入及自动路由

1 安装wire 1.1 通过命令直接安装 go install github.com/google/wire/cmd/wirelatest 1.2 通过go get方式安装 go get github.com/google/wire/cmd/wire进入目录编译 cd C:\Users\leell\go\pkg\mod\github.com\google\wirev0.6.0\cmd\wire go build 然后将wire.exe移动到…

万兆以太网MAC设计(12)万兆UDP协议栈上板与主机网卡通信

文章目录 一、设置IP以及MAC二、上板效果2.1、板卡与主机数据回环测试2.2、板卡满带宽发送数据 一、设置IP以及MAC 顶层模块设置源MAC地址 module XC7Z100_Top#(parameter P_SRC_MAC 48h01_02_03_04_05_06,parameter P_DST_MAC 48hff_ff_ff_ff_ff_ff )(input …

【Docker】docker compose服务编排

docker compose 简介 Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。 docker swarm(管理跨节点) Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板&#xff08…

某赛通电子文档安全管理系统 多处 SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

微信小程序与web-view网页进行通信的尝试

首先,微信小程序向web-view传递数据一般通过地址栏传参的形式(给src赋值或者修改hash),这样一般就已经能够满足实际开发需求了,所以这里主要探讨web-view向微信小程序传参。下面,我们从官方文档入手&#x…

C语言:项目实践(贪吃蛇)

前言: 相信大家都玩过贪吃蛇这款游戏吧,贪吃蛇是久负盛名的游戏,它也和俄罗斯方块,扫雷等游戏位列经典游戏的行列,那贪吃蛇到底是怎么实现的呢? 今天,我就用C语言带着大家一起来实现一下这款游戏…

Linux第十五章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

Three.js杂记(十五)—— 汽车展览(下)

在上一篇文章Three.js杂记(十四)—— 汽车展览上 - 掘金 (juejin.cn)中主要对切换相机不同位置和鼠标拖拽移动相机焦点做了简单的应用。 那么现在聊聊该如何实现汽车模型自带的三种动画展示了,实际上可以是两种汽车前后盖打开和汽车4车门打开…

网络安全之密码学技术

文章目录 网络信息安全的概念数据加密|解密概念密码学概论密码学分类古典密码学现代密码学 现代密码学的相关概念对称加密算法对称加密算法—DES对称加密算法—3DES对称加密算法—AES对称加密算法—IDEA 非对称加密算法非对称加密算法—RSA非对称加密算法—ElGamal非对称加密算…

Centos7安装K8S集群环境

一、系统设置 1、关闭swap 临时关闭swap swapoff -a 永久关闭 注释掉 /etc/fstab 中的下面配置 #/dev/mapper/centos-swap swap swap defaults 0 0 2、 关闭SELinux kubelet不支持SELinux, 这里需要将SELinux设置为permissive模式 setenforce 0 sed -i s/^SELINUXenfo…

Flutter 从 Assets 中读取 JSON 文件:指南 [2024]

在本教程中,我们将探讨如何从 Flutter 项目中的 asset 中读取 JSON 文件。您将找到详细的解释、实际示例和最佳实践,使您的 JSON 文件处理顺利高效。那么,让我们深入了解 Flutter 和 JSON 的世界吧! 从 asset 中读取 JSON 文件 …

pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx 文件读取漏洞复现

0x01 产品简介 pkpmbs 建设工程质量监督系统是湖南建研信息技术股份有限公司一个与工程质量检测管理系统相结合的,B/S架构的检测信息监管系统。 0x02 漏洞概述 pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx接口处存在文件读取漏洞,未经身份认证的攻击者可以利用漏洞读…

使用 GitHub Actions 实现项目的持续集成(CI)

目录 什么是 GitHub Actions 基础概念 Workflow 文件 Workflow 语法 实例:编译 OpenWrt 什么是 GitHub Actions GitHub Actions 是 GitHub 推出的持续集成(Continuous Integration,简称 CI)服务它允许你创建自定义工作流&am…

SpringBoot 自定义 HandlerMethodArgumentResolver 搞定xml泛型参数解析

文章目录 介绍一、解析简单 xml 数据案例引入 Jackson 的 xml 支持定义 Message 对象&MessageHeader 对象定义 Controller 方法调用结果 二、解析带泛型的 XML 数据案例2.1 直接给 Message 加上泛型 T2.2 无法直接解析泛型参数了 三、自定义 MVC 的参数解析器实现泛型参数解…

全志ARM-蜂鸣器

sh操作准备: 1.使Tab键的缩进和批量对齐为4格 在/etc/vim/vimrc 中添加一项配置 set tabstop 4; 也可以再加一行 set nu显示代码的行数 vim的设置,修改/etc/vim/vimrc文件,需要用超级用户权限 /etc/vim/vimrc set shiftwidth4 设置批量…

助力企业部署国产云原生数据库 XSKY星辰天合与云猿生完成产品互兼容认证

近日,北京星辰天合科技股份有限公司(简称:XSKY 星辰天合)与杭州云猿生数据有限公司(简称“云猿生”)完成了产品互兼容认证,星辰天合企业级分布式统一数据平台 XEDP 与云猿生的开源数据库管控平台…

CJSON工具类

4.4.3.CJSON工具类 OpenResty提供了一个cjson的模块用来处理JSON的序列化和反序列化。 官方地址: https://github.com/openresty/lua-cjson/ 1)引入cjson模块: local cjson require "cjson"2)序列化: …

竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖,适合作为竞赛课…

网络层 --- IP协议

目录 1. 前置性认识 2. IP协议 3. IP协议头格式 3.1. 4位版本 3.2. 4位首部长度 3.3. 8位服务类型 3.4. 16位总长度 3.5. 8位生存时间 TTL 3.6. 8位协议 3.7. 16位首部检验和 3.8. 32位源IP和32位目的IP 4. 分片问题 4.1. 为什么要分片 4.2. 分片是什么 4.2.1. …

HTTP/1.1,HTTP/2.0和HTTP/3.0 各版本协议的详解(2024-04-24)

1、HTTP介绍 HTTP 协议有多个版本,目前广泛使用的是 HTTP/1.1 和 HTTP/2,以及正在逐步推广的 HTTP/3。 HTTP/1.1:支持持久连接,允许多个请求/响应通过同一个 TCP 连接传输,减少了建立和关闭连接的消耗。 HTTP/2&#…