Java 中的继承规则:

1.子类继承父类所有的成员变量和成员方法,但是不能继承父类的构造方法。

2.子类虽然继承了父类的成员变量,但是子类不能直接访问父类的私有变量,可以通过getter/setter()方法进行访问

3.子类对父类构造函数的调用规则:

a.子类的构造方法首先必须调用父类的构造方法。

b.如果没有显示指定,子类的构造方法会默认的调用父类中的无参构造方法,

 1 public class Animal {
 2     public Animal() {
 3         System.out.println("This is a constructor for Animal");
 4     }
 5 }
 6 
 7 public class Dog extends Animal {
 8     private String name;
 9     
10     public Dog() {
11         System.out.println("This is a constructor for Dog");
12     }
13     
14     public Dog(String name) {
15         this.name = name;
16         System.out.println("This is a constructor for "+this.name);
17     }
18 }
19 
20 public class Test {
21     public static void main(String args[]) {
22         Dog d1 = new Dog();
23         
24         Dog d2 = new Dog("Big Yellow");
25     }
26 }

最后运行结果如图所示:

                       

表明子类虽然没有显示的调用父类构造方法,但是会默认调用父类的无参构造方法。

c.如果父类中没有无参的构造方法,则编译会出错。对以上程序稍作修改:

public class Animal {
    public Animal(String s) {
        System.out.println("This is a constructor for Animal");
    }
}

public class Dog extends Animal {
    private String name;
    
    public Dog() {
        System.out.println("This is a constructor for Dog");
    }
    
    public Dog(String name) {
        this.name = name;
        System.out.println("This is a constructor for "+this.name);
    }
}

把父类Animal中的无参构造方法改成有参数的构造方法,则出错。

d.如果父类中有多个构造方法,可以使用super(参数列表)来调用父类构造方法。

例如把以上子类中的构造方法显式的添加为父类有参构造方法,则程序编译通过。

public class Animal {
    public Animal(String s) {
        System.out.println("This is a constructor for Animal");
    }
}

public class Dog extends Animal {
    private String name;
    
    public Dog() {
        super("aaa");
        System.out.println("This is a constructor for Dog");
    }
    
    public Dog(String name) {
        super("bbb");
        this.name = name;
        System.out.println("This is a constructor for "+this.name);
    }
}
View Code

总之,无论如何,子类都首先必须调用父类的构造方法,切记~~

 

posted on 2014-11-05 20:59  beyond_Acm  阅读(138)  评论(0编辑  收藏  举报