黑马程序员技术交流社区
标题: 代码问题! [打印本页]
作者: Hello_world_ 时间: 2013-7-29 08:47
标题: 代码问题!
public class Test3
{
public static void main(String[] args)
{
M m = new N();
m.output();
}
}
class M
{
public void output()
{
System.out.println("M");
}
}
class N extends M
{
public static void output()
{
System.out.println("N");
}
}
为什么结果是M 不是N??
作者: denghui1010 时间: 2013-7-29 09:15
这样根本过不了编译,你是怎么运行出M的结果的?子类的output方法没有重写掉父类的output方法
作者: 王广亚 时间: 2013-7-29 09:18
静态只能复写静态,子类的方法static去掉才是复写父类的方法。这样运行结果才是N
作者: 李政 时间: 2013-7-29 09:21
首先代码编译会报错,子类N中的output无法覆盖父类中的output 覆盖必须与父类的函数一模一样
如果父类也写的是static方法 就是 public static void output() ,编辑就会通过了。可以称之为是重写
静态方法的在建立的时候就会放在内存中的静态方法区,并与类名绑定,也就是静态绑定。
也就是说,即使子类重写了父类的静态方法,并且也建立了父类指向子类的引用,当父类调用静态方法的时候,如果本类有的话,会优先调用本类的静态方法。
作者: Hello_world_ 时间: 2013-7-29 09:25
这个结果确实就是M,我很纳闷为什么是M
作者: Hello_world_ 时间: 2013-7-29 09:25
:handshake
作者: 王希军 时间: 2013-7-29 09:27
N 中的 output() 无法覆盖 M 中的 output();覆盖的方法为静态
作者: 手心里的温柔 时间: 2013-7-29 09:28
不知道楼主在子类output()方法前加static 是出于什么目的,这样不能实现方法的重写,编译是不能通过的。解决办法:
1,将子类成员函数前static去掉,属于多态中非静态成员函数的特点,打印结果为N
2,将父类成员函数也用static修饰,属于多态中静态成员函数的特点,打印结果为M
希望能帮到你 共同学习
作者: Mr_Free 时间: 2013-7-29 09:30
首先你在函数中用了多态, M m = new N(); 在多态中,静态成员函数的特点是,无论运行还是编译,都参考左边。M是左边的类,N是右边的类。
左边 右边
为什么?因为静态是优先于 对象的存在,所以静态不能被覆盖。所以方法的执行按照对象所属的类里面的方法调用。 大白话:就是这变量属于什么类,就到那个类里面去找方法执行。
作者: Hello_world_ 时间: 2013-7-29 09:32
:handshake
作者: 續寫↖完羙↘ 时间: 2013-7-29 11:37
M m = new N();改成N n =new N()结果就是m了。静态不能被覆盖。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |