Java - 静态类及其父级初始化

时间:2016-08-15 09:22:07

标签: java inheritance static-methods

我是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课程?它绝对不会像我那样工作。

3 个答案:

答案 0 :(得分:0)

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

当java运行时第一次找到Child时,类加载器将加载Child类及其基类,然后执行类静态字段并阻止init。没有更多来自您的代码。

答案 1 :(得分:0)

  1. 感谢大家。看起来我的问题没有真正正确的答案,我必须学习更好的Java基础知识(比如静态和继承概念)。
  2. 我将使用Therkon建议的解决方法。当我不得不改变父类方法时,这仍然可以改变多个类的行为,它仍然使方法保持静态,所以我可以按照我想要的方式调用它 - Child.getI();
  3. Parent.java

    包MyTest;

    public class Parent {

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

答案 2 :(得分:-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();
        }

    }