2016-08-15 76 views
0

我在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类?这绝对不会像我这样做。

+4

你应该真的检查'static'的含义。如果你这样做了,你会注意到'我应该如何设计我的类,所以当我调用Child.getI()时,它将首先初始化Child类'没有什么意义,并且设置'static' 'Parent''Constructor'中的变量'i'不应该是正确的。 – SomeJavaGuy

+1

'static'字段和方法不会被继承。 'i'和'getI()'仅属于'Parent'。如果这是你想要做的事情,那么它会表明你的设计存在问题。通过这样做你究竟在做什么? – JonK

+4

我认为你的第一个错误是从构造函数中设置静态变量。这可以完成并且有时是有用的,但是如果您将其作为初学者来使用,这意味着您不了解构造函数应该做什么。它应该初始化类的当前实例,而不是静态常见的资源。这些应该使用初始化程序或静态块进行初始化,并使用静态方法进行更改。 – RealSkeptic

回答

0

当您调用Child.getI()时,您不会调用类实例的方法(不会创建新的对象实例),但是您可以在Class<Child>上调用它。

当java运行库首次发现Child时,类加载器将加载Child类及其基类,然后执行类静态字段并阻止init。你的代码没有更多。

-2

你可以这样设计你的代码。这是静态方法的一种解决方案,也是一种没有静态方法的解决方案

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(); 
     } 

    } 
0
  1. 感谢大家。看起来我的问题没有真正正确的答案,我必须学习更好的Java基础知识(如静态和继承概念)。
  2. 我打算使用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(); 
} 

}