看继承这一块时对一部分东西感到混乱,所以写了个test代码,记录如下。
package fatherandson;
public class Father {
public int a; //被重写
public int b; //被继承
private int c; //不被子类继承
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
Father(){
}
Father(int a,int b,int c){
this.a=a;
this.b=b;
this.c=c;
}
}
package fatherandson;
public class SonA extends Father{
public int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void func(){
super.a=5;
}
public void g() {
System.out.println("SonA:super.a="+super.a);
}
}
package fatherandson;
public class SonB extends Father{
public int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void func(){
super.a=10;
}
public void g() {
System.out.println("SonA:super.a="+super.a);
}
}
package fatherandson;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
SonA sona=new SonA();
SonB sonb=new SonB();
sona.a=10;
sonb.a=20;
//System.out.println();
System.out.println("sona.a="+sona.a);
System.out.println("sonb.a="+sonb.a);
//关于隐藏的变量
System.out.println("---------------------------------------");
System.out.println("关于隐藏的变量");
sona.func();
sona.g();
sonb.func();
sonb.g();
sona.g();
//关于继承的变量
System.out.println("---------------------------------------");
System.out.println("关于继承的变量");
sona.b=10;
sonb.b=20;
System.out.println("sona.b="+sona.b);
System.out.println("sonb.b="+sonb.b);
//关于未继承的私有变量
System.out.println("---------------------------------------");
System.out.println("关于未继承的变量");
sona.setC(10);
sonb.setC(20);
System.out.println("sona调用继承方法操作c:"+sona.getC());
System.out.println("sonb调用继承方法操作c:"+sonb.getC());
}
}
关于不被继承的变量(如上面的private变量c), 课本是这么描述的:
当用子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量被分配内存,而且父类的成员变量也都分配了内存空间,但只将其中一部分,即子类继承的那部分成员变量,作为分配给子类对象的变量。
父类中的private成员变量尽管分配了内存空间,也不作为子类对象的变量,当然他们也不是父类某个对象的变量,因为我们根本就没有使用父类创建对象,只有从父类继承的一部分方法可以操作这部分未继承的变量。
上述话听起来像是父类把已分配内存的能继承的变量给了子类的对象,不被继承的属于父类,那当我再创建一个对象时,这些子类的未继承变量是相同的都属于父类的变量(一个对象操作未继承的变量,另一个对象输出那个变量的值也变了)。我原以为这部分未继承的变量属于父类这样,但其实不是,从运行结果可以看出每个子类对象通过继承的方法操作的未继承变量都是无关的。所以应该是每个子类对象初始化时都分别与父类分配内存的变量建立了一种关系,这些子类对象之间互相无关。
什么叫继承呢?所谓子类继承父类的成员变量作为自己的一个成员变量,就好像它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作,也就是说,一个子类继承的成员应当是这个类的完全意义的成员,如果子类中定义的实例方法不能操作父类的某个成员变量,该成员变量就没有被子类继承。所谓子类继承父类的方法作为子类中的一个方法,就像是它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。
当使用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。这样子类创建对象时,父类的成员变量也被分配了内存空间。
我不知道是父类分配内存的变量分配给子类对象,还是子类先继承有哪些变量然后子类对象因为是子类实例而有哪些变量,但可以知道的是继承的变量就当是在子类中声明的一样,隐藏的归关键字super拥有,重写的也是在子类中声明的一样,父类中未继承的变量每个子类对象的情况都不一样。(原因即红字部分)