继承与多态

308 阅读4分钟

继承

基本概念:

继承是面向对象三大特征之一。
当我们创建很多JavaBean类时,会产生大量的重复的属性和方法。我们可以把重复的内容放在一个父类里面,继承给子类即可。
继承就是类与类之间的一种父子关系。
在Java里面提供了一个关键字 extends,使用这个关键字就可以让一个类与另一个类建立联系。
格式:“```public class ZI extends FU(){ }```”
Zi 就是子类   Fu就是父类

继承的好处:

可以把多个子类重复的代码抽取到父类里面,提高了代码的复用性。
子类在父类的基础上功能更加齐全,使子类更强大。

当类与类之间,存在(相同)共性的内容,就考虑去使用继承。

继承的特点

一.Java只能单继承,不能多继承,可以多层继承。

单继承:一个子类只能继承一个父类

不能多继承:一个子类不能同时继承多个父类。

多层继承:子类A继承父类B 父类B继承父类C 。

   多层继承里面:
   AB是直接继承,B与C是直接继承,A与C是间接继承。

在Java有一个最大的父类Object。所有子类都直接或者间接继承他。

到底继承了什么

image.png

继承中的访问特点

成员变量的访问特点:

成员变量的访问遵循就近原则:谁离我近,我就会访问谁。

 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"。

小结

image.png

成员方法的访问特点

同成员变量的访问特点一样:遵循就近原则。

这里涉及方法的重写可以去看《重载与重写》  juejin.cn/post/729568…

构造方法的访问特点:

父类中的构造方法无法被子类继承

子类中的构造方法先访问父类中的无参构造,再执行自己。(原因是:子类在初始化的时候,有可能会用到父类的数据,如果父类没有完成初始化,子类无法使用父类的数据。子类初始化之前,一定要调用父类的构造方法完成父类数据空间的初始化

所以子类的构造方法第一句默认会有super(); 如果自己不写,虚拟机就会自动添加。如果写了,必须写在第一行 ,只能默认加在空参构造上。

如果想访问父类的有参构造

image.png

直接在子类的super()按照参数顺序填写即可。

image.png

小结

image.png

多态

基本概念

多态是面向对象的三大特征之一 
多态(多态就是对象的多种形态)的前提条件是继承

如果我们创建一个父类Person 两个子类 Student 和 Teacher

image.png 就可以有两种创建对象的方法。

多态的前提:有继承/实现关系
           有父类对象引用指向子类对象。
           有方法的重写
 多态的好处 :使用父类型作为参数,可以接收所有子类对象,
             体现了多态的扩展性与便利。

多态调用的特点

变量调用:编译看左边,运行也看左边:

理解:编译看左边: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类型导致精度缺失。这也是强制类型转换最大的问题。

多态的优点缺点

优点:

image.png 缺点: 父类不能使用子类特有的功能 解决方案:把父类类型变回子类类型: instanceof关键字:可以判断变量的对象是不是一个类的类型,返回值是布尔类型。

演示:变量名 instanceof 类名