有两个类。
第一个类:
package com.pak1;public class Pub{    public int i = 1;
    protected int j = 2;
    int n = 3;
    private int m = 4;
    
    public void Public(){
        System.out.println(" Public method! ");
    }
    protected void Protected(){
        System.out.println(" Protected method! ");
    }
    void Friendly(){
        System.out.println(" Friendly method! ");
    }
    private void Private(){
        System.out.println(" Private method! ");
    }}
第二个类:
package com.pak2;import com.pak1.Pub;public class Pub3 extends Pub{    public static void main(String[] args) {
        try{
            Pub3 p3 = new Pub3();            System.out.println(" public ::: p3.i = " + p3.i);            System.out.println(" protectde ::: p3.j = " + p3.j);
            //is err
            //System.out.println("friendly ::: p3.n = " + p3.n);
            //is err        
            //System.out.println("private ::: p3.m = " + p3.m);   
            
            p3.Public();    
            p3.Protected();
            //is err        
            //p3.Friendly();
            //is err
            //p3.Private();
            
            
            
            Pub p = new Pub();
        
            System.out.println(" public ::: p.j = " + p.i);
            //is err            
            //System.out.println(" protected ::: p.j = " + p.j);
            //is err            
            //System.out.println(" friendly ::: p.n = " + p.n);
            //is err
            //System.out.println(" private ::: p.m = " + p.m);  
            
            p.Public();
            //is err       
            //p.Protected();
            //is err        
            //p.Friendly();
            //is err
            //p.Private();
            
            Pub pp = new Pub3();
            
            System.out.println(" public ::: pp.i = " + pp.i);
            //is err
            //System.out.println(" protectde ::: pp.j = " + pp.j);
            //is err
            //System.out.println("friendly ::: p3.n = " + pp.n);
            //is err        
            //System.out.println("private ::: p3.m = " + pp.m);  
            
            pp.Public();
            //is err       
            //pp.Protected();
            //is err        
            //pp.Friendly();
            //is err
            //pp.Private(); 
        }catch(Exception e){
            e.printStackTrace();
        }    }
}
问题:
为什么声明Pub3 p3 = new Pub3();
p3可以调用父类变量(protected) j和方法Protected().
而声明Pub pp = new Pub3();
pp不可以调用父类变量(protected) j和方法Protected().

解决方案 »

  1.   

    回答你的第二题,Pub pp = new Pub3();
    父类的实例已经指向了它子类的对象
    此时的pp调用的方法就是子类的了,除非你用上一个super关键字
    第一题我就不回答你了,这是java中一个很基本的思想,别人告诉了你,你自己是没什么收获的自己再好好想想吧
      

  2.   

    Pub3 继承 Pub 
    既然父类的实例已经指向了它子类的对象,那么父类的变量(protected) j和方法Protected().
    怎么不能被子类的对象调用?
    Pub3 p3 = new Pub3();
    就可以调用。
      

  3.   

    Pub pp = new Pub3();将pub3的引用附给了PUB的实列PP。这是一个向上转型的。
    相当于JAVA的多态吧。。这样就可以用父类的引用调用子类的方法了。
    如果要调用父类的方法。必须使用在构造函数里调用super()方法
      

  4.   

    在Pub3.java 中添加    public Pub3(){
            super();
        }
    构造方法。
    还是不能调用父类的变量和方法。
      

  5.   

    这样肯定是不行的,在你编译的时候就会出错,Pub pp = new Pub3();在JVM编译的时候,实际上是按照Pub的规范进行编译的,这样定义的好外就是为了实现多态,在执行时来调用子类的方法,如果你想调用的话,可以用接口来实现,应该没有关系。
      

  6.   

    调有父类的方法,我是可以实现的。但是我不理解Pub pp = new Pub3();中的pp只能调用子类的变量和方法,而不能调用父类的变量(protected)和方法(protected)?
      

  7.   

    用指针来解释的话,pp相当于一个指针,虽然是父类的,但是你并没有把pp指向父类的对象而是把这个指针指向了子类的对象了。这个时候JVM认为你用pp做的操作都是在操作子类,而不是父类