黑马程序员技术交流社区
标题:
子类非静态方法为什么不能覆盖父类静态方法
[打印本页]
作者:
爱上这格调
时间:
2013-9-12 00:50
标题:
子类非静态方法为什么不能覆盖父类静态方法
本帖最后由 杨增坤 于 2013-9-13 08:50 编辑
class Fu
{
static void show()
{
System.out.println("fu run");
}
}
class Zi extends Fu
{
void show()
{
System.out.println("zi run");
}
}
编译时结果 Zi中的show()无法覆盖Fu中的show() 不是说非静态方法可以访问静态方法的吗 那么为什么非静态的子类方法不能覆盖静态的父类方法那
作者:
李锡碧
时间:
2013-9-12 01:05
重写:
1.子类覆盖父类,必须保证子类权限 >= 父类权限,才可以覆盖。否则,编译失败。
2.静态只能覆盖静态。
记住:
重载:只看同名函数的参数列表。
重写:父类和子类方法要一模一样。
<p align="left">class Fu
{
static void show()
{
System.out.println("fu run");
}
}
class Zi extends Fu
{
static void show()
{
System.out.println("zi run");
}
}</p>
复制代码
作者:
lonely_zb
时间:
2013-9-12 01:15
你的子类根本就没有重写父类的方法,怎么会存在调用了父类的方法诶....
正如上楼所说:
重载:只看同名函数的参数列表。
重写:父类和子类方法要一模一样
作者:
神之梦
时间:
2013-9-12 01:35
本帖最后由 神之梦 于 2013-9-12 17:34 编辑
谁说非静态方法可以访问静态方法
我脑袋短路了
作者:
梦航
时间:
2013-9-12 02:00
这样理解,你能拿老爸的身体当做自己的来用吗?
作者:
周文斌
时间:
2013-9-12 02:07
谁说非静态方法可以访问静态方法
很明确的告诉楼上,非静态方法确实可以调用静态方法。
java中的各种规则都来源于实际操作可能性,比如为了封装,有了private等权限,当private修饰时,类外不可直接访问,比如静态方法不能调用非静态方法和非静态变量,那是因为静态方法在程序加载时就已经被加载进内存了(顺序:类——类中静态成员——类中非静态成员——构造器),非静态方法调用静态方法没有任何现实意义和逻辑上不允许,相反他是有一定需求的。。
lz的问题:
覆盖,即重写。
重写的要求是:要和父类中的方法一模一样包括 修饰符,返回值,函数名,参数(数量,顺序,类型),然后还要权限大于父类(1楼所说)。
由于要求一模一样,那么自然静态方法为了覆盖其父类的某个方法,那么该方法也得用static修饰咯~~
看lz“好像觉得非静态方法由于能调用静态方法,那么必然能覆盖静态方法的语气”,是不是觉得非静态方法“权限”要大一些?事实上没有这么一说,静态方法不能调用非静态方法我上面说了。你觉得不信,可以将父类中的static拿到子类中,会发现也编译不了,这个原因,纯粹是因为不符合java关于重写(覆盖)的规则而已~~
希望对你有帮助,求分~~{:soso_e112:}
作者:
Yuan先生
时间:
2013-9-12 10:06
静态方法只与定义时所在的类相关,在编译期就已经绑定到某个类,引用属于哪个类就会调用哪个类的静态方法,可以继承,但不能在子类中被同名方法覆盖.
作者:
陶智第
时间:
2013-9-12 11:24
非静态方法可以调用静态方法。因为静态方法在内存中是属于共享方法
静态方法和非静态方法在内存中存在的位置不一样。
静态方法存在于方法区中,而非静态方法存在于堆内存中。
因为他们在内存中的位置不一样,所以非静态方法不能覆盖静态方法
作者:
吴一磊
时间:
2013-9-12 12:55
子类覆盖父类方法必须要父类和子类方法要一模一样,而且子类权限必须要大于等于父类权限,父类是 static void show(),子类也必须是 static void show()
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2