黑马程序员技术交流社区
标题:
这个多态怎么不管用?
[打印本页]
作者:
黄嵘才
时间:
2013-2-25 16:11
标题:
这个多态怎么不管用?
多态?
父类的引用指向子类的对象。运行时会运行子类覆盖的方法.
我想让多态调用到它的实际类型,sub的方法。但是它却调用了父类的方法,这是为什么?
/**
*/
public class Test {
public static void main(String args[]) {
Super s = new Sub();
s.m();
}
}
class Super {
public static void m() {
System.out.println("super");
}
}
class Sub extends Super {
public static void m() {
System.out.println("sub");
}
}
复制代码
结果是:
super
作者:
王钊
时间:
2013-2-25 16:27
这两个方法都是静态方法,静态方法都是与类相关的,
在编译时期,你将s定义为父类Super,那么你调用的静态方法,
在运行是s.m(),就直接找到s在编译时所属的类,调用Super.m()
作者:
李挺
时间:
2013-2-25 16:29
你这个父类和子类里面的方法都是静态的,他们存在于方法区中,不在对象里面
你这个变量是父类型的变量
当然回去读父类的方法
你可以这样理解
这2个方法都不是静态的时候,他会读子类复写的方法
作者:
彭颖
时间:
2013-2-26 01:55
/**
*/
public class Test {
public static void main(String args[]) {
Super s = new Sub();
//静态方法引用变量所声明的类型(Super类型)的方法绑定
s.m();
//所以你打印的super类的m方法
}
}
class Super {
public static void m() {
System.out.println("super");
}
}
class Sub extends Super {
public static void m() {
System.out.println("sub");
}
}
-------------------------------------------------
在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
1, 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的
2, 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定
3, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2