2021.12.22 对于JAVA继承性和多态性理解与记录(大数据笔记7)

P258-P269
继承:子类通过继承父类可以继承父类的方法和属性。
继承Key word: extends
代码块:

//假设person是父类
public class student extends person{}

如果父类中的属性和方法权限定义为private则子类无法直接调用。理论上,子类已经继承了这一部分属性和方法,但是由于封装性的问题无法使用。在JVM中,子类实例化的堆空间中,是存在父类的private类型的属性的。

对于private 类型的属性:我们可以通过public类型的方法间接调用,类如get(), set()。
对于private类型的方法:我们只能通过调用public类型的方法,其中使用过该private方法的方法,来实现间接调用,无权直接使用。

一个类只能继承一个父类;一个类可以被多个子类继承;一个类可以是子类也同时使父类;一个类可以得到直接父类和间接父类的全部属性和方法。

*Java.lang.object是所有的类的父类,如果类没有定义明确的父类,那么这个类将默认继承Object类。


P270-273
方法重写override/overwrite: 子类将继承父类中的方法进行重写。
1. 重写方法的方法名称,参数必须与父类相同。
2. 父类中private方法无法构成重写。(子类无权限读取,可视为构建一个新方法)
3. 重写权限必须大于等于父类方法权限


关于返回值:
1. 如果是primitive数据类型,则数据类型必须相同。
2. 如果是void类型,则数据类型为void。
3. 如果是索引类型,则数据类为A类或者A类的子类。
4. 抛出异常,同索引类。
5. 非static方法才可以参与重写。

P274-277
Super Key Word的调用:
Super关键字可以调用父类中的属性,构造器,以及方法。

public class person(){
    int age;
    String name;

    public person(){
        this.name = “w”;
        this.age = 20;
    }


    public void output(){
        System.out.println(“person”);
    }
}

public class student extends person{
    String major;

    Public student(){
        Super();//调用父辈构造器
        Super.age = 20;//调用父辈属性
        this.major = “cs”;
    }

    Public void ouput1(){
        super.output();//调用父辈方法
    }
}

注意:
1.    在调用父辈构造器的时候需要将super()放于构造器首行。
2.    This();与super(); 只能同时出现一个构造器。
3.    在未定义父辈中的属性时,构造器会默认调用Super();在构造器首行。

当子类实例化,在内存中内存的占用情况:
1.    子类继承的所有父类的属性在内存中都会加载。
2.    因为子类的构造器直接或者间接的调用super,所以会舒适化加载过的属性。


P278-284
类的多态性:
多态性前提:1. 有类的继承 2. 子类有父类的重写

Person people = new student();


本质上people是一个Person类的对象,其中的方法如果被student重写,则调用student的重写方法;并且people无法调用student特有的方法,因为本质上时Person类。

优势:虚拟方法调用。选用需求参数时可以使用父类代替子类,此时可以转换未所有的子类,提高代码的灵活性。

缺点:对象的多态性只适用于方法,不适用于属性。例, 调用people的属性依然会返回person的属性。

注意:
理论上, people在内存中是加载了student类特有的属性,由于多态性的缘故无法调用。

*强制类型转换(向下转型): 
Person People = new student();
Student student = (Student)people;

###个人理解:
在对象实例化中,
括号前面的类型告诉编译器当前索引的对象类型,
括号后面的类型是实际内存中存在的对象类型。
因此,Person People = new student(); 中, 编译器认为people是Person类型,但是实际内存中是Student类的数据,之所以可以调用是因为student类继承Person类,所以包含所有的Person类和方法。

在强制类型转换后,Student student = (Student)people;编译器承认student为Student类,所以可以再次调用自身的属性。

P285-291
类之间强制类型转换的失败原因分析为类本身并不是转换类型的类。(new后面的类)
我们在进行强制类型转换之前可以使用instanceof()方法进行判定。
Key word “instanceof”的使用:A  instanceof  A类, 如果成功返回true, 反之false。
*所有子类都可以判定为父类的实例。

即,

new student() instanceof Person == True;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值