Java 需要实例变量时使用模板类

Java 需要实例变量时使用模板类,java,oop,Java,Oop,我试图利用父类在多个继承类中重用,但是父类需要一个实例变量才能工作 public class Num { private int a = 1; public int calc() { int c = a + 4; return c; } } public class Two extends Num { private int a = 2; } 每个子类之间的主要区别是它们的实例变量的值。有没有一种方法可以让两个人仍然使用泛型类

我试图利用父类在多个继承类中重用,但是父类需要一个实例变量才能工作

public class Num {
    private int a = 1;

    public int calc() {
        int c = a + 4;
        return c;
    }
}

public class Two extends Num {
    private int a = 2;
}

每个子类之间的主要区别是它们的实例变量的值。有没有一种方法可以让两个人仍然使用泛型类Num中的calc()代码,而不通过简单地将“a”参数设置为其自身的值来覆盖它,或者我的做法完全错误?

只是一个技巧,将a作为输入参数传递给该方法应该可以帮助您:

   public int calc(int a) {
        int c = a + 4;
        return c;
    }
我认为即使您不这样做,那么使用
this
应该使用调用对象的a值:

public int calc() {
    int c = this.a + 4;
    return c;
}
将“a”的初始化放在构造函数中并使其受到保护:

public class Num {
    protected int a;

    public Num() { a = 1; }

    public int calc() {
        int c = a + 4;
        return c;
    }
}

public class Two extends Num {
    public Two() { a = 2; }
}

a
添加受保护的getter,然后它将类似于模板方法:

public class Num {
        public int calc() {
            int c = getA()+ 4;
            return c;
        }

        protected int getA() {
            return 1;
        }
    }

    static class Two extends Num {
        @Override
        protected int getA() {
            return 2;
        }
    }

使
a
受到保护并不是最简单的方法。如果将
a
的初始化放在
Num
的构造函数中,则
Two
也可以调用该构造函数。重用它的逻辑

public class Num {
    private final int a;

    public Num(int a) { 
        this.a = a; 
    }

    public int calc() {
        return a + 4;
    }
}

public class Two extends Num {
    public Two(int a) {
        super(a);
    }
}

了解如何在方法中传递参数以及如何定义get;设置