我想知道隐藏在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.
}
}
答案 0 :(得分:6)
首先,这不是一种压倒一切的形式。 (当继承方法时会发生覆盖,并且不会在Java中继承static
方法。)
这被称为“隐藏”......但有点像幻觉。访问隐藏的静态方法或字段非常容易。因此,这种“技术”并不是特别有用。
如果有的话,隐藏是一个坏主意,因为它可能是程序错误的来源......或者至少是代码来源看起来像是这样做但实际上正在做某事不同。
所以我的建议是避免隐藏而不是寻找使用它的地方。 (事后看来,如果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()'
}
}
在上文中,method()
中B
的版本隐藏了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的标识符样式规则才能被这种情况所灼烧。
答案 1 :(得分:2)
您调用“方法隐藏”没有特定用途。相反,它是在子类中使用相同的静态方法签名的结果。
答案 2 :(得分:0)
如果在超类中有静态方法,并且如果在子类中创建具有相同签名的方法,则在使用超类引用时将调用超类方法,如果是,则调用子类方法使用子类引用。对静态方法的调用在编译时自行解决。因此MyClass.myMethod()
将调用父类方法,而MyClass1.myMethod()
将调用子类方法。
如果子类定义的类方法与超类中的类方法具有相同的签名,则子类中的方法会隐藏超类中的方法。
答案 3 :(得分:0)
Java不会在运行时解析方法调用,并且根据用于调用静态方法的Object类型,将调用相应的方法。
这意味着如果你使用Parent类的类型来调用静态方法,那么原始静态将从专利类中调用,另一方面如果你使用Child类的类型来调用静态方法,则会调用来自子类的方法。 简而言之,您无法覆盖Java中的静态方法。
值得一读:java non-static to static method -- hiding or overriding
答案 4 :(得分:-1)
我不明白为什么你创建了你的类的对象,因为它们不是importand在这里,并且在你的问题中没有任何作用。
我想以一个例子为你清除它。将MyClass
视为Car
类并将MyClass2
视为bus
类(考虑您是为汽车公司编程!!)并将public static void myMethod()
视为NumberOfProduced
现在,如果您想了解公司生产的汽车数量,您应该使用Car.NumberOfProduced()
(还有其他代码)。但是如果您想了解您使用的公交车生产数量{ {1}}。我再次提到该对象对结果没有任何影响(除非你想要计算创建对象的数量。)
我希望它对你有用。