java 静态 继承_Java中的继承与静态

我不太明白为什么静态方法可以在Java中继承?

继承就像从基类继承AND静态属于Class而不是Object.

因此,如果静态属于类只有为什么它会逐渐渗透到派生类?

它不应该只停留在定义它的类中吗?

继承静态方法是一种很好的编程习惯吗?

解决方法:

在java中,静态方法不会被继承(或者正确的单词被覆盖),但它们可以被隐藏.

这里的不同之处在于它们不像对象方法那样受多态性影响.

public class C1 {

static public void M1() {

System.out.println("C1.M1().");

}

static public void main(String ... Args) {

M1();

}

}

public class C2 extends C1 {

static public void M1() {

System.out.println("C2.M1().");

}

static public void main(String ... Args) {

M1();

C1.main(Args);

}

}

运行C2.main(null)时,您将获得:

C2.M1().

C1.M1().

如你看到的,

在C1.main(…)中调用M1()是指C1和的M1

在C2.main(…)中调用M1()是指C2的M1.

调用M1(没有任何前缀,参见每个main()的第一行),不受多态性的影响,因为C1中的M1不会被C2覆盖.

但是从C2调用指的是C2的M1,因为C2的M1隐藏了C1中的M1.

阅读更多here.

编辑:我刚刚重新阅读你的问题,只看到关于“良好编程实践”的部分.

正如我所说,静态方法不是继承的,而是隐藏的,因此它们与不同的方法一样好.

从代码的角度来看,它们是完全不同的方法.

让我们说吧.

C1 has static method M1.

C2 extends C1 and has static method M1.

C3 extends C2.

从C1调用M1(无前缀)时,调用C1.M1().

从C2调用M1(无前缀)时,调用C2.M1(). //派生但隐藏起来

从C3调用M1(无前缀)时,调用C3.M1(). //派生而不是隐藏

要指定哪个方法,请使用类名称,如C1.M1(),C2.M1()和C3.M1()(这将称为C2.M1()).

因此,此实现允许重新实现静态方法,但仅作为不同的方法而不是重写(或替换)方法.

因此,这通常没有什么不同,比如命名不同,如:C1_M()和C2_M().

所以你可能会问,为什么还要这个功能呢?我真的不知道.也许允许更灵活的命名方法.

但我使用的用法(可能会或可能不会打算)是通过反射的多态性.

由于您可以使用反射按名称获取和调用方法,因此允许它们具有相同的名称将通过反射启用多态.

例如(rought代码,可能无法运行):

String aClsName = "C1"; // "C2";

Class aCls = Class.forName(aClsName);

Method aMth = aCls.getMethod("M1"); // M1 of C1 or C2 depends on the class name.

aMth.invoke(null);

要么

Object aObj = new C1(); // new C2();

Class aCls = aObj.getClass();

Method aMth = aCls.getMethod("M1"); // M1 of C1 or C2 depends on the class of the object.

aMth.invoke(null);

考虑一下,我认为Java也使用它(比如,writeObject(…)进行序列化)所以它可能是有意的.

总而言之,隐藏静态方法并不是一个好的编程实践(Eclipse也建议不要这样做),但它在两种情况下很有用,(1)命名方法完全符合它的预期,(2)使用它来变形它反射.

希望这可以帮助.

标签:java,oop

来源: https://codeday.me/bug/20190927/1824583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值