-1

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

5 回答 5

5

首先,这不是一种覆盖形式。(重写发生在方法被继承,而static方法在 Java 中不被继承。)

这被称为“隐藏”......但有点错觉。访问隐藏的静态方法或字段非常容易。因此,这种“技术”并不是特别有用。

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

所以我的建议是避免隐藏而不是寻找使用它的地方。(事后看来,如果 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()inB的版本隐藏了 in 的版本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()'

看起来我们正在调用实例方法......直到你打第三个method()电话。


还有另外两个术语——“遮蔽”和“遮蔽”——适用于不同的上下文:

  • 阴影是内部作用域中的名称重新声明外部作用域中的名称。

  • 模糊是您将名称用于成员、类型和/或包的地方。这个你真的想避免,因为它会导致非常混乱的代码。但幸运的是,您必须无视 Java 的标识符样式规则才能被此烧毁。

于 2013-07-01T12:42:29.303 回答
2

正如您所说,“方法隐藏”没有特定用途。相反,这是在子类中使用相同的静态方法签名的结果。

于 2013-07-01T12:41:48.127 回答
0

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

根据Oracle 教程

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

于 2013-07-01T12:38:36.807 回答
0

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

这意味着如果您使用Parent类的类型调用静态方法,则会从专利类调用原始静态,反之,如果您使用Child类的类型调用静态方法,则会调用子类的方法。简而言之,您不能覆盖 Java 中的静态方法

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

于 2013-07-01T12:41:45.173 回答
-1

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

我想用一个例子为你清除它。将其MyClass视为Car类并视为MyClass2类(假设您正在为bus汽车公司编程!)并且还认为现在如果您想了解该公司生产的汽车数量,您应该使用(其中还包含附加代码。 ) 但如果您想了解您使用的巴士生产数量。我再次提到该对象对结果没有任何影响(除非您想计算已创建对象的数量。)我希望它对您有用。public static void myMethod()NumberOfProducedCar.NumberOfProduced()Bus.NumberOfProduced()

于 2013-07-01T12:51:23.093 回答