public class A {

public static void funA() {
System.out.println("Goodnight");
}
}
public class B extends A { public static void funA() {
System.out.println("hello"); }
}
public class C { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
A c = new B();
c.funA();
}}
为什么结果是“Goodnight”呢?请高手帮忙,谢谢了.

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【cs_bs】截止到2008-07-01 11:03:54的历史汇总数据(不包括此帖):
    发帖数:0                  发帖分:0                  
    结贴数:0                  结贴分:0                  
    未结数:0                  未结分:0                  
    结贴率:-------------------结分率:-------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    你申明的是A,当然调用的还是A的方法,所以是Goodnight
      

  3.   

    因为是static,你用A c来声明一个对象,当然是先调用了A里的funA,B里的改写对此无效。
      

  4.   

    可我的B继承了A了 应该输出的是B类的方法啊
      

  5.   

    你把A c=new B()换成B c=new B(),你就会发现结果不一样了。
      

  6.   

    如果把static都去掉的话 就是B的方法了 为什么啊
      

  7.   

    A c = new B();
    对于属性和静态方法来说,调用取决于声明的类型,而对于其他的取决于运行时的类型,这里A是声明类型,B则是运行时的类型。 
      

  8.   

    或者你把static去掉,结果也不一样了。
      

  9.   

    我想知道 我new出来的对象c 他具有什么特点呢?
      

  10.   

    申明的是A,当然调用的还是A的方法
      new了个新内存空间
      

  11.   


    你new出来的c用的构造函数是B的, 但是你用“=”赋值的时候, 系统会默认把值转换成左边的类型A。类似于double a=new Integer(10)一样。 
    double a =new Integer(10);
    System.out.println(a/6); //此时输出的是1.66666int a=new Integer(10);
    System.out.println(a/6); //此时输出的是1
    (这里涉及boxing的问题)
      

  12.   

    static 是在编译时就确定下来的,不存在多态行为
      

  13.   

    静态方法是属于类的,不属于任何对象.但是通过类名,和用对象都可以调用   
       一般情况下用:类名.静态方法  
             也可以:   变量.静态方法  
    建议用类来调用,虽然用对象来调用效果一样,但是可能会被别人误认为是个非静态方法。lz的代码等同于:
    public class A { public static void funA() {
    System.out.println("Goodnight");
    }
    }class B extends A { public static void funA() {
    System.out.println("hello"); }
    }class C { /**
     * @param args
     */
    public static void main(String[] args) {
    A.funA();//A c = new B();//c.funA();
                    //因为是静态方法,跟new B完全没有关系。                 

    }}
      

  14.   

    刚刚我还没有想明白,不过,我现在差不多就明白啦!静态方法的初始化是早于对象的。意味着A a时,B中的那个同名的静态的方法他是不知道的。要调用a中的静态方法就是在A中找那个静态的方法。
      

  15.   

    static声明的是谁,就用谁的!
      

  16.   

    引用 8 楼 MinThinking 的回复:
    A c = new B(); 
    对于属性和静态方法来说,调用取决于声明的类型,而对于其他的取决于运行时的类型,这里A是声明类型,B则是运行时的类型。 
     
    static声明的是谁,就用谁的!
    帮忙顶啊