java中的继承 (extends) 详解
大家好,又见面了,我是你们的朋友全栈君。
继承(extends)
1. 父类与子类
- 父类也叫基类、超类
- 子类也叫派生类
- 在继承的而关系中,“子类就是一个父类“。也就是说,子类可以被当做父类来看待。例如父类是员工,子类是老师,那么我们可以说**”老师就是一个员工“**。
2. 继承的格式
2.1 定义父类的格式:(一个普通的类定义)
public class 父类名称{
//.....
}
2.2 定义子类的格式
public class 子类名称 extends 父类名称{
//.....
}
2.3 代码演示(老师类继承员工类)
- 2.3.1 Employee类
public class Employee(){
public void method(){
System.out.println("方法执行")
}
}
- 2.3.2 Teacher类,继承自Employee类
public class Teacher extends Employee{
//我们先不在里面添加任何东西
}
- 2.3.3 在main中,创建一个Teacher类的对象
public class Main {
public static void main(String[] args) {
Teacher one = new Teacher();
//Teacher类继承了Empolyee类的方法
one.method();
}
}
/*输出结果: 执行方法 */
2.3.4 小结论
Teacher类继承了Employee类,也就继承了它的 public void method() 方法,达到了代码复用的效果,当父类有我们子类需要用的方法时,我们就不用再去重新打一次,直接可以拿来用。
3. 继承中成员变量的访问特点
3.1 成员变量之间的访问 (变量不重名的情况)
- 3.1.1 先创立一个父类Fu
public class Fu {
public int numFu = 10; //关键字为public,可以直接通过(对象.变量名)访问,方便说明问题
}
- 3.1.2 再创立一个子类Zi
public class Zi extends Fu{
public int numZi = 20;
}
- 3.1.3 在main中分别建立父类和子类的对象
public class Demo02ExtendsField {
public static void main(String[] args) {
//创建父类对象
Fu fu = new Fu();
//父类只能找到自己的成员numFu,并没有找到子类的成员numZi
System.out.println(fu.numFu);
//创立一个子类对象
Zi zi = new Zi();
//子类对象既可以打印父类的成员numFu,也可以打印自己的成员numZi
//还是那句"先人不知道后人的事情,而后人知道先人的事情"
System.out.println(zi.numFu);
System.out.println(zi.numZi);
}
}
3.2 成员变量之间的访问 (变量重名的情况)
有两种情况:
- 直接通过对象访问成员变量: 等号左边是谁,就优先用谁,没有则向上找
- 间接通过成员方法访问成员变量 该方法属于谁,就优先用谁,没有则向上找
第一种情况:直接通过对象访问成员变量
等号左边是谁,就优先用谁,没有则向上找。Fu fu = new Zi();
等号的左边是父类
public class Demo02ExtendsField {
public static void main(String[] args) {
// Zi zi = new Fu(); 不能通过父类来构造子类,先人(父类)根本不知道后人(子类)长什么样子
Fu fu = new Zi(); //可以通过子类来构造父类,这时等号左边是父类
System.out.println(fu.num); //10,打印的是父类的num
}
}
第二种情况:间接通过成员方法访问成员变量
public class Demo02ExtendsField {
public static void main(String[] args) {
Fu fu = new Fu();
Zi zi = new Zi();
//打印的是父类的num,因为该类没有继承其它类,他自己肯定有一个num,才能写出这个方法
fu.methodFu(); //父类的num 10,补充:没有fu.methodZi(), 先人不知道后人的方法
//如果子类有一个num,那就优先打印本类的,没有的话再往父类那里找
zi.methodZi(); //子类的num 20
//重点!子类用的是父类的方法打印num,这就要看这个方法属于谁,是谁定义的这个方法
//因为methodFu()这个方法是属于父类的,打印的当然就是父类的num
zi.methodFu(); //父类的num 10
}
}
4. 区分子类方法中的重名
假如有好多个num,父类有一个,子类有两个,怎么才能正确地打印想要的那个num呢?
5. 继承中成员方法重名的问题
假如子类和父类都有一个方法叫 method() , 那怎么知道用的是哪一个呢?
- 创建的对象是谁,用谁的类来构造对象的,就优先用谁,如果没有就向上找。比如
Fu fu2 = new Zi();
,fu2是用子类来构造的,那fu2.method()
就是用的子类的方法 - 注意!无论是成员变量还是成员方法,如果没有都是向上找父类,绝对不会向下找子类的。
6. 继承方法中的覆盖重写
由 5. 继承中成员方法重名的问题,我们可以引出重写(Override)的概念
重写:在继承关系中,方法的名称一样,参数列表也一样
7. 继承中构造方法的访问特点
7.1 概述
子类的构造方法启动时,一定会先跑去启动父类的构造方法,等父类的构造方法执行完后,再去执行子类(本类)的构造方法。
7.2 代码说明一下7.1
8. super关键字的三种用法总结
8.1 用法1
在子类的成员方法中,访问父类的成员变量,比如:
8.2 用法2
在子类的成员方法中,访问父类的成员方法,比如:
8.3 用法3
在子类的构造方法中,访问父类的构造方法。就在 7. 继承中构造方法的访问特点 中,请自行查阅。
9. this关键字的三种用法
9.1 概述
9.1.1 在本类的成员方法中,访问本类的成员变量 9.1.2 在本类的成员方法中,访问本类的另一个成员方法 9.1.3 在本类的构造方法中,访问本类的另一个构造方法
9.2 代码说明一下
public class Zi extends Fu {
private int num = 10;
public Zi(){
this(123); //9.1.3 在本类的无参构造中调用有参构造
}
public Zi(int num){
this.num = num;
}
public void methodZi(){
System.out.println(this.num); //9.1.1 在本类的成员方法中,访问本类的成员变量
}
public void methodA(){
System.out.println("A方法");
}
public void methodB(){
this.methodA(); //9.1.2 在本类的成员方法中,访问本类的另一个成员方法
System.out.println("B方法");
9.3 注意事项
- 在构造方法中调用this,那这个this调用必须是该函数中的第一个语句,也是唯一的一个
- super和this两种在构造调用中,不能同时使用。两个都要排在第一行,我哪知道该怎么排。
10. java继承的三个特点
10.1 java语言是单继承的
一个类的直接父类只能有唯一的一个。
class A{
}
class B extends A{
} 正确写法
class C{
}
class D extends A,C{
} 错误写法,不能同时继承A和C
试想假如class A{}有一个 method() 方法,
Class C{}也有一个 method() 方法,
子类D同时继承类A和类C,那当我新建一个D类对象d后,
对象d想要调用父类的method方法,那它应该用A的 method() 还是C的 method() 呢?这就乱套了!
10.2 java语言是可以多级继承的
虽然,java语言是单继承的,一个类的直接父类只有一个,类D不能同时继承类A和类C
但是,可以让类A继承类C之后,类D再继承类A,C就是爷爷,A就是爸爸,D就是儿子
类D –> 类A –> 类C,这就叫多级继承。
10.3 java语言中,一个父类可以有多个子类
这就好比二胎政策,一个爸爸可以有多个儿子
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160112.html原文链接:https://javaforall.cn
相关文章
- Java多线程详解_java支持多线程
- java解析xml方法_详解Java解析XML的四种方法
- java long string 转换_Java long 转成 String的实现[通俗易懂]
- fileinputstream java_Java FileInputStream close()方法
- java数组定义长度_JAVA数组的定义
- java 二维数组 arraycopy_Java对数组的复制[通俗易懂]
- java有什么作用_Java有什么用「建议收藏」
- java parrallel for,Java 8 parallel forEach进度指示
- java webservice 实例_Java WebService 简单实例(附实例代码)
- n皇后问题 回溯法java_Java解决N皇后问题
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )「建议收藏」
- Deep Java Library_java atomicinteger
- Java学习笔记之四java进制转化详解编程语言
- Java学习笔记之二java标识符命名规范详解编程语言
- Java程序员必备知识,《JAVA编程思想》包和访问权限详解编程语言
- Java继承详解编程语言
- Java实现MSSQL数据库连接(java连接mssql)
- eeOracle放弃Java EE:梦想的终结(oracle放弃java)
- Java远程登录Linux服务器入门指南(java远程linux)
- 使用Java实现Redis数据存储(redis集成java)
- java使用Weka、Linux和Java构建强大的数据分析系统(weka linux)
- 从Java应用程序中实现Oracle配置连接(java配置oracle)
- 数据库Java编程修改Oracle数据库的实践(java修改oracle)
- 项目Java项目中展现Redis新型性能优势(redis运用在java)