A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Hello_world_ 中级黑马   /  2013-7-29 08:47  /  1613 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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??

10 个回复

倒序浏览
这样根本过不了编译,你是怎么运行出M的结果的?子类的output方法没有重写掉父类的output方法
回复 使用道具 举报
静态只能复写静态,子类的方法static去掉才是复写父类的方法。这样运行结果才是N
回复 使用道具 举报
首先代码编译会报错,子类N中的output无法覆盖父类中的output 覆盖必须与父类的函数一模一样

如果父类也写的是static方法  就是 public static void output() ,编辑就会通过了。可以称之为是重写

静态方法的在建立的时候就会放在内存中的静态方法区,并与类名绑定,也就是静态绑定。

也就是说,即使子类重写了父类的静态方法,并且也建立了父类指向子类的引用,当父类调用静态方法的时候,如果本类有的话,会优先调用本类的静态方法。



回复 使用道具 举报
denghui1010 发表于 2013-7-29 09:15
这样根本过不了编译,你是怎么运行出M的结果的?子类的output方法没有重写掉父类的output方法 ...

这个结果确实就是M,我很纳闷为什么是M
回复 使用道具 举报
李政 发表于 2013-7-29 09:21
首先代码编译会报错,子类N中的output无法覆盖父类中的output 覆盖必须与父类的函数一模一样

如果父类也写 ...

:handshake
回复 使用道具 举报
N 中的 output() 无法覆盖 M 中的 output();覆盖的方法为静态
回复 使用道具 举报
不知道楼主在子类output()方法前加static 是出于什么目的,这样不能实现方法的重写,编译是不能通过的。解决办法:
1,将子类成员函数前static去掉,属于多态中非静态成员函数的特点,打印结果为N
2,将父类成员函数也用static修饰,属于多态中静态成员函数的特点,打印结果为M

希望能帮到你 共同学习
回复 使用道具 举报
首先你在函数中用了多态, M m = new N(); 在多态中,静态成员函数的特点是,无论运行还是编译,都参考左边。M是左边的类,N是右边的类。
                                     左边           右边
为什么?因为静态是优先于  对象的存在,所以静态不能被覆盖。所以方法的执行按照对象所属的类里面的方法调用。   大白话:就是这变量属于什么类,就到那个类里面去找方法执行。
回复 使用道具 举报
Mr_Free 发表于 2013-7-29 09:30
首先你在函数中用了多态, M m = new N(); 在多态中,静态成员函数的特点是,无论运行还是编译,都参考左边 ...

:handshake
回复 使用道具 举报
M m = new N();改成N n =new N()结果就是m了。静态不能被覆盖。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马