一.再探向上转型(upcasting)
    将某个object reference视为一个“reference to base type“的动作,称为向上转型。
1.    Upcasting后调用某个函数时,如果derived class中覆写了该函数,则会调用derived class中的函数;否则,会调用base class中的函数。如class First{
    public void prt(){
        System.out.println("First");
    }
}
class Second extends First{
    //(a)
     public void prt(){
        System.out.println("Second");
    }
}
public class ExplicitStatic{
    public static void main(String[] args){
        First n = new Second();
        n.prt();;
    }
}
结果为Second。如果当Second class中的prt()函数注释掉,将输出First。
2.    向上转型后只能调用base class中被derived class覆写的函数。/*
abstract class First{
    int i = 122;
    public void prt(){
        System.out.println("First.i = " + i);
    }
    public abstract void prt(First f);
}class Second extends First{
     public void prt(){
        System.out.println("Second.i = " + i);
    }
    
    public void prt(First i)
    {
        
    }
    
    public void prt(int i)
    {
        
    }
}
public class ExplicitStatic{
    public static void main(String[] args){
        First n = new Second();
        n.prt(2);;
    }
}
*/
class First{
    public void prt(){
        System.out.println("First");
    }
}
class Second extends First{
    //(a)
     public void prt(){
        System.out.println("Second");
    }
    public void prt(int i){//(a)
        System.out.println("Second.i = " + i);
    }
}
public class ExplicitStatic{
    public static void main(String[] args){
        First n = new Second();
        n.prt(3);
    }
}
(a)处的函数只是Second class中的函数,所以不能通过n.prt(3)进行调用。

解决方案 »

  1.   

    一.Java访问权限饰词(access specifiers)
    Java有public、protect、friendly、private四种访问权限,并且这四访问权限的访问范围越来越小。
    1.    friendly
    1)    果一个class内的数据成员或方法没有任何权限饰词,那么它的缺省访问权限就是friendly。同一个package内的其它所有classes都可以访问friendly成员,但对package以外的classes则形同private。
    2)  对于同一个文件夹下的、没有用package的classes,Java会自动将这些classes初见为隶属于该目录的default package,可以相互调用class中的friendly成员。如以下两个class分别在同一个文件夹的两个文件中,虽然没有引入package,但隶属于相同的default package。
    2.    public:可以被任何class调用
    3.    private:private成员只能在成员所属的class内被调用