在Java中重新定义静态方法意味着什么?

时间:2011-07-07 11:25:51

标签: java scjp

我一直在SCJP学习指南中阅读有关Statics的部分,并提到以下内容:

  

静态方法无法覆盖,   但他们可以重新定义

重新定义实际意味着什么?是否存在父和子都存在的静态方法,具有相同的签名,但是它们的类名分别引用它们?如:

class Parent
{
   static void doSomething(String s){};
}

class Child extends Parent
{
   static void doSomething(String s){};
}

引用为:Parent.doSomething();Child.doSomething();

此外,这同样适用于静态变量,还是仅适用于静态方法?

3 个答案:

答案 0 :(得分:17)

它只是意味着这些功能不是虚拟的。例如,假设您有一个(运行时)类型的对象Child,它是从Parent类型的变量引用的。然后,如果您调用doSomething,则会调用Parent的doSomething方法:

Parent p = new Child();
p.doSomething(); //Invokes Parent.doSomething

如果方法是非静态的,Child的doSomething将覆盖Parent的child.doSomething,并且会调用{{1}}。

静态字段也是如此。

答案 1 :(得分:6)

静态意味着每个类有一个,而不是每个对象一个。对于方法和变量都是如此。

静态字段意味着存在一个这样的字段,无论该类创建了多少个对象。有关覆盖静态字段的问题,请查看Is there a way to override class variables in Java?。简而言之:无法覆盖静态字段。

考虑一下:

public class Parent {
 static int key = 3;

 public void getKey() {
  System.out.println("I am in " + this.getClass() + " and my key is " + key);
 }
}

public class Child extends Parent {

 static int key = 33;

 public static void main(String[] args) {
  Parent x = new Parent(); 
  x.getKey();
  Child y = new Child();
  y.getKey();
  Parent z = new Child();
  z.getKey();
 }
}

I am in class tools.Parent and my key is 3
I am in class tools.Child and my key is 3
I am in class tools.Child and my key is 3

Key永远不会返回33.但是,如果你覆盖getKey并将其添加到Child,那么结果将会有所不同。

@Override public void getKey() {
 System.out.println("I am in " + this.getClass() + " and my key is " + key);
}
I am in class tools.Parent and my key is 3
I am in class tools.Child and my key is 33
I am in class tools.Child and my key is 33

通过覆盖getKey方法,您可以访问Child的静态密钥。

答案 2 :(得分:0)

在rajah9的回答中,如果现在我们在父和子中使这两个方法都是静态的:

public static void getKey() {
        System.out.println("I am in and my key is " + key);
    }

现在要注意两件事: 不能使用'this.getClass()'和警告'来自类型Parent的静态方法getKey()应该以静态方式访问'也

Parent z = new Child();
  z.getKey();

会给出输出

I am in class tools.Parent and my key is 3

而不是

I am in class tools.Parent and my key is 33