什么方法隐藏实际使用?

时间:2013-07-01 12:35:26

标签: java

我想知道隐藏在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.                           
    }
}

5 个答案:

答案 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()将调用子类方法。

根据Oracle tutorial

  

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

答案 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}}。我再次提到该对象对结果没有任何影响(除非你想要计算创建对象的数量。) 我希望它对你有用。