class Animal
{
private int weight;
public Animal()
{System.out.println("Animal(): "+this);
this.weight=20;}
public int getWeight()
{
return this.weight;
}
public void setWeight(int w)
{
this.weight=w;
}
}
class Dog extends Animal
{ public Dog()
{
System.out.println("Dog(): "+this);
//this.weight=20;
}
/**
*子类新增方法
*/
public void Bark()
{
System.out.println("Wang~~Wang~~~");
}
}
public class MyDog{private static Animal myAnimal;public static void main(String args[])
{
myAnimal=new Dog();
运行结果:
第一条运行结果调用的是父类的构造方法,但是传递的是子类对象的哈希地址。所以创建子类对象不会创建父类对象。同理,父类是抽象类也不会创建父类对象。
在这段代码中,一加载主类,在方法区的数据区的静态数据开辟了一个变量空间,名字叫myAnimal,类型是Animal,有一个确切的值null,同时得把Animal.class文件加载到方法区。jdk执行主方法,创建子类对象,并调用了父类的构造方法,在堆里头为父类的私有属性weight开辟空间,接着子类对象开辟空间,没有属性,为新增的方法开辟空间。调用父类的构造方法,传递子类对象的地址,而这个方法是和父类动态绑定的。其实是先在子类对象找有没有weight属性,没有找到通过在父类构造方法里找与父类绑定并且和当前对象关联的weight属性,找到以后往里赋值。
继承是由已经有的类创建新类,java中只支持单继承,不支持多重继承,如果想实现多继承可以通过接口的方式实现。语法是:子类extends父类