继承
Java中子类与父类的继承通过关键字 extends 来实现 ,例如,定义一个父类Person :
class Person {
private String name ;
private int age ;
public String getName() {} ;
public void setName(String name) {};
public int getAge() {};
public void setAge(int age) {};
}
class Student extends Person {
//对继承的字段和方法不要重复 ;
//只需要定义新增score字段/方法 ;
private int score ;
public int getScore() {} ;
public void setScore(int score) {} ;
}
但是 , 值得注意的是 , 即使子类继承了private字段或者private方法 , 但是子类却无法访问它们 。因为用private修饰的字段和方法 , 只允许在类内部被访问(即实例对象的内部被访问):
class Person {
private String name ;
private int age ;
}
class Student extends Person {
public String hello() {
return "Hello , "+name ; //编译错误:无法访问name字段 ;
}
}
这使得继承的作用被削弱了。为了让子类可以访问父类的字段 , 可以把修饰符private改为protected。用protected关键字可以把字段和方法的访问权限控制在继承树的内部,一个protected的字段和方法可以被其子类,以及子类的子类所访问 :
class Person {
protected String name ;
protected int age ;
}
class Student extends Person {
public String hello {
return "Hello,"+name ; //可以正常编译通过 ;
}
}
每个子类构造方法的第一条语句都是调用父类的构造方法,以便对从父类继承下来的字段进行合乎规范的初始化(这种规范就是父类构造函数),并且也是对父类构造函数代码的高效复用,分为几种情况 :
- 开发者没有显示的使用super关键字调用父类的构造函数,那么编译器将自动在子类构造函数的第一行添加空参数的super()语句,这种情况下 , 可能就会出现编译错误 ;
- 开发者用super(…)调用了在父类中参数匹配的一个构造函数 ;
1中提到”可能会出现编译错误“,具体来说就是 , 若开发者已经在父类中自定义了一个或多个”有参数但参数不同构造方法“,那么编译器自动在子类构造方法中加上的super()将导致编译错误 , 因为父类中并没有无参的构造方法。
还值得注意的是,需要用super()来调用父类构造方法,证明父类的构造函数不会被子类所继承 ;