写出下面程序的运行结果是什么?
public class Dervied extends Base {
private String name = "dervied";
public Dervied() {
//super(); //调用父类的方法,相当于在父类中是父类的引用调用子类的对象
//在父类的构造方法中打印this //sysout(this); /this.getClass()
//结果class com.persist.test.bigdata.day12.Dervied
//成员变量是由引用确定的,方法是通过动态绑定确定的
tellName();
printName();
}
public void tellName() {
System.out.println("Dervied tell name: " + name);
}
public void printName() {
System.out.println("Dervied print name: " + name);
}
public static void main(String[] args){
new Dervied(); // ①
// 1.执行父类的构造方法 2.给自己的成员变量赋值 3。调用构造方法中的调用的方法
}
}
class Base {
private String name = "base";
public Base() {
tellName();
printName();
//sysout(this);
}
public void tellName() {
System.out.println("Base tell name: " + name);
}
public void printName() {
System.out.println("Base print name: " + name);
}
}
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied
为了解释这个程序,首先需要澄清一个概念,java对象是由构造器创建的吗?很多书籍,资料中会说是,但实际情况是:构造器只负责对java对象实例变量执行初始化,在执行构造器之前,该对象所占的内存已经被分配下来了,这些内存的值都默认是空值 ——对与基本类型的变量,默认的空值是0或者是false,对于引用类型而言就是null;当程序执行①代码时,系统先为Derived对象分配内存空间,有两块内存空间分别存放Derived对象的两个i实例变量,一个是属于Base的一个是Derived的,此时这两个i实例变量的值都是0。