什么方法隐藏实际使用?

我想知道隐藏在java中的方法的实际用法。

对于前者

class MyClass{ public static void myMethod(){ //some code here } } class MyClass1 extends MyClass{ public static void myMethod(){ //some code here } public static void main(String args[]){ MyClass1 obj1=new MyClass1(); MyClass obj=obj1; MyClass.myMethod(); // this method will run the parent Class method myMethod then what is the use of this practically. } } 

首先,这不是一种压倒一切的forms。 (当inheritance方法时会发生重写,并且不会在Java中inheritancestatic方法。)

这被称为“隐藏”……但有点像幻觉。 访问隐藏的静态方法或字段非常容易。 结果,这种“技术”不是特别有用。

如果有的话,隐藏是一个坏主意,因为它可能是程序错误的来源……或者至少,代码来源看起来像是这样做但实际上做了不同的事情。

所以我的建议是避免隐藏而不是寻找使用它的地方。 (事后看来,如果Java语言将其视为编译错误,可能会更好……)


为了记录,这是一个隐藏的例子:

 public class A { public static String method() { return "'A.method()'"; } } public class B extends A { public static String method() { return "'B.method()'"; } public static void main(String[] args) { System.out.println(A.method()); // prints 'A.method()' System.out.println(B.method()); // prints 'B.method()' System.out.println(method()); // prints 'B.method()' } } 

在上面, Bmethod()版本隐藏了A的版本,但无论如何你都可以调用它。 “隐藏”是一种幻觉。

这是一个示例,显示了它可能导致的问题类型:

 A a = new A(); B b = new B(); System.out.println(a.method()); // prints 'A.method()' System.out.println(b.method()); // prints 'B.method()' b = a; System.out.println(b.method()); // prints 'B.method()' 

看起来我们正在调用实例方法……直到你点击第3个method()调用。


还有另外两个术语 – “阴影”和“模糊” – 适用于不同的环境:

  • 阴影是内部范围中的名称重新声明外部范围中的名称的位置。

  • 模糊是您将名称用于成员,类型和/或包的位置。 这个你真的想避免,因为它导致真正令人困惑的代码。 但幸运的是,你必须蔑视Java的标识符样式规则才能被这种方式所灼烧。

您调用它时,“方法隐藏”没有特定用途。 相反,它是在子类中使用相同的静态方法签名的结果。

如果在超类中有静态方法,并且在子类中创建了具有相同签名的方法,则在使用超类引用时将调用超类方法,如果使用子类则调用子类方法课堂参考。 对静态方法的调用在编译时自行解决。 因此, MyClass.myMethod()将调用父类方法,而MyClass1.myMethod()调用子类方法。

根据Oracle教程 :

如果子类定义的类方法与超类中的类方法具有相同的签名,则子类中的方法会隐藏超类中的方法。

Java不会在运行时解析方法调用,并且根据用于调用静态方法的Object类型,将调用相应的方法。

这意味着如果你使用Parent类的类型来调用静态方法,那么将从专利类中调用原始静态,另一方面如果你使用Child类的类型来调用静态方法,则会调用来自子类的方法。 简而言之,您无法在Java中覆盖静态方法

值得一读: java非静态到静态方法 – 隐藏或覆盖

我不明白为什么你创建你的类的对象,因为它们不是importand在这里,并且在你的问题中没有任何作用。

我想以一个例子为你清除它。 考虑将MyClass作为Car类,并将MyClass2视为bus类(考虑到您正在为汽车公司编程!!)并且如果您想了解公司生产的汽车数量,现在也考虑public static void myMethod()作为NumberOfProduced你应该使用Car.NumberOfProduced() (还有其他代码。)但如果你想了解总线生产的数量,你可以使用Bus.NumberOfProduced() 。 我再次提到该对象对结果没有任何影响(除非你想要计算创建对象的数量。)我希望它对你有用。