我一直在SCJP学习指南中阅读有关Statics的部分,并提到以下内容:
静态方法无法覆盖, 但他们可以重新定义
重新定义实际意味着什么?是否存在父和子都存在的静态方法,具有相同的签名,但是它们的类名分别引用它们?如:
class Parent
{
static void doSomething(String s){};
}
class Child extends Parent
{
static void doSomething(String s){};
}
引用为:Parent.doSomething();
和Child.doSomething();
?
此外,这同样适用于静态变量,还是仅适用于静态方法?
答案 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