Java - 静态类及其父初始化
问题描述:
我在Java中很新,我希望有人能帮我解决这个问题。Java - 静态类及其父初始化
我必须创建一个方法,将按以下方式调用: Child.getI()
;
Parent.java
package MyTest;
public class Parent {
private static int i;
public Parent(int x){
i = x;
}
public static int getI(){
return i;
}
}
Child.java
package MyTest;
public class Child extends Parent {
public Child(int x) {
super(x);
}
}
我应该如何设计我的课,所以当我打电话Child.getI()
,它会首先初始化Child
类?这绝对不会像我这样做。
答
当您调用Child.getI()
时,您不会调用类实例的方法(不会创建新的对象实例),但是您可以在Class<Child>
上调用它。
当java运行库首次发现Child
时,类加载器将加载Child
类及其基类,然后执行类静态字段并阻止init。你的代码没有更多。
答
你可以这样设计你的代码。这是静态方法的一种解决方案,也是一种没有静态方法的解决方案
Parent.java
package MyTest;
public class Parent {
private int i;
private static int i2;
public Parent(int x){
i = x;
i2 = x;
}
public int getI(){
return i;
}
public static int getI2() {
return i2;
}
}
Child.java
package MyTest;
public class Child extends Parent {
public Child(int x) {
super(x);
}
public static int getI() {
final int i = 3;
final Parent parent = new Child(i);
return parent.getI();
}
public static int getI2() {
final int i = 3;
final Parent parent = new Child(i);
return parent.getI2();
}
}
答
- 感谢大家。看起来我的问题没有真正正确的答案,我必须学习更好的Java基础知识(如静态和继承概念)。
- 我打算使用Therkon建议的解决方法。这仍然给了我改变多个类的行为的可能性,当我只需要改变父类方法时,它仍然使方法变为静态,所以我可以用我想要的方式调用它 - Child.getI();
Parent.java
包MyTest的;
公共类父{
private static int i;
public Parent(int x){
i = x;
}
public static int getI(){
return i;
}
}
Child.java
包MyTest的;
public class Child extends Parent {
public Child(int x) {
super(x);
}
public static int getI() {
final int i = 3;
return ((Parent)new Child(i)).getI();
}
}
你应该真的检查'static'的含义。如果你这样做了,你会注意到'我应该如何设计我的类,所以当我调用Child.getI()时,它将首先初始化Child类'没有什么意义,并且设置'static' 'Parent''Constructor'中的变量'i'不应该是正确的。 – SomeJavaGuy
'static'字段和方法不会被继承。 'i'和'getI()'仅属于'Parent'。如果这是你想要做的事情,那么它会表明你的设计存在问题。通过这样做你究竟在做什么? – JonK
我认为你的第一个错误是从构造函数中设置静态变量。这可以完成并且有时是有用的,但是如果您将其作为初学者来使用,这意味着您不了解构造函数应该做什么。它应该初始化类的当前实例,而不是静态常见的资源。这些应该使用初始化程序或静态块进行初始化,并使用静态方法进行更改。 – RealSkeptic