abstract class Person 
{
private String name;
public void  setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public Person()
{
System.out.println("嘎嘎嘎!!!");
}
public Person(String name)
{
this.setName(name);

} public void say()
{
System.out.println("注意:"+this.getContent());
} abstract String  getContent();
} class Worker extends Person
{
private float salary;
public void setSalary(float salary)
{
this.salary=salary;
}
public float getSalary()
{
return this.salary;
} public Worker()
{
System.out.println("哈哈哈!!!");
}
public Worker(String name,float salary)
{
super(name);
this.setSalary(salary);
this.say();

} public String getContent()
{
return "Worker 说话了"+super.getName()+this.getSalary();
}
} class Student extends Person
{
public String getContent()
{
return "Student 说话了";
}}public class Test1
{
public static void main(String args[])
{
Person p=null;

p=new Worker();
//w.say();

}
}
请问上面的代码为什么执行后是这个呢?
嘎嘎嘎!!!
哈哈哈!!!
而不是:子类中的
哈哈哈!!!

解决方案 »

  1.   

    因为在实例化子类的时候,自动调用了父类的构造方法
    public Person() 

    System.out.println("嘎嘎嘎!!!"); 
      

  2.   

    看看java的三大特性就知道了
      

  3.   

    因为你的Worker类继承了Person类,在调用new Worker()生成子类对象时,会先调用父类Person的构造函数,再调用子类Worker的构造函数,看看继承吧
      

  4.   

    因为worker类继承了Person类,Person p=null;p=new Worker(); 这句话是父类的引用指向了子类的对象,所以要先执行父类的构造函数,然后再调用子类的构造函数,所以就出现这个结果了,这是java面向对象技术中的继承的特性
      

  5.   

    不管是Person p=null; p=new Worker(); 
    还是
    Worker worker = new Worker();
    都会调用父类的构造函数,你不写会默认的调用super();
    有参的构造函数尤其要注意,有时你必须写super(something...);