java extends static_Java中的继承与静态

小编典典

在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().

如你看到的,

调用M1()C1.main(…)引用C1的M1并

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

对M1的调用(不带任何前缀,请参见的第一行main())不会受到多态性的影响,因为C1中的M1不会被C2覆盖。

但是从C2调用将C2的M1称为C2的M1 隐藏 了C1中的那个。

在这里阅读更多。

编辑: 我只是重新阅读了您的问题,并且只看到了有关“良好编程实践”的部分。

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

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

说吧

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()。

所以您可能会问,为什么要麻烦使用此功能?我真的不知道 也许允许对方法进行更灵活的命名。

但是我使用的用法(可能意图也可能不会意图)是通过反射实现的多态性。

由于您可以使用反射按名称获取和调用方法,因此允许它们使用相同的名称将在通过反射进行操作时启用多态。

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

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)使用该方法对它进行多态化反射。

希望这可以帮助。

2020-09-28

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值