【问题标题】:Override vs Shadowing in Java [duplicate]Java中的覆盖与阴影[重复]
【发布时间】:2013-06-13 18:17:37
【问题描述】:

覆盖和阴影之间有什么区别,特别是这个语句 “静态方法不能在子类中被覆盖,只能被隐藏”

【问题讨论】:

  • 其实叫hiding,不是shadowing。
  • 阴影是(至少在我的经验中)你使用的东西,这样微控制器上的中断就不会搞砸当时正在执行的线程。影子寄存器每次在主线程中更改真实寄存器时都会更新,但当微控制器中断时停止更新,以便在中断例程退出时可以从中恢复寄存器。
  • 嗯,有阴影、遮蔽和隐藏……但他是对的,其中一个相关的继承是隐藏的。当子类中的静态成员隐藏超类中的静态成员时,就会发生隐藏。规范规定:如果一个类声明了一个静态方法 m,那么声明 m 被称为隐藏任何方法 m',其中 m 的签名是 m' 签名的子签名(第 8.4.2 节),在超类和类中的代码可以访问的类的超接口。

标签: java


【解决方案1】:

如果你真的重写了一个方法,你可以在其中的某个时刻调用super() 来调用超类的实现。但是由于static 方法属于一个类,而不是一个实例,因此您只能通过提供具有相同签名的方法来“隐藏”它们。任何类型的静态成员都不能被继承,因为它们必须通过类来访问。

【讨论】:

  • static 成员也可以通过对象实例访问,也可以使用 this.staticVariable,但被认为是不好的做法。
【解决方案2】:

Overrideing... 这个术语指的是多态行为,例如

class A {
   method(){...} // method in A
}

class B extends A {
    @Override
    method(){...} // method in B with diff impl.
}

当您尝试从 B 类调用该方法时,您会获得被覆盖的行为 ..e.g

A myA = new B();
myB.method();   // this will print the content of from overriden method as its polymorphic behavior

但假设您使用静态修饰符声明方法而不是尝试相同的代码

A myA = new B();
myA.method();  // this will print the content of the method from the class A

这是因为静态方法不能被覆盖...... B 类中的方法只是隐藏了 A 类中的方法......

【讨论】:

  • 第二个代码:myB.method(); => 我认为这是错字,你的意思是myA.method(); 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2019-04-12
  • 2010-10-24
相关资源
最近更新 更多