继承
基本概念:
继承是面向对象三大特征之一。
当我们创建很多JavaBean类时,会产生大量的重复的属性和方法。我们可以把重复的内容放在一个父类里面,继承给子类即可。
继承就是类与类之间的一种父子关系。
在Java里面提供了一个关键字 extends,使用这个关键字就可以让一个类与另一个类建立联系。
格式:“```public class ZI extends FU(){ }```”
Zi 就是子类 Fu就是父类
继承的好处:
可以把多个子类重复的代码抽取到父类里面,提高了代码的复用性。
子类在父类的基础上功能更加齐全,使子类更强大。
当类与类之间,存在(相同)共性的内容,就考虑去使用继承。
继承的特点
一.Java只能单继承,不能多继承,可以多层继承。
单继承:一个子类只能继承一个父类
不能多继承:一个子类不能同时继承多个父类。
多层继承:子类A继承父类B 父类B继承父类C 。
多层继承里面:
A与B是直接继承,B与C是直接继承,A与C是间接继承。
在Java有一个最大的父类Object。所有子类都直接或者间接继承他。
到底继承了什么
继承中的访问特点
成员变量的访问特点:
成员变量的访问遵循就近原则:谁离我近,我就会访问谁。
class Fu{
String name="Fu";
}
class Zi extends Fu{
String name="Zi";
public void ziShow(){
String name="ZiShow";
System.out.println(name);
}
}
当我们对ziShow进行调用时 会打印"ZiShow";
如果我们删除 String name="ZiShow"; 就会打印Zi。
如果我们在此基础上再删掉 String name="Zi"; 就会打印Fu。
如果不想删除还想打印Zi Fu呢
class Fu{
String name="Fu";
}
class Zi extends Fu{
String name="Zi";
public void ziShow(){
String name="ZiShow";
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
此时我们会用到this super(后面会讲)。这样控制台就会依次打印"ZiShow" "Zi" "Fu"。
小结
成员方法的访问特点
同成员变量的访问特点一样:遵循就近原则。
这里涉及方法的重写可以去看:《重载与重写》 juejin.cn/post/729568…
构造方法的访问特点:
父类中的构造方法无法被子类继承
子类中的构造方法先访问父类中的无参构造,再执行自己。(原因是:子类在初始化的时候,有可能会用到父类的数据,如果父类没有完成初始化,子类无法使用父类的数据。子类初始化之前,一定要调用父类的构造方法完成父类数据空间的初始化)
所以子类的构造方法第一句默认会有super(); 如果自己不写,虚拟机就会自动添加。如果写了,必须写在第一行 ,只能默认加在空参构造上。
如果想访问父类的有参构造
直接在子类的super()按照参数顺序填写即可。
小结
多态
基本概念
多态是面向对象的三大特征之一
多态(多态就是对象的多种形态)的前提条件是继承
如果我们创建一个父类Person 两个子类 Student 和 Teacher
就可以有两种创建对象的方法。
多态的前提:有继承/实现关系
有父类对象引用指向子类对象。
有方法的重写
多态的好处 :使用父类型作为参数,可以接收所有子类对象,
体现了多态的扩展性与便利。
多态调用的特点
变量调用:编译看左边,运行也看左边:
理解:编译看左边:javac编译的时候会看右边的类有没有该变量,如果有,编译成功,反之:编译失败。运行也看左边:java在运行代码的的时候,实际获取的就是左边父类成员变量的值。
方法调用:编译看左边,运行看右边:
理解:编译看左边javac编译的时候会看右边有没有该方法,如果有,编译成功,反之:编译失败。运行看右边:java运行的时候实际运行的是子类的方法。
变量与方法有不同,究其原因是方法进行了重写。
隐式转换和显示转换:
隐式转换:小的自动推导成为大的:如byte->short->int->long->float->double。 比如 byte a=0; int b=4; sum=a+b;就发生隐式转换,a由byte转换int
显式转换:也就是强制类型转换,需要自己手写的: 比如 double a=1.1 int b=1 c=(int)a+b; 此时double类型的a强制类型转换为int类型导致精度缺失。这也是强制类型转换最大的问题。
多态的优点缺点
优点:
缺点:
父类不能使用子类特有的功能
解决方案:把父类类型变回子类类型:
instanceof关键字:可以判断变量的对象是不是一个类的类型,返回值是布尔类型。
演示:变量名 instanceof 类名