java 继承的本质

继承的本质

ExtendsTheory.java

public class ExtendsTheory{
	public static void main(String[] args){
		Son son = new Son();  // 内存的布局
	}
}

class GrandPa{                // 爷类
    String name = "大头爷爷";
    String hobby = "旅游";
}

class Father extends GrandPa{   // 父类
    String name = "大头爸爸";
    int age = 39;
}

class Son extends Father {   // 子类
    String name = "大头儿子";
}

创建子类先加载的是类,类看继承关系,先加载 Object 然后 GrandPa ...

随后在堆中分配空间,对象将地址返回给主方法的对象引用。


当子类的 son 去访问对象的属性的规则:

ExtendsTheory.java

public static void main(String[] args){
	Son son = new Son();  // 内存的布局
    System.out.println(son.name); // 返回大头儿子
    System.out.println(son.age);  // 返回继承的父类 age
    System.out.println(son.hobby);  // 返回继承的爷类 hobby
}

访问 son.name 按照查找关系来访问信息。

  • 规则:
    • 首先看子类中是否有该属性
    • 如果子类有该属性并且可以访问则返回信息
    • 如果子类没有这个属性就看父类有无这个属性,当父类有并且可以访问就访问该书属性
    • 如果父类也没有就按照父类的规则继续往上查,直到 Object 没有的话会报错。
G:\java\继承>java ExtendsTheory
大头儿子
39
旅游

如果

class Father extends GrandPa{   // 父类
    String name = "大头爸爸";
    private int age = 39;
}

private 有在创建对象的时候,在内存中是有的,只是不能访问,需要设置一个公共的方法。

...
		Son son = new Son(); 
		System.out.println(son.getage());
...

... ...

class Father extends GrandPa{   // 父类
    String name = "大头爸爸";
    private int age = 39;
    
    public int getage(){
        return age;
    }
}

... ...

发现调用的是私有的属性会报错,不会在向上找一个爷类的公有的age 。

posted @ 2024-05-06 16:05  takenika  阅读(12)  评论(0)    收藏  举报