你一定要学会的Java语法 -- 【继承】

书接上回,我们已经学完了类和对象,今天内容可能有一点难,相信自己能跨过这道坎。


目录

一. 继承

1.什么是继承 

2. 继承的概念

3. 继承的语法

4.父类成员访问

子类和父类成员变量同名

 子类和父类成员方法同名

5.super关键字 

6.子类构造方法  

 7.super和this 

【相同点】

【不同点】

8.深入了解初始化 

 9.protected关键字

10.继承方式

11.final关键字

12.继承与组合 


一. 继承

1.什么是继承 

    看字面意思,让我们想到了电视剧中的那些大户人家,家族的后代,会继承家族的资产。那问题来了,java中的继承是什么呢 ?请看下文,让我们来揭开他的神秘面纱。

2. 继承的概念

继承机制 :是面向对象程序设计使代码可以复用的重要手段,主要解决了:共性的抽取,来实现代码的复用

什么时候要用继承,该怎么用呢?

3. 继承的语法

在java中如果要表示类之间的继承关系,需要借助extends 关键字,具体实现如下。

如果说我们要描述,猫和狗,它们都是一种动物,肯定会有共同特点。借助继承我们可以写出如下代码。 

class Animal{public String name;public int age;public String color;public void eat(){System.out.println(this.name+" 正在吃饭....");}public void sleep(){System.out.println(this.name+" 正在睡觉....");}
}
class Dog extends Animal{public void bark(){System.out.println(this.name+" 正在汪汪叫....");}
}
class Cat extends Animal{public void mew(){System.out.println(this.name+" 正在喵喵叫....");}
}
public class test {public static void main(String[] args) {Dog dog = new Dog();  
// dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的dog.name = "旺财";dog.eat();dog.sleep();dog.bark();System.out.println("=======");Cat cat = new Cat();cat.name = "花花";cat.eat();cat.sleep();cat.mew();}
}

运行结果:

通过运行结果我们发现,我们根本就没有在Dog这个类里面定义name,age,但是可以访问,原因就是这些都是从Animal这个类当中继承下来的。

 注意:

  • 1. 子类会将父类中的成员变量或者成员方法继承到子类中了
  • 2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

  上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可

【结论】:子类继承了父类之后,子类就可以使用父类的成员变量和成员方法。 通过代码和图片能看出继承最大的作用就是:实现代码复用

4.父类成员访问

大家都知道,在继承体系中子类将父类的方法字段继承下来,子类能直接访问父类,那子类和父类的名字一样呢?

子类和父类成员变量同名

class Base{public int a = 1;public int b = 2;
}
class Derived extends Base{public int a = 10;public int b = 20;public void print(){System.out.println(a);System.out.println(b);}
}
public class Main {public static void main(String[] args) {Derived derived = new Derived();derived.print();}
}

运行结果:

 子类和父类成员方法同名

class methodA{public void print(){System.out.println("父类的print方法");}
}
class methodB extends methodA{public void print(){System.out.println("子类的print方法");}
}
public class test1 {public static void main(String[] args) {methodB methodB = new methodB();methodB.print();}
}

运行结果: 

 

 【总结】:成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类找,父类也没有就报错。

那问题是,如果我们想访问父类的成员呢?

5.super关键字 

 在有些场景下,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成
员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

class Base{public int a = 1;public int b = 2;
}
class Derived extends Base{public int a = 10;public int b = 20;public void print(){System.out.println(super.a);System.out.println(super.b);}
}
public class Main {public static void main(String[] args) {Derived derived = new Derived();derived.print();}
}

 运行结果:

 在子类中,如果想要明确访问父类中的成员是,借助super关键字即可。

【注意事项】

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

6.子类构造方法  

  子类对象构造时,需要先调用父类的构造方法,然后执行子类的构造方法(可以理解成先有父后有子)。 

 

运行结果:

一个小栗子

class Animal{public String name;public int age;public void eat(){System.out.println(this.name+" 正在吃饭....");}public Animal(String name, int age) {this.name = name;this.age = age;}
}
class Dog extends Animal{public String color;public Dog(String name, int age, String color) {//调用父类的,带有两个参数的构造方法,来初始化父类当中的成员super(name,age); //在子类成员初始化完成之前要帮父类完成初始化this.color = color;}public void bark(){System.out.println(this.name+" 正在汪汪叫....");}
}
public class test2 {public static void main(String[] args) {Dog dog = new Dog("阿黄",2,"白色");}
}

注意事项:

  •  1.若父类定义无参或者默认的构造方法,在子类构造方法的第一行默认有隐含的super。
  • 2.在子类构造方法中,super( )调用父类构造时,必须在子类构造函数的第一条语句。
  • 3.super( )只能在子类构造方法中出现一次,并且不能和this( )同时出现。

 7.super和this 

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

【相同点】

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

【不同点】

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

8.深入了解初始化 

我们知道在没有继承关系时执行顺序是: 静态代码块 >  实例代码块  >  构造代码块

那在继承关系上的执行顺序呢?

class Person{public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;System.out.println("父类的构造方法");}{System.out.println("父类的实例");}static {System.out.println("父类的静态方法");}
}
class Student extends Person{public Student(String name, int age) {super(name, age);System.out.println("子类的构造方法");}{System.out.println("子类的实例");}static {System.out.println("子类的静态方法");}
}
public class test3 {public static void main(String[] args) {Student student1 = new Student("张三",18);System.out.println("==========");Student student2 = new Student("李四",19);}
}

运行结果:

 结论:

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

 9.protected关键字

在类和对象章节中,为了实现封装特性,Java中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问。
 protected叫做受保护的

1.同一个包同一个类可以访问。

2. 同一个包的不同类可以访问。

3.不同包的子类可以访问(请看下图)。

10.继承方式

Java支持以下几种继承方式

1.单继承,2.多层继承,3.不同类继承同一类

Java中不支持多继承 

 建议类之间的继承关系层次不要太复杂,一般我们不希望超过三层的继承关系。

11.final关键字

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

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

 2. 修饰类:被final修饰的类称为密封类,代表该类不能被继承。

 3. 修饰方法:表示该方法不能被重写(后序介绍)

12.继承与组合 

 和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法(诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。

 继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
 组合表示对象之间是has-a的关系,比如:汽车

 汽车和其轮胎、发动机、方向盘、车载系统等的关系就应该是组合,因为汽车是有这些部件组成的。

 

 组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用、组合

好啦今天的分享就到这里啦,下期分享多态! 

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

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

相关文章

实操创建属于自己的亚马逊云科技VPS服务:Amazon Lightsail

本文主要讲述如何独立创建自己的亚马逊云科技VPS服务,希望此文能帮助你对亚马逊云科技VPS服务也就是Amazon Lightsail,有个新的认识,对所使用的VPS有所帮助。 Amazon Lightsail是一款无论云计算的新手还是专家,都可通过其快速启动…

MSF图形化工具Viper快速安装

简介 Viper(炫彩蛇)是一款图形化内网渗透工具,将内网渗透过程中常用的战术及技术进行模块化及武器化. Viper(炫彩蛇)集成杀软绕过,内网隧道,文件管理,命令行等基础功能. Viper(炫彩蛇)当前已集成70个模块,覆盖初始访问/持久化/权限提升/防御绕过/凭证访问/信息收集/横向移动等…

Java图像编程之:Graphics

一、概念介绍 1、Java图像编程的核心类 Java图像编程的核心类包括: BufferedImage:用于表示图像的类,可以进行像素级的操作。Image:表示图像的抽象类,是所有图像类的基类。ImageIcon:用于显示图像的类&a…

网络爬虫代理ip有什么好处?爬虫工作使用代理IP有哪些优势?

在爬虫工作中,使用代理IP有很多好处,可以帮助爬虫程序更加高效地完成任务。以下是使用代理IP的几个优势: 1. 增加匿名性 使用代理IP可以隐藏爬虫程序的真正IP地址,增加匿名性,避免被目标网站封禁。通过代理IP&#xff…

ida81输入密码验证算法分析以及破解思路

本文分析了ida81对输入密码的验证流程,分别对输入密码到生成解密密钥、密码素材的生成过程以及文件数据的加密过程这三个流程进行分析,并尝试找一些可利用的破绽。很遗憾,由于水平有限,目前也只是有个思路未能完全实现&#xff0c…

【中间件篇-Redis缓存数据库02】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis高级特性和应用(慢查询、Pipeline、事务、Lua) Redis的慢查询 许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关…

微信聊天,收到二维码图片就自动帮你提取出来的方法

10-3 如果你是二维码收集的重度用户,那我非常推荐你好好阅读本文,也许可以帮你解决你的问题,比如做网推的人,需要常年混迹在各种微信群,那如何在各个微信群中收集到群友分享出来的二维码,并且要立即保存出…

故障诊断模型 | Maltab实现ELM极限学习机的故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现ELM极限学习机的故障诊断 模型描述 在机器学习领域,我们常常需要通过训练数据来学习一个函数模型,以便在未知的数据上进行预测或分类。传统的神经网络模型需要大量的参数调整和…

计算机毕业设计选题推荐-校园交流平台微信小程序/安卓APP-项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

9.spark自适应查询-AQE之动态调整Join策略

目录 概述动态调整Join策略原理实战 动态优化倾斜的 Join原理实战 概述 broadcast hash join 类似于 Spark 共享变量中的广播变量,Spark join 如果能采取这种策略,那join 的性能是最好的 自适应查询AQE(Adaptive Query Execution) 动态调整Join策略 原…

简单漂亮的登录页面

效果图 说明 开发环境&#xff1a;vue3&#xff0c;sass 代码 <template><div class"container"><div class"card-container"><div class"card-left"><span><h1>Dashboard</h1><p>Lorem ip…

Python 的 datetime 模块

目录 简介 一、date类 &#xff08;一&#xff09;date 类属性 &#xff08;二&#xff09;date 类方法 &#xff08;三&#xff09;实例属性 &#xff08;四&#xff09;实例的方法 二、time类 &#xff08;一&#xff09;time 类属性 &#xff08;二&#xff09;tim…