面向对象-----继承

前面向大家介绍了面向对象中的封装性,今天再来向大家介绍面向对象的继承和多态的两大特性。

1.继承

1.1 为什么需要继承?

在java语言中,我们用类来描述世间万物,虽然万物非常复杂,但总有一些共同点,如果将这些共同点抽取出来,便能更好的提高我们写代码的效率。所以在面向对象的语言中提出了继承的概念,用来抽取事物的共性,实现代码的复用。

1.2 继承的概念

继承机制:在面向对象程序设计中,继承可以让程序员实现代码的复用,也可以让程序员在原有类(父类、基类、超累)的基础上进行属性和供能的扩增,从而产生出新的类,这些新的类被称为派生类,同时也被称为子类。继承实现的主要功能为抽取共性,实现代码的复用。

1.3 继承的语法

在Java中如果要用到继承来表示类之间的继承关系,我们要用到extend关键字。

语法格式:

修饰符 class 子类名 extends 父类名{}

 接下来我们来举一个例子。

以猫和狗为例

我们知道猫和狗有一些共同点,如名字,年龄,颜色,这些都是动物的共性。我们就可以将这些共同点抽取出来,放在一个类中,这个类就是父类。

接着我们分别将猫和狗分别设置为两个类,分别继承父类。然后分别在猫和狗的类中各自实现自己的功能与属性,如猫要吃猫粮,狗要吃狗粮。

代码实现

父类

public class Animal {//共性的抽取public String name;public int age;public String color;
}

狗类

public class Dog extends Animal{public void eat(){System.out.println(this.name+"在吃狗粮");}
}

猫类

public class Cat extends Animal{public void eat(){System.out.println(this.name+"在吃猫粮");}
}

测试类

public class Test {public static void main(String[] args) {Dog dog=new Dog();System.out.println(dog.name = "旺财");System.out.println(dog.age = 6);System.out.println(dog.color = "black");dog.eat();Cat cat=new Cat();System.out.println(cat.name = "咪咪");System.out.println(cat.age = 7);System.out.println(cat.color = "white");cat.eat();}
}

通过测试类我们发现,即使我们没有在Dog类和Cat类中定义了name、age和color的成员变量,但由于都继承了Animal这个父类,所以我们通过Dog类和Cat类创建的对象也可以使用name、age和color这三个成员变量。

运行代码

4dab512e52dd48eb8c92f8518866813e.png

小总结

父类的成员方法和成员变量会被继承到子类中。

 2. 访问成员变量和成员方法

在继承这个机制中,成员变量和成员的方法遵循就近原则。在子类的方法中或者通过子类的对象去访问成员方法或者成员变量时,优先在子类中寻找使用。如果在子类当中没有找到对应的成员变量或者成员方法,在去父类中寻找使用,如果父类和子类中都没有找到,则编译会报错。

2.1 访问成员变量

父类的成员变量和子类成员变量不同名

优先到子类中找对应的成员变量,如果在子类中没找到,再去父类中找,都没找到,就会报错。

class Base{public int a=10;
}
class Derive extends Base{public int b=9;
}
public class Test {public static void main(String[] args) {Derive derive=new Derive();System.out.println(derive.b);}
}

83ed31219520476486a7ca0580e27134.png

 父类的成员变量和子类的的成员变量同名

一样遵循就近原则

class Base{public int a=10;
}
class Derive extends Base{public int a=9;
}
public class Test {public static void main(String[] args) {Derive derive=new Derive();System.out.println(derive.a);System.out.println(derive.a);}
}

2737b9573e3147d387f0de4a86590eb3.png

2.2 访问成员方法

父类的成员方法与子类的成员方法不同名字

遵循就近原则

class Base{public int a=10;public void Base(){System.out.println("Base()被调用......");}
}
class Derive extends Base{public int a=9;public void Derive(){System.out.println("Derive()被调用。。。。。。");}
}
public class Test {public static void main(String[] args) {Derive derive=new Derive();derive.Derive();derive.Base();}
}

1c0a8e522f694391abdad49a8e203791.png

 父类的成员方法与子类的成员方法同名

这里涉及到了方法的重写和动态绑定,后面讲解多态的时候会介绍,这里也先理解为就近原则

class Base{public void Test(){System.out.println("父类的Test()......被调用");}
}
class Derive extends Base{public void Test(){System.out.println("子类的Test()......被调用");}
}
public class Test {public static void main(String[] args) {Derive derive=new Derive();derive.Test();}
}

5b939fa4a5cd477485f7de54f44a097c.png

注意事项:

如果我们通过子类创建的对象去访问父类和子类同名的成员方法时,但是由于父类和子类同名的成员方法的参数列表不同(重载),会根据调用方法时的参数去子类和父类中去寻找合适的成员方法。

class Base{public void Test2(int a){System.out.println("父类Test2(int a)被调用......");}public void Test1(){System.out.println("父类的Test1()被调用......");}
}
class Derive extends Base{public void Test2(){System.out.println("子类的Test2()被调用......");}public void Test1(int a){System.out.println("子类的Test1(int a)被调用......");}
}
public class Test {public static void main(String[] args) {Derive derive=new Derive();int a=10;derive.Test1(a);  //调用子类的Test1(int a);derive.Test1();   //调用父类的Test1();derive.Test2(a);  //调用父类的Test2(int a);derive.Test2();   //调用子类的Test2();}
}

运行代码

220fdc06a2d243819d0733807a7cf771.png

3.super关键字

如果我们要想在子类中直接去访问父类的去访问符类的成员变量和成员方法,要如何操作呢?

答案就是super关键字。通过super关键字我们就能直接在子类中去访问父类的成员变量和成员方法。

class Base{int a=10;public void Test2(int a){System.out.println("父类Test2(int a)被调用......");}public void Test1(){System.out.println("父类的Test1()被调用......");}
}
class Derive extends Base{int a=9;public void Test2(){System.out.println("子类的Test2()被调用......");}public void Test1(int a){System.out.println("子类的Test1(int a)被调用......");}public void Test(){System.out.println(super.a);//调用父类的asuper.Test2(a);//调用父类的Test2(int a)super.Test1();//调用父类的Test1()}
}
public class Test {public static void main(String[] args) {Derive derive=new Derive();derive.Test();}
}

 

cca6a8b7aa174b738e5391e9dd238e06.png

注意事项:

super关键字只能在非静态的函数(不被static修饰的函数)中使用。

 4.子类构造方法

常言道,先有爸爸再有儿子,所以在调用子类的构造方法时,我们要在子类的构造方法中用super关键字去调用父类的构造方法,否则编译器会报错

class Base{public Base(){System.out.println("调用了父类的构造方法");}
}
class Derive extends Base{public Derive(){super();System.out.println("子类的构造方法");}
}
public class Test {public static void main(String[] args) {Derive derive=new Derive();}
}

 

b563b39f124546719b9f77dd88214bae.png

如果父类和子类的构造方法都构成重载,我们会跟据创建对象时传的参数列表,进入子类中对应的构造函数,然后根据子类的构造函数中的super(......) 括号里的参数列表去调用父类中合适的构造方法。

class Base{public int a;public int b;public Base(){System.out.println("调用了父类的构造方法");}public Base(int a,int b){this.a=a;this.b=b;System.out.println("调用了父类中的有参构造方法");}
}
class Derive extends Base{public Derive(){super();System.out.println("调用了子类的构造方法");}public Derive(int a,int b){super(a,b);System.out.println("调用了子类的有参构造方法");}
}
public class Test {public static void main(String[] args) {Derive derive=new Derive(10,20);System.out.println("==================");Derive derive1=new Derive();}
}

5deaf4e6fbe34a8aa417946f2823dbaa.png

 

运行代码

 

9872a3eff9ee4a57ad8bfd8e2e6d61c9.png

注意事项:

1.如果我们没有在子类的构造方法中去调用父类的构造函数,编译器会自动默认子类的构造方法中调用了super()。

class Base{public int a;public int b;public Base(){System.out.println("调用了父类的构造方法");}
}
class Derive extends Base{public Derive(){//super();  没有写,但会默认有System.out.println("调用了子类的构造方法");}
}
public class Test {public static void main(String[] args) {Derive derive1=new Derive();}
}

d297ffb55c134e73869ca1316ec991a4.png

2.super(......)关键字必须位于子类的构造函数的第一行。

3.super(......)只能在子类的构造函数中出现一次,并且不能和this(......)同时出现。 

小总结----super与this的异同点

相同点:

1.super和this都是Java中的关键字。

2.都只能再非静态方法中使用,只能用来访问非静态成员变量和成员方法。

3.在构造方法中使用this和super关键字调用构造方法时,只能位于第一行,并且this(...)和super(...)不能同时存在

不同点:

1.this关键字当前对象的引用,当前对象即本类实例化的对象,super关键字是子类从父类继承的属性和方法的引用。

如下图:

11cfdef2f2c546abb6e382b0ec9ea959.jpeg

2.this关键字使用来调用本类的成员方法和成员变量,super关键字是用来调用父类的成员变量和成员方法。

3.在继承机制的构造方法中,一定存在super调用的构造方法,如果没写,编译器也会默认有。但是如果this(...)没写,那就没有。

5.再谈初始化

在Java中,代码块运行的顺序为静态代码块到实例化代码块再到构造代码块。

那父类和子类这3种代码块的运行先后是怎么样的呢?

我们直接来看代码

class Father{public int age;public Father(){System.out.println("父类的构造代码块");}{System.out.println("父类实例化代码块");}static {System.out.println("父类的静态代码块");}
}
class Son extends Father{public Son(){super();System.out.println("子类的构造代码块");}{System.out.println("子类的实例化代码块");}static {System.out.println("子类的静态代码块");}
}
public class Test {public static void main(String[] args) {Son son1=new Son();System.out.println("=======");Son Son2=new Son();}
}

运行代码

b053bcedb7c34b3fb5fb0ba4de683f73.png

得出结论:

1.先执行父类的静态代码块,再执行子类的静态代码块,并且只执行一次,因为静态代码块是再类的加载成功时运行的,而类的加载只进行一次。

2.执行完静态代码块,再先后执行父类的实例化代码块,父类的构造代码块,最后再分别先后执行子类的实例化代码块和构造代码块。

6.继承方式

再Java中,我们支持单继承,多层继承和不同的多个类继同时承一个类。但是不能一个类同时继承多个类。

如图

45941c1441fc4d8ab16a377b7ce8bf55.jpeg

7.final关键字

1.final修饰的成员变量无法被修改

2.final修饰的类无法被继承

3.final修饰的方法无法被重写 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

【贪心算法题目】

1. 柠檬水找零 这一个题目是一个比较简单的模拟算法,只需要根据手里的钱进行找零即可,对于贪心的这一点,主要是在20元钱找零的情况下,此时会出现两种情况:10 5 的组合 和 5 5 5 的组合,根据找零的特点&a…

网络模型-Qinq配置与应用

Qinq配置与应用 通过配置Qinq来实现利用公网提供的VLAN100使企业1互通,利用公网提供的VLAN200使企业2互通不同企业之间互相隔离。并通过在连接其它厂商设备的接口上配置修改0in0外层VLAN Tag的TPID值,来实现与其它厂商设备的互通。 一、创建VLAN #在Swi…

C - Sigma Problem(AtCoder Beginner Contest 353)

题目的链接: C - Sigma Problem (atcoder.jp) 题目: 样例: 题目大致含意: 给你n个数,让你对这n个数进行操作,比如当前是第i个,那么让a[i] 和 后面的每个数进行相加, 例如a[i] a[i 1] 注意的是a[i] a[i 1]的结果…

Stable Diffusion 3报告

报告链接:Stable Diffusion 3: Research Paper — Stability AI 文章目录 要点表现架构细节通过重新加权改善整流流量Scaling Rectified Flow Transformer Models灵活的文本编码器RF相关论文 引言 随着人工智能技术的飞速发展,文本到图像生成领域正经…

【map、set】C++用红黑树来封装map、set容器

🎉博主首页: 有趣的中国人 🎉专栏首页: C进阶 🎉其它专栏: C初阶 | Linux | 初阶数据结构 小伙伴们大家好,本片文章将会讲解map和set之用红黑树来封装map、set容器的相关内容。 如果看到最后您…

CasaOS系统玩客云安装内网穿透工具实现无公网IP远程访问

文章目录 前言1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 前言 2月底,玩客云APP正式停止运营,不再提供上传、云添加功能。3月初,有用户进行了测试,局域网内的各种服务还能继续使用&am…

kubeadm部署k8s v1.28

一、主机准备 主机硬件配置说明 作用IP地址操作系统配置k8s-master01192.168.136.55openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node01192.168.136.56openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node02192.168.136.57openEuler-22.03-LTS-SP12颗CPU 4G内存 50G…

C++: 多态

目录 一、多态的概念 二、多态的定义及实现 2.1虚函数 2.2虚函数的重写 2.3多态的构成条件 2.4虚函数重写的两个例外 1.协变 2.析构函数的重写 2.5虚函数重写的实质 2.6override 和 final(C11) 1.final 2.override 2.7重载、覆盖&#xff0…

Leetcode刷题笔记2:数组基础2

导语 leetcode刷题笔记记录,本篇博客记录数组基础1部分的题目,主要题目包括: 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 知识点 滑动窗口 所谓滑动窗口,就是不断的调节子序列的起始位…

反射获取或修改对象属性的值

利用反射既可以获取也可以写入,首先咱们先写几个获取的例子。 一:利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege" Dog dog = new Do…

Docker快速搭建Oracle服务

服务器:CentOS7.9 1.安装docker yum install -y docker 2. 设置镜像加速 修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值 阿里云的docker镜像需要自己注册账号,也可以不注册账号,直接使用下面的连接。 也可以写入多…

C语言 数组——计算最大值的函数实现

目录 计算最大值 计算最大值的函数实现 应用实例:计算班级最高分​编辑​编辑 返回最大值所在的下标位置 返回最大值下标位置的函数实现​编辑 一个综合应用实例——青歌赛选手评分​编辑​编辑​编辑​编辑​编辑 计算最大值 计算最大值的函数实现 应用实例&…

键盘盲打是练出来的

键盘盲打是练出来的,那该如何练习呢?很简单,看着屏幕提示跟着练。屏幕上哪里有提示呢?请看我的截屏: 截屏下方有8个带字母的方块按钮,这个就是提示,也就是我们常说的8个基准键位,我…

【蓝桥杯】

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using llunsigned long long; #define int ll const int N2e510; int k0; std::string s; int a,b,c,d; void solve() {char op;std::cin>>op;if(opA){std::string s;for(int i1;i&l…

Kafka-偏移量(含消费者事务)

Kafka概述 1.什么是偏移量&#xff1a; 在 Kafka 中&#xff0c;每个分区的消息都会被分配一个唯一的偏移量&#xff08;offset&#xff09;。偏移量简单来说就是消息在分区中的位置标识。 偏移量从 0 开始递增&#xff0c;每条消息的偏移量都会比前一条消息的偏移量大 1。 消…

如何对Linode Windows虚拟机进行“本地”访问

大部分时候&#xff0c;IT运维工作都可以远程进行&#xff0c;只要能通过网络访问被管理的系统&#xff0c;就可以执行几乎所有任务。如果因为某些原因导致无法通过网络访问呢&#xff1f;此时可能需要亲自到达相关硬件设备旁&#xff0c;通过“本地访问”来排错。 如果这些硬…

python实现520表白图案

今天是520哦&#xff0c;作为程序员有必要通过自己的专业知识来向你的爱人表达下你的爱意。那么python中怎么实现绘制520表白图案呢&#xff1f;这里给出方法&#xff1a; 1、使用图形库&#xff08;如turtle&#xff09; 使用turtle模块&#xff0c;你可以绘制各种形状和图案…

Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储

源码简介 这套系统是我从以前客户手里拿到的,100完整可用,今天测试防红链接失效了,需要修改防红API即可!前端页面展示我就不放了,懂的都懂 优点是Thinkphp开发的&#xff0c;二开容易。 源码图片 资源获取&#xff1a;Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短…

苹果MacOS系统使用微软远程桌面连接Windows电脑桌面详细步骤

文章目录 前言1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1.2 局域网远程控制windows 2. 测试Mac公网远程控制windows2.1 在windows电脑上安装cpolar2.2 Mac公网远程windows 3. 配置公网固定TCP地址 前言 日常工作生活中&#xff0c;有时候会涉及到不同设备不同操作系…

面了一个程序员,因为6休1拒绝了我

人一辈子赖以生存下去的主要就考虑三件事&#xff0c;职业&#xff0c;事业&#xff0c;副业&#xff0c;有其1-2都是很不错的。如果还没到40岁&#xff0c;那不妨提前想下自己可能遇到的一些情况&#xff0c;提前做一些准备&#xff0c;未雨绸缪些。 今年整体就业大环境也一般…