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”呢?请高手帮忙,谢谢了.
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”呢?请高手帮忙,谢谢了.
楼主【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
对于属性和静态方法来说,调用取决于声明的类型,而对于其他的取决于运行时的类型,这里A是声明类型,B则是运行时的类型。
new了个新内存空间
你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的问题)
一般情况下用:类名.静态方法
也可以: 变量.静态方法
建议用类来调用,虽然用对象来调用效果一样,但是可能会被别人误认为是个非静态方法。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完全没有关系。
}}
A c = new B();
对于属性和静态方法来说,调用取决于声明的类型,而对于其他的取决于运行时的类型,这里A是声明类型,B则是运行时的类型。
static声明的是谁,就用谁的!
帮忙顶啊