黑马程序员技术交流社区

标题: 抱歉,更正刚才的问题,理论依据和结果。thank u [打印本页]

作者: 赵宇    时间: 2012-9-19 14:15
标题: 抱歉,更正刚才的问题,理论依据和结果。thank u
本帖最后由 赵宇 于 2012-9-25 08:45 编辑

public class StaticTest3
{
public static void main(String[] args)
{
  M m = new N();
  m.output();
}
}

class M
{
public static void output()
{
  System.out.println("M");
}
}

class N extends M
{
public static void output()
{
  System.out.println("N");
}
}


作者: 尤圣回    时间: 2012-9-19 14:17
输出的是NM
作者: 陈俊来    时间: 2012-9-19 14:24
输出的是M
M m = new N();
这是M对象,
调用的是m.output()调用的是M的方法,static类型的方法只能调用一次,所以,是M

作者: 尤圣回    时间: 2012-9-19 14:24
输出的是Mclass N extends M
{
public static void output()
{
  System.out.println("N");
}  因为继承父类 父类中的 静态方法在子类中是被禁用的

作者: 尤圣回    时间: 2012-9-19 14:25
输出的是M
class N extends M
{
public static void output()
{
  System.out.println("N");
}  因为继承父类 父类中的 静态方法在子类中是被禁用的


作者: 赵宇    时间: 2012-9-19 14:27
吕书凯 发表于 2012-9-19 14:20
子类是不能重写父类的静态方法的
静态方法不是父类的,而是公共的。公共的东西子类不能重写
public class S ...

输出结果是M

你的解释。。。可不可能是这个因为M m = new N()原因呢?
作者: 赵宇    时间: 2012-9-19 14:34
吕书凯 发表于 2012-9-19 14:33
嗯,m一开始就定义为M类型,所以调用的是M的静态方法

谢谢各位  不一一回复了
作者: 董志超    时间: 2012-9-19 14:58
输出结果是M
给你说一下多态中成员的特点就明白了
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
你这里方法是静态的,所以编译和运行都看左边,即父类M。
这里的左边指的是父类,即引用行变量;右边指的是子类。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2