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.mzph.cn/pingmian/5003.shtml

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

相关文章

Kubernetes学习笔记06

第十六章、Kubernetes容器交付介绍 如何在k8s集群中部署Java项目 容器交付流程 开发代码阶段 编写代码编写Dockerfile【打镜像做准备】持续交付/集成 代码编译打包制作镜像上传镜像仓库应用部署 环境准备PodServiceIngress运维 监控故障排查应用升级 k8s部署Java项目流程 …

使用Github+Picgo+npm实现免费图床

本文参考自 Akilar,原文地址:https://akilar.top/posts/3e956346/ Picgo的配置 Github图床仓库内容不能超过1GB,因为Github原则上是反对仓库图床化的,超过1GB之后会由人工审核仓库内容,如果仓库被发现用来做图床&…

H266 编码标准开源编码器 VVenC 介绍

H266 H.266,也称为VVC(Versatile Video Coding),是最新的国际视频编码标准,由MPEG(Moving Picture Experts Group)和ITU(International Telecommunication Union)联合开…

MySQL CRUD操作

前言👀~ 上一章我们介绍了数据库的一些基础操作,关于如何去创建一个数据库,还有使用数据库,删 除数据库以及对表进行的一些基础操作,今天我们学习CRUD操作 俗称(增删改查) 如果各位对文章的内…

IDM下载器安装cmd注册

一、下载注册 安装包去IDM官网下载最新的试用版即可 或者直达百度网盘下载(担心被河蟹,放在txt中了)包含IDM下载器安装包和注册软件 IDM下载器安装包和注册软件下载地址链接 https://download.csdn.net/download/qq_31237581/89215452 如果…

【STM32+HAL】SDIO模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片: STM32F407ZGT6 2、IDE: MDK-Keil软件 3、库文件:STM32F4xxHAL库 三、实现功能 实现用DMA读写SD卡内…

人工原生动物优化器(APO)-2024年SCI一区新算法-公式原理详解与性能测评 Matlab代码免费获取

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原理简介 一、觅食行为 (1)自养模式 (2)异…

xss漏洞学习

1.xss漏洞简介 跨站脚本(Cross-Site Scripting),本应该缩写为CSS,但是该缩写已被层叠样式脚本Cascading Style Sheets所用,所以改简称为XSS。也称跨站脚本或跨站脚本攻击。 原理:跨站脚本攻击XSS通过将恶…

项目文档:基于JavaFX + Maven的桌面扫雷软件打包exe【小白可做,文章末尾有包教安装有源代码可运行,可打包】

微信公众号: 科研小条 前言 用于学习javafx做桌面软件,熟悉maven构建项目的最佳选择 效果展示: 1. 项目概述 本项目是一个基于Java和JavaFX构建的桌面扫雷游戏软件。扫雷游戏是一种经典的单人益智游戏,玩家需要根据已知的雷区信息&…

Golang Colly爬取图片gorm存储数据

语言:Golang 库:Iris/Colly/gorm 运行结果 text/html; charset=utf-8 It is image 20240429222029_0_0.jpg Saved file: images\20240429222029_0_0.jpg text/html; charset=utf-8 It is image 20240429222030_1_0.jpg Saved file: images\20240429222030_1_0.jpg It is ima…

动态切换数据源的最佳实践

序言 本文和大家聊聊在开发中,动态切换多数据源的方案。 一、多数据源需求 随着应用程序的发展和复杂性增加,对于多数据源的需求也变得越来越普遍。在某些场景下,一个应用程序可能需要连接和操作多个不同的数据库或数据源。常见的场景包括…

Qt QThreadPool线程池

1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…

深度学习入门(4)

神经网络的构建 import numpy as np import matplotlib.pyplot as plt def sigmoid(x):return 1/(1np.exp(-x)) def identity_function(x):#恒等函数return x def init_network():#进行权重和偏置的初始化,并保存到字典中network{}network[W1]np.array([[0.1,0.3,0…

ezplot--Matlab学习

目录 一、代码 二、效果 ​编辑 三、ezplot讲解 四、如何自定义一个函数 一、代码 clc; clear; t0:32; x4(t) cos(2*pi*t/4).*sin(2*pi*t/4); x8(t) cos(2*pi*t/8).*sin(2*pi*t/8); x16(t) cos(2*pi*t/16).*sin(2*pi*t/16); subplot(3,1,1) ezplot(x4,[0,32]); subplot…

POCEXP编写—多线程

POC&EXP编写—多线程 1. 前言2. 多进程&多线程2.1. 多进程2.1.1. 案例 2.2. 多线程2.2.1. 案例: 2.3. POC的案例(模板) 3. UA头设置3.1. 随机UA头3.1.1. 案例3.1.2. 模板拼接 4. 代理Proxy4.1. 单代理案例4.2. 多代理案例4.2.1. 请求…

【AI心理咨询应用】继Woebot之后,国内诞生的“LLM+CBT”应用:白小喵

导言 AI认知行为疗法(Cognitive Behavioral Therapy,CBT)早在2017年便有了首例,即美国知名CBT治疗机器人Woebot。 然而,Woebot在CBT的完整落地上仍有缺陷问题,LLM的出现促进了对该问题的解决,…

【机器学习基础1】什么是机器学习、预测模型解决问题的步骤、机器学习的Python生态圈

文章目录 一. 什么是机器学习1. 概念2. 机器学习算法分类 二. 利用预测模型解决问题的步骤三. 机器学习的Python生态圈 一. 什么是机器学习 1. 概念 机器学习(Machine Learning,ML)是一门多领域的交叉学科,涉及概率论、统计学、…

服务器数据恢复—Storwize V3700存储数据恢复案例

服务器存储数据恢复环境: 某品牌Storwize V3700存储,10块硬盘组建了2组Mdisk加入到一个存储池中,一共创建了1个通用卷来存放数据,主要数据为oracle数据库。 服务器存储故障: 其中一组Mdisk中两块磁盘出现故障离线&…

【每日刷题】Day28

【每日刷题】Day28 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 ​ 1. 121. 买卖股票的最佳时机 - 力扣(LeetCode) 2. 205. 同构字符串 - 力扣…

关于discuz论坛网址优化的一些记录(网站地图sitemap提交)

最近网站刚上线,针对SEO做了些操作,为了方便网站网页百度被收录,特此记录下 discuz有免费的sitemap插件可以用,打开后台管理,找到插件栏,然后找到更多插件,进入插件市场。 选择这个免费的sitem…