题目:设计一个父类Father,从Father派生出子类Son, 继续从Son派生出类Grandson. 用多种方式建立各类对象,最后统计出类族中建立的各类对象以及该类后代对象的数目
分析:java类的继承派生问题。问题的本质就是求各类的构造函数各调用了多少次。但是这里求的是实际上创建的类对象数目,则用调用的构造函数计数的时候,父类实际创建的个数就等于父类构造函数调用的次数减去子类构造的次数。
1.继承和派生的子类自动调用父类的构造函数
2.计数变量,不可以设置成private,虽然变量会继承,也会随着构造函数而自加,如果单纯求各类的构造函数调用次数的话可以,但是求实际对象数目,涉及减法操作,设置成private则无法进行减法修改。
注意:在建立类的对象数组时,要挨个进行new操作才会调用构造函数。
Father类
public class Father{
static int coutf;//创造的次数
static int sumf;//最终人数
int age;
Father(){
coutf++;
sumf++;
}//默认构造函数
Father(int age){//带参数构造函数
coutf++;
sumf++;
this.age=age;
}
public static int getCout(){//返回cout1值
return coutf;
}
public static int getSum(){
return sumf;
}
public static void setCout(){//预设cout值
coutf=0;
sumf=0;
}
}
Son类
public class Son extends Father{
static int couts;//重载变量
static int sums;
Son(){
couts++;
sums++;
sumf--;
}
Son(int age){
couts++;
sums++;
sumf--;
this.age=age;
}
public static int getCout(){//重载getCout
return couts;
}
public static int getSum(){
return sums;
}
}
Grandson类
public class Grandson extends Son{
static int coutg;//重载变量cout
static int sumg;
Grandson(){
coutg++;
sumg++;
sums--;
}
Grandson(int age){
coutg++;
sumg++;
sums--;
this.age=age;
}
public static int getCout(){//重载函数getCout
return coutg;
}
public static int getSum(){
return sumg;
}
}
main类
public class Example_3{
public static void main(String args[]){
Father.setCout();//设置类变量cout=0
Son.setCout();
Grandson.setCout();
System.out.println("预设:创造对象的总次数"+Father.getCout()+" "+Son.getCout()+" "+Grandson.getCout());
System.out.println("预设:创造对象的最终数目"+Father.getSum()+" "+Son.getSum()+" "+Grandson.getSum());
//Father
Father f1=new Father();//调用空的构造函数
Father f2=new Father(40);//调用带参数的构造函数
Father[] fstr=new Father[10];//建立对象数组(只开辟了空间,没有调用构造数组)
for(Father t:fstr){//为数组的每个对象调用构造函数
t=new Father();
}
System.out.println("第一次:创造对象的总次数"+Father.getCout()+" "+Son.getCout()+" "+Grandson.getCout());
System.out.println("第一次:创造对象的最终数目"+Father.getSum()+" "+Son.getSum()+" "+Grandson.getSum());
//Son
Son s1=new Son();
Son s2=new Son(10);
Son[] sstr=new Son[10];
for(Son t:sstr){
t=new Son();
}
System.out.println("第二次:创造对象的总次数"+Father.getCout()+" "+Son.getCout()+" "+Grandson.getCout());
System.out.println("第二次:创造对象的最终数目"+Father.getSum()+" "+Son.getSum()+" "+Grandson.getSum());
//Grandson
Grandson g1=new Grandson();
Grandson g2=new Grandson(70);
Grandson[] gstr=new Grandson[10];
for(Grandson t:gstr){
t=new Grandson();
}
System.out.println("第三次:创造对象的总次数"+Father.getCout()+" "+Son.getCout()+" "+Grandson.getCout());
System.out.println("第三次:创造对象的最终数目"+Father.getSum()+" "+Son.getSum()+" "+Grandson.getSum());
}
}