《Java与模式》一书中说静态方法无法有子类继承(p142)如何理解?

captiveRobotCN 2003-06-25 12:32:51
同上?
...全文
50 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeffyan77 2003-06-26
  • 打赏
  • 举报
回复
非常抱歉,这句话没什么意义,而且容易误解。已经有好几个读者指出这一点,我已经在网站上的勘误表中改正了。下面针对这个问题加以说明。

(1)一个Java类静态方法当然可以由子类继承。比如

class Base
{
public static void someMethod()
{
System.out.println("in static method");
}
}

class Derived extends Base
{}

class Client
{
public static void main(String[] args)
{
Derived.someMethod();

Derived d = new Derived();
d.someMethod();
}
}

运行Client会打印出两行“in static method”,这说明静态方法确实被子类所继承。

(2)书中原文想要说的是:“静态方法不能被子类override,因此不支持多态性。”一个Java方法不能被子类override,也不支持多态性,并不奇怪。构造方法就是如此。TIJ说构造方法是隐含的静态方法,我同意这个说法。

举一个例子:
class Base
{
public static void someMethod()
{
System.out.println("in static method of Base");
}

}

class Derived extends Base
{
public static void someMethod()
{
System.out.println("in static method of Derived");
}

}

class Client
{
public static void main(String[] args)
{
Derived.someMethod();

Derived d = new Derived();
d.someMethod();

Base o = new Derived();
o.someMethod();

}

}

执行时会打印出
in static method of Derived

in static method of Derived

in static method of Base

显然,到底执行哪一个静态方法,是由变量的明显类型决定的,而不是由对象的真实类型决定。这不是多态性的。
asdmonster 2003-06-26
  • 打赏
  • 举报
回复
sign
jeffyan77 2003-06-26
  • 打赏
  • 举报
回复
换句话说,自类可以隐藏(hide)父类的静态方法,而不能覆盖(override)父类的静态方法。
nedea 2003-06-25
  • 打赏
  • 举报
回复
每一本书都有错误,应为电脑有不可预见性,何况jvm还不成熟。。。
<think in java>我已经发现了几处了

“静态方法无法有子类继承,“是垃圾话
fanhualei 2003-06-25
  • 打赏
  • 举报
回复
静态方法直接就能调用呀
zhipop 2003-06-25
  • 打赏
  • 举报
回复
静态方法直接是用类名.方法名使用,当然不能用子类来继承了
我觉得这些如果不说还好,说出来了简直是让人误解

如果是静态方法的话,就不需要让类实例化,也就是不需要句柄来直接调用方法

所以理解就是这样了

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧