java继承时多态方法与成员的访问

 

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,运行时会出错。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章