继承有个特点,就是子类无法访问父类的private字段或者private方法。例如,Student类就无法访问Person类的name和age字段:
class Person {
private String name;
private int age;
}
class Student extends Person {
public String hello() {
return "Hello, " + name; // 编译错误:无法访问name字段
}
}
这使得继承的作用被削弱了。为了让子类可以访问父类的字段,我们需要把private改为protected。用protected修饰的字段可以被子类访问:
class Person {
protected String name;
protected int age;
}
class Student extends Person {
public String hello() {
return "Hello, " + name; // OK!
}
}
因此,protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类,以及子类的子类所访问,后面我们还会详细讲解。
2.super的使用
super关键字表示父类(超类)。子类引用父类的字段时,可以用super.fieldName。例如:
class Student extends Person {
public String hello() {
return "Hello, " + super.name;
}
}
上面的代码执行会有编译错误,student构造方法,无法调用Person的构造方法。
解析:任何class的构造方法,必须先构造发父类的构造方法。如果没有明确的调用父类的构造方法,编译器会自动帮我们加一句super(),所以Student类的构造方法实际上是这样
那么问题就出在父类即Person类没有默认的构造方法,子类即Student必须显示调用重载以后的构造函数,即
Student类中的写法为
总结:如果父类没有默认的构造方法,子类必须显示地调用super()并给出参数,让编译器定位到一个合适的构造方法。同时,子类不会继承任何父类的构造方法,子类默认的构造方法是编译器自动生成的,不是继承的