什么方法隐藏实际使用?
我想知道隐藏在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()' } }
在上面, B
的method()
版本隐藏了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()
。 我再次提到该对象对结果没有任何影响(除非你想要计算创建对象的数量。)我希望它对你有用。