子类继承自父类的属性,独属于子类
定义父类Animal
public class Animal {
String name = "动物";
Food food = new Food();
}
定义子类Cat
public class Cat extends Animal{
String info = "我是小猫";
}
定义子类Dog
public class Dog extends Animal{
String info = "我是小狗";
}
定义父类引用类型成员Food
public class Food {
String info = "我是食物";
}
子类继承父类,并修改自父类的属性name
public class Test_main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "猫咪";
Dog dog = new Dog();
System.out.println(dog.name);
System.out.println(cat.name);;
}
}
运行结果:可以看到,子类Dog继承自父类的属性name值,并没有因子类Cat的改动而改变
输出子类继承自父类引用类型的成员
public class Test_main {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
System.out.println(cat.food);
System.out.println(dog.food);
}
}
运行结果:可以看到,二者所继承的对象并不是同一个
子类继承自父类的方法,所有子类共享
这个只能说说自己的理解,能力不够,没法测试:
-
父类的class字节码文件被加载进方法区,方法区是所有线程共享,而子类和父类有继承关系,因此子类可以在方法区调用父类class字节码,即执行里面的父类方法代码。
-
之所以执行父类的方法,是因为子类当中并没有对这个方法进行重写,即子类的字节码文件中,并没有目标方法代码,进而只能去父类的字节码文件中去寻找
-
所以,父类的方法,所有子类共享【前提:子类并未对该方法重写】
猜测
- 子类的构造方法会默认调用父类的构造方法,因此在new子类时,会导致父类的字节码文件被加载进方法区。
- 子类对象创建时,同时会创建其继承自父类的所有非静态属性,以及自身类中定义的属性,即使二者属性名一致,也会创建两个属性,但调用方式不同,本类属性调用方式属性名 | this,父类属性调用方式super
- 构造方法的调用会导致类加载至方法区,假设构造方法的执行会导致类的实例化,如子类构造调用父类构造,创建了父类对象,但是这个父类对象并没有被引用指向,也就是一个无法访问到的对象,因此被创建后立马又被回收。
- 假设构造方法的执行不会导致类的实例化,那么构造方法中应该还有一行“隐式代码”,用以告知JVM我需要创建这个对象,而由super调用的构造方法并不存在这行“隐式代码”,因此也就不会创建父类对象
- 能确定的是:子类对象的创建,并不会导致父类对象的创建。
**PS:**欢迎指点