在Java中,如何为父类设置计数器,而不让子类访问计数器?
我有下面的代码,其中我有一个静态计数器字段来跟踪创建了多少父对象。当我创建子类的实例时,父类的计数器也会增加,这是我不希望发生的。有什么帮助吗 这是密码在Java中,如何为父类设置计数器,而不让子类访问计数器?,java,inheritance,static,subclass,super,Java,Inheritance,Static,Subclass,Super,我有下面的代码,其中我有一个静态计数器字段来跟踪创建了多少父对象。当我创建子类的实例时,父类的计数器也会增加,这是我不希望发生的。有什么帮助吗 这是密码 class Parent1 { private String name; private int id; public static int count=0; public Parent1(String name, int id){ this.name=name; this.id
class Parent1 {
private String name;
private int id;
public static int count=0;
public Parent1(String name, int id){
this.name=name;
this.id=id;
count++;
}
}
class Child1 extends Parent1{
private int age;
public Child1(String name, int id, int age){
super(name, id);
this.age=age;
}
}
public class App {
public static void main(String[] args){
Parent1 par= new Parent1("aa",5);
Parent1 par2=new Parent1("bb",10);
System.out.println(Parent1.count);
Child1 chi1= new Child1("aa",5,4);
Child1 chi2=new Child1("bb",5,10);
System.out.println(Child1.count);
}
}
The output is
2
4
在Parent1的构造函数中:
if (getClass() == Parent1.class) // <--
count++;
这样做:
class Parent1 {
private String name;
private int id;
public static int count=0;
public Parent1(String name, int id) {
this(name, id, true);
}
protected Parent1(String name, int id, boolean incrementCount){
this.name=name;
this.id=id;
if( incrementCount )
count++;
}
}
class Child1 extends Parent1{
private int age;
public Child1(String name, int id, int age){
super(name, id, false);
this.age=age;
}
}
//....
Parent1 par= new Parent1("aa",5);
Parent1 par2=new Parent1("bb",10);
加计数-;到子类构造函数。您可以使用以下模式来解决此问题
class Parent1 {
private String name;
private int id;
public static int count=0;
public Parent1(String name, int id){
this(name,id,true);
count++;
}
public Parent1(String name, int id,boolean noIncrement){
this.name=name;
this.id=id;
}
}
class Child1 extends Parent1{
private int age;
public Child1(String name, int id, int age){
super(name, id,true);
this.age=age;
}
}
public class App {
public static void main(String[] args){
Parent1 par= new Parent1("aa",5);
Parent1 par2=new Parent1("bb",10);
System.out.println(Parent1.count);
Child1 chi1= new Child1("aa",5,4);
Child1 chi2=new Child1("bb",5,10);
System.out.println(Child1.count);
}
}
@那么呢?这只会使Child1.count无效,当他创建一个child@paulsm4那不行。超级构造函数仍将在Child1中调用,计数仍将递增。最好是两者都调用,让所有子类调用您描述的子类,只使用public Parent1String name,int id{this name,id,true;}@Prateek,这不是不言自明的吗?在Parent1构造函数中,我们检查我们正在实例化的类是否特别是Parent1,而不是子类。我不熟悉反射,因此我的问题是child1类的超级构造函数中必须有false。