package a;public class A {
        public A() {};
        protected void display(){};
}
--------------------------------------
package b;import a.A;public class B extends A{
        public static void main(String[] args) {
                B b = new B();
                b.display();
                A a = new A();
                a.display(); //这行报错
        }
}******************************
如果将程序修改:
package a;public class A {
        public A() {};
        protected static void display(){};  //加上static
}
------------------------------------------
package b;import a.A;public class B extends A{
        public static void main(String[] args) {
                B b = new B();
                b.display();
                A a = new A();
                a.display(); //正常
        }
}
为什么在类A的display()方法前加上static,就可以运行啦?请高手指教

解决方案 »

  1.   

    static 方法中只能调用父类静态方法,而它本身隶属于类本身,能被全局调用
      

  2.   

    出现这样的问题的原因是因为类A中的display()方法用了protected修饰符
    在第一种情况中,类B继承了类A和A的display()方法,所以在类B中B类型的对象可以调用自己的display()方法。
    但类A的protected方法对其不同包子类B来说是不可见的,所以此protected方法对于B类中生成的A类型的对象也是不可见的
      

  3.   

    出现这样的问题的原因是因为类A中的display()方法用了protected修饰符 
    在第一种情况中,类B继承了类A和A的display()方法,所以在类B中B类型的对象可以调用自己的display()方法。 
    但类A的protected方法对其不同包子类B来说是不可见的,所以此protected方法对于B类中生成的A类型的对象也是不可见的正解
    但是为什么加上static就可以了呢?
      

  4.   


    因为A类display()方法为protected的,所以在子类B中能使用,又因为A类的display()方法为静态方法,就表示
    创建多个A类对象(包括子类对象),在内存中也只有一份存储空间,
    所以b对象和a对象调用的是同一个display()方法。
    我是这么理解的
      

  5.   

    出现这样的问题的原因是因为类A中的display()方法用了protected修饰符 
    在第一种情况中,类B继承了类A和A的display()方法,所以在类B中B类型的对象可以调用自己的display()方法。 
    但类A的protected方法对其不同包子类B来说是不可见的,所以此protected方法对于B类中生成的A类型的对象也是不可见的正解对于static,是因为static 是对于类来讲的,所以可以访问,我们所说的protected子类可以访问,说的是子类的对象,而且又是在子类里面。具备这样个才可以说是子类可以访问。对于static,他是对于类来说的。
      

  6.   


    package a.a;
    class A { 
        public A() {}; 
        protected void display(){}; 

    public class B extends A{ 
        public static void main(String[] args) { 
                B b = new B(); 
                b.display(); 
                A a = new A(); 
                a.display();
        } 
    } 那为什么这样又可以呢?
      

  7.   

    现在明白了,
    这么解释,从访问权限着来说:
    protected的访问权限是同一包中的类和不同包的子类(的对象),而不同包中的子类可以访问它必须包含两个条件:
    1,在子类中 2,是子类的对象   
    所以说,类A虽然在子类中,但是它不是子类的对象,它是父类的对象,所以,它没有访问权限,
    从static这来说  当父类的成员声明为静态的时候 ,不管你创建多少对象,它只开辟一段内存,因为它是在创建对象之前开辟的,类可以直接访问,但是同时对象也可以访问,而你创建的对象,包括父类,当然也包括子类的对象,所以加上static后谁都可以访问,大概就是这么着理解吧              
      

  8.   

    没有static的代码没有错 自己好好看看
      

  9.   

    那如果是private static void display(){};  
    呢?