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); } }
总之,无论如何,子类都首先必须调用父类的构造方法,切记~~