Java继承和Super

一、继承的一些细节

  1. 子类继承所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有的属性和方法不能在子类直接访问,要通过父类提供的公共方法去访问。
  2. 子类没有继承父类的构造器,但必须调用父类的构造器,完成父类的初始化。
  3. 当创建子类对象时,不管使用子类的哪一个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类构造器中用super去指定使用父类的哪一个构造器完成对父类的初始化。
  4. 如果希望指定去调用父类的某一个构造器,需要显性调用super(形参列表)。
  5. super在使用时候,必须放在第一行,super只能在构造器中使用。super()和this()只能放在第一行,所有二者不能共存一个构造器。
  6. Java所有类都是Object类的子类。父类构造器的调用会一直追溯到Object类。
  7. 子类最多只能直接继承一个父类(但是可以C继承B,B继承A)。
  8. 子类和父类要有逻辑关系。

二、JVM的内存:内存的继承布局

对象引用:在 Java 中,对象的引用是指向堆中对象的"指针"。在栈内存中存储的是对象引用(类似C的指针),而不是对象本身。当使用 new 关键字创建一个对象时,返回的是对象在堆中的地址,这个地址被存储在栈中的引用变量中。

内存继承图解

  1. 按程序运行先new一个Son对象,就必须先加载Son的父类是Father,就必须先加载Father的父类GrandPa,以此类推就必须先加载顶层父类Object,所以方法区类信息的加载顺序 Object --> Grandpa --> Father --> Son(加载的类之间有继承关系)。
  2. 在堆中开辟一块空间给GrandPa存放他的属性name和hobby,而”大头爷爷“、”旅游“是字符串常量,存放在常量池中,所以堆中存放的是常量的引用,并指向常量池中的字符串常量。
  3. 同上一步在0X11加载出Father的常量的引用,需要注意的是:虽然爷类和父类都有name属性,但是二者不冲突,可以认为是0X11又在内部开辟了空间。age属性由于是基本数据类型,就在堆中直接生成了。儿子的属性的加载同上。

🆗,程序开始运行

  1. 程序开始运行Son son = new Son() ,第一步是加载属性的类(即 Object --> Grandpa --> Father --> Son)。
  2. 在堆里分配空间0X11,并加载各种属性。
  3. 加载完成后把堆里空间0X11返回给主方法里的son对象引用。

son的访问规则(重点)

public class Extends_ {
    public void main(String[] args) {
        Son son = new Son();
        System.out.println(son.name);//输出大头儿子
        System.out.println(son.age);//输出39
        System.out.println(son.hobby);//输出旅游
    }
    class GradPa {
        String name = "大头爷爷";
        String hobby = "旅游";
    }
    class Father extends GradPa {
        String name = "大头爸爸";
        int age = 39;
    }
    class Son extends Father {
     String name = "大头儿子";
    }
}

通过对象引用访问实例成员属性,要按照查找关系来返回信息,如下:
(1)首先看子类是否有该属性;
(2)如果子类有这个属性,并且可以访问,则返回信息;
(3)如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息;
(4)如果父类没有就按照(3)的规则,继续找上级父类,直到 Object;


三、Super

super代表父类的引用,用于访问父类的属性、方法、构造器

1.基本语法

  1. 访问父类的属性,但不能访问父类的private属性。
    super.属性名;
  2. 访问父类的方法,不能访问父类的private方法。
    super.方法名(参数列表):
  3. 访问父类的构造器:只能放在构造器的第一句,只能出现一句!
    super(参数列表);

2.细节

  1. 调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
  2. 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问是一样的效果!
  3. super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A(本)->B(父)->C(爷)
  4. super不能在静态上下文中使用。因为super关键字指的是当前对象的父类部分,而静态方法和静态变量是属于类本身的,不依赖于具体的对象实例,所以在静态方法或静态上下文中无法使用super关键字。
  5. super和this的比较
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值