class Father{
String member = "father";
}
class Son extends Father{
String member = "son";
String member2 = "son2";
}
public class test{
public static void main(String[] args){
Father f = new Son(); //父类的引用指向子类的对象
System.out.print(f.member);//输出为father,若想输出子类的成员变量,则要((Son)f).member
f.member2;//编译不通过,因为f引用指向的是Son对象,虽然Son有member2成员变量,但是编译时系统并不知道,系统只能根据引用类型来判断,引用类型没有该成员就会编译报错。
}
}
引用只能调用其所在类具有的成员,不能调用子类特有的成员。
但是,方法的调用与此相反,是按对象的类型调用,与引用类型无关,调用的是具体对象所在类中的方法。
静态方法不能被重写,可以被继承。子类“重写”父类的静态方法时也只能写成静态的,其实质是将父类的静态方法隐藏,而不是重写。在这种情况下是根据引用类型来进行调用,与重写不同(根据对象类型调用)
public class Test extends Parent {
public static void main(String[] args) {
Test t = new Test();
t.t2(3);
//这种情况下,区分重写(覆盖)的区别。覆盖调用子类的方法,重载只调用父类的方法
Parent t3 = (Parent) t;
t3.t2(3);//即使子类有更匹配的t2(int),但是这里只能调用父类自己的方法,没有就会报错
}
public void t2(int a) {
System.out.println("子类t2的int a==" + a);
}
}
class Parent {
public void t2(double a) {
System.out.println("父类t2的double a==" + a);
}
public void t2(String s){
System.out.println("父类t2的String s==" + s);
}
}
输出:
子类t2的int a==3
父类t2的double a==3.0
设Ia与Ib均为接口,类A实现了Ia,
Ia a = new A();
Ib b = (Ib)a;
任何两个接口都能相互强转,编译不会出错;但是若类A没有直接或间接实现Ib,运行时会出错。