子类能否获得父类的所有域和方法,到现在我还没有结论。不过子类不能继承父类的private方法和final方法那是肯定的。
现象:
父类中private方法不可以被继承,也不可以被覆盖。因为都不可以被继承了所有覆盖从何说起。但是子类可以有相同名称的方法,不过此方法与父类的private方法毫无关系。只是名字相同的两个毫无关系的方法而已。
父类中final方法的意境比private更加苛刻。原因是除了final方法不可以被覆盖不可以被继承以外,在子类中不可以有相同名称的方法出现。
究其原因:
private的由头是它只被类内可见,作用域只在本类当中。子类对其不可见也就没法继承了。子类中有与父类私有方法重名的也就可以解释的通了。重了?我不知道。我又看不见! 但是与父类的那个同名方法真啥没关系。只是个巧合。
final的由头是它不可被子类覆盖。不让覆盖,在子类中当然不可能出现了。不管是想从父类继承到子类,还是子类中一不小心与父类final方法重名了。都不可以。不可覆盖就是不可出现!
一个例子:
class Test1 {
public void f1() {
System.out.println("f1");
}
/** 无法被子类覆盖的方法
*不可覆盖比private恨。父类私有的f4,子类可以出现同名方法f4(虽然与父类的f4一点关系没有)。
但是不可覆盖的意思是说,子类不可以出现这个方法!*/
final void f2() {
System.out.println("f2");
}
public void f3() {
System.out.println("f3");
}
/**子类有骨气,不要父类的f4。自己写个f4也可以。
* 但这个f4方法就和父类的f4没有一点关系了。(不是继承而来的)只不过他俩的名字相同而已。
*/
private void f4() {
System.out.println("f4");
}
}
public class Test2 extends Test1 {
public void f1() {
System.out.println("Test1父类方法f1被覆盖!");
}
//不可以覆盖f2。这里是错误的。
// public void f2() {
// System.out.println("Test1父类方法f1被覆盖!");
// }
//
public void f4() {
System.out.println("f44");
}
public static void main(String[] args) {
Test2 t = new Test2();
t.f1();
t.f2(); // 调用从父类的final方法
t.f3(); // 调用从父类继承过来的方法(虽然看不见f3但是的确存在于子类中)
t.f4(); //如果子类里没有自己的f4。这里就调用的是父类的。调用会失败,无法从父类继承获得
}
}