public class classA{
   public void methodOne(int i){ }
   public void methodTwo(int i){ }
   public static void methodThree(int i){ }
   public static void methodFour(int i){ }
}public class classB extends classA{
   public static void methodOne(int i){ }
   public void methodTwo(int i){ }
   public void methodThree(int i){ }
   public static void methodFour(int i){ }
}
1 问那些方法隐藏了父类的方法?1 问那些方法覆盖了父类的方法?很奇怪隐藏和覆盖有区别么? 不都是Overriding么?

解决方案 »

  1.   

    1methodFour
    2methodTwo
    其他两个方法编译是无法通过的,要么给methodThree,methodOne加上static,要么去掉static.
      

  2.   

    也就是说隐藏和覆盖其实是一样的了
    要保证如果有static 就都有static对吧
      

  3.   

    不一样,假如你上面的例子:
    classA a = new classB();
    a.methodFour()//这里调用的就是父类的方法,
    a.methodTwo()//这里调用的是子类的方法.你可以去搜索一下,论坛上这个问题的帖子非常多的!
      

  4.   

    static方法是类方法,不能被覆盖,
    而非static的方法是实例化方法是可以被覆盖的。
    一 覆盖

    class A{ 
       public void getA(int i){ }
    }

    class B extends A{ 
       public void getB (int i){ 
            getA(1);//调用的是C中的方法
        }
    }

    class C extends B{ 
       public void getC(int i){ 
            getB(1);
        }
       //这就是覆盖了Class A 这个中的方法
       public void getA(int i){ }
    }
    二 隐藏

    class A{ 
       public static void getA(int i){ }
    }

    class B extends A{ 
       public void getB (int i){ 
            getA(1);//调用的是B中的方法
        }
       //这就是隐藏了Class A 这个中的方法
       public static void getA(int i){ }}

    class C extends B{ 
       public void getC(int i){ 
            getB(1);
        }
    }三 隐藏!错误!!

    class A{ 
       public static void getA(int i){ }
    }

    class B extends A{ 
       public void getB (int i){ 
            getA(1);//调用的是B中的方法
        }}

    class C extends B{ 
       //这就是没有隐藏Class A 这个中的方法
       public static void getA(int i){ }
     }C .getB(3);//调用的还是A中的getA方法。
      

  5.   

    在yhjacky(风雨前程) 的回复发现一个问题,不知道你的这个例子是否经过验证?

    class B extends A{ 
       public void getB (int i){ 
            getA(1);//调用的是C中的方法==============>这里调用的是A中的方法
        }
    }
    其实这里的关键就是getA(int i)这个方法到底是从哪里来的,首先B是继承了A因此它同时也继承了
    A中的getA(int i)这个方法,因此在getB(int i)方法中它所能看到的getA(int i)方法只能是
    从A中继承过来的那个。从另一个角度说,C是B的一个子类,我们暂称B为父亲,C为儿子。其中的方法
    就当成是父亲,儿子要做的事情。打个不恰当的比喻就是:我父亲想要做getB事情时,他自己都不知道
    会不会有C这个儿子,所以他在做getB时用到的getA怎么会是被儿子(C)覆盖过的getA呢?在他干
    getB这件事情时能确定的只是它的父亲(A)留给它的getA方法,因此在这里getB中调用的是A中getA
    或者是它自己覆盖getA后的方法,而不会是他儿子中覆盖过的getA方法。
    我们可以举个简单的例子证明这一点:
    public class A{
        public void print(int i){
    System.out.println("Using Class A;"+"Get i="+i);
        }
    }
    public class B extends A{
       public void Bprint(int i){
    print(i);   ////    这里到底会调用谁的print呢?????????
       }
    }
    public class C extends B{
       public void Cprint(int i){
    Bprint(i);
       }

       public void print(int i){
    System.out.println("Using Class C;"+"Get i="+i);
       }
    }
    public class Main{
       public static void main(String args[]){
     B b1 = new B();
     b1.Bprint(2345);
       }
    }
    我们运行main后会看到结果:
    Using Class A;Get i=2345
    因此,事实也是如此!!
      

  6.   

    C .getB(3);//调用的还是A中的getA方法。
    这里是C.getA(3)??????
      

  7.   

    补充一点,当B类确定有其子类C存在时,且C对getA进行了覆盖则B中getB调用的才是C中的getA方法。
    修改main函数如下:
    public class Main{
        public static void main(String args[]){
      B c1 = new C();
      c1.Bprint(123);
        }
    }
    运行结果:
    Using Class C;Get i=123
    这里虚拟机其实已经装载了A,B,C三个类,c1其实是C的一个实例,这样的话我们可以
    和上面一样进行分析,c1调用的Bprint方法其实是从B中继承下来的,Bprint中又调用了
    print(i)方法,在C他自己这个类里已经将print(i)覆盖了,所以调用的是自己类中
    的方法,上面的例子是调用其父亲的方法,这里的例子是调用其自身的方法。
      

  8.   

    纠正:c1其实是C的一个实例=========>c1至少是C的一个实例
    因为c1也是B,A的实例,万物皆对象,java中所有对象都来自Object,所以你
    new出来的所有咚咚均是Object的实例。但他们都有个下界,这里就是C
    如果B b1 = new B()那b1就不是C的实例而最多是B的实例
    Object-
          |__A
             |__B
                |__C
    实例向上兼容(其实不能这样表述,一下子找不到词了),所以我new出来的c1可以用B类型来表示.
      

  9.   

    声明:我指出的问题是yhjacky(风雨前程)
    一 覆盖
    中的

    class B extends A{ 
       public void getB (int i){ 
            getA(1);//调用的是C中的方法
        }
    }
    这一部分讨论的是非静态类,所以不会有foxox()所描述的
    “这里是C.getA(3)??????”表述方式
    要不你就先new一个C对象实例出来,否则你不可以直接调用非静态方法
      

  10.   

    "static方法是类方法,不能被覆盖,
    而非static的方法是实例化方法是可以被覆盖的"
    有这种说法?
    不是final方法不能被覆盖么?
      

  11.   

    这里讨论的这些问题是C++的缺点,
    做为JAVA不应该出现这种情况,
    最好的方法是,编码时不要写
    自己都可能看不明白代码!
      

  12.   

    JAVA里没有隐藏的概念,
    就是在C++里,也不是所有的人
    都承认它的存在.
      

  13.   

    我在林锐博士写的<<C/C++ guide>>看过类似的问题:
        
        “隐藏”是指派生类的函数屏蔽了与其同名的基类函数.
        
        如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。//覆盖必须要有virtual
        
        按他说的,解释成JAVA语言,只有抽象方法才能谈得上被覆盖.
      

  14.   

    是不是应该这样回答
    静态方法不能overriding
    methodFour隐藏了父类的方法
    methodTwo覆盖了父类的方法?
    methodOne/methodThree编译出错.对不对?
      

  15.   

    eprint自定义打印是一个页面套打工具.它直接在IE浏览器中可视化的设计各种复杂的打印模版,
    能够解决在IE浏览器中打印各种复杂的中国式报表及票据。详见: http://218.30.103.110:8080/eprint/index.htm
    方成eform是一个web表单,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用.
      

  16.   

    static方法是可以被覆盖的!只有final的方法才不能被覆盖。
      

  17.   

    通过上机实验:1。   methodTwo 是覆盖!2。   methodFour 是隐藏~3。   methodOne与methodThree 是错误的!理由:   classA a =(classA)new classB();  当调用 a.methodTwo()  时还是用的 classB 的 methodTwo 而不是 classA的methodTwo。(上机实验得)
      
      当调用 a.methodFour() 时用的 classA 的 methodFour 而不是 classB 的 methodFour。(上机实验得)  很显然 methodTwo 是覆盖! methodFour 是隐藏~   !很有信心~~~