java继承原理说明
1,子类将父类中的所有成员变量继承过来并隐藏,而且不会覆盖。
2,对于方法,子类继承过来后进行覆盖而非隐藏。
3,对于声明类型,只有该声明类型的类中定义的才可见(包过隐藏的)。
package inherit;
public class TestInherit extends Father{
String str = "i am son!";
@Override
public String getStr() {
return str;
}
//只在子类中定义的变量和方法
String sonOlny = "i am difined only in son!";
public String getSonOlny() {
return sonOlny;
}
public static void main(String[] args) {
Father father = new TestInherit();
/**
* 1.对于变量,子类将父类中的变量继承过来,并默认隐藏。
* 2.因为声明的是父类型的,所以默认访问的是从父类中继承过来
* 3.如果想访问子类中的,可以通过强制类型转换。
*/
System.out.println(father.str);
System.out.println(((TestInherit)father).str);
System.out.println("----------------------");
/**
* 1.对于方法,子类是并没有将父类中的继承过来隐藏,而是进行了覆盖,所以
* 不管是声明为父类型的,还是子类型的,只要是子类的实例对象,那么执行
* 的就是子类定义的方法,因为只有这个方法,没有隐藏的方法。
*/
System.out.println(father.getStr());
System.out.println(((TestInherit)father).getStr());
System.out.println("----------------------");
/**
* 1,因为声明是按照父类的类型来声明的,虽然是子类的实例对象,虽然包含子类中的所有方法,
* 但是对于父类中没有定义的方法,对于声明为父类型的实例仍然是不可见的。
* 2,因为实例对象实际是子类对象的实例,所以它除了包含父类中的变量,还包含子类的变量和方法,
* 所以仍然可以通过强制类型转换,访问子类中的不可见得方法和成员变量。
*/
System.out.println(((TestInherit)father).sonOlny);
System.out.println(((TestInherit)father).getSonOlny());
// System.out.println( father.sonOlny); //这样会报错,不可见
System.out.println("---------------------");
/**
* 1.所以综合来说,继承中,方法覆盖是特例,其余的都会直接继承过来
* 2.对象的声明,限定了对象的变量和方法的可见范围。
*/
System.out.println(father.only);
System.out.println(father.getOnly());
System.out.println(((TestInherit)father).only);
System.out.println(((TestInherit)father).getOnly());
}
}
class Father{
String str= "i am father!";
public String getStr() {
return str;
}
//只在父类中进行定义的变量和方法
String only="i only difined in father!";
public String getOnly() {
return only;
}
}
运行结果:
i am father!
i am son!
----------------------
i am son!
i am son!
----------------------
i am difined only in son!
i am difined only in son!
---------------------
i only difined in father!
i only difined in father!
i only difined in father!
i only difined in father!
Process finished with exit code 0