java的类是属于单继承的。在继承这一块上我本来有一个很大的误区,就是觉得父类中private定义的成员无法被继承。直到网上的大神给我指出private是可以被继承的,会在内存中,只是在子类的对象中不能被访问到。
下面以一个例子来讲讲我对继承的一些理解。
package 继承;
public class Animal {
// 属性姓名
private String name;
// 属性年龄
private int age;
public Animal(){
System.out.println("无参构造函数测试是哪个对象"+this.getClass());
System.out.println("无参父类构造方法");
}
public Animal(String name,int age){
System.out.println("有参构造函数测试是哪个对象"+this.getClass()); //cat对象
this.say(); //调用子类自己的方法。
System.out.println("有参父类构造方法");
this.name=name;
this.age=age; //在这边的this应该会自己转成子类对象的父类对象部分。
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 方法say
public void say(){
System.out.println("姓名是="+name);
System.out.println("我是一个动物,我叫:"+this.getName()+"我的年龄是:"+this.getAge());
}
public static void main(String[] args) {
System.out.println(111);
}
}
定义了一个类Animal,他有私有成员name跟age,通常父类的私有成员在子类中是不能被访问到的,因此父类中经常用getXXX()和setxxx()方法来对父类的私有成员进行访问控制。
package 继承;
public class Dog extends Animal{
public static void main(String[] args) {
//设置了父类的私有数据成员
Dog dog=new Dog();
dog.setName("Pick");
dog.setAge(1);
dog.say();
System.out.println(dog.getName()); //获得的是父类的。
}
}
执行结果:
以上代码建立了一个继承于父类Animal的子类Dog。当执行Dog dog=new Dog();这句话的时候,其实构造函数是按照以下顺序进行的。
(1)执行父类无参的构造函数
(2)执行子类的默认构造函数,在这边就是什么都不执行。
以上过程可以看做是实例化父类对象跟实例化子类对象。
因为Animal的name跟Age都是用private修饰的,子类无法直接访问赋值,所以通过dog.setName("Pick");
dog.setAge(1);这两个方法去赋值。值得注意的是这两个变量是父类的成员变量,如果用dog.name是会报错的。不过用dog.getname()可以访问到被设置的name的值。在这边我也是想了很久,刚开始一直认为这个设置的name值应该是属于子类的,毕竟是用子类对象去设置的,后面也是纠结了很久才相同,你子类对象根本就访问不到name跟Age,之所以在new子类对象时会先去执行父类的构造函数也就是为了对父类的成员变量赋值。用子类调用的setXXX()跟getXXX()都是为了对父类的private属性进行初始化操作。特别的用this.setxxx()跟this.getXXX().
此外,还有一点需要说明,在父类的构造函数中,若是使用this,例如this.name,其实这边的this指的是子类,this指代的是当前对象,而这边又是有子类new出来的。可能有的又会说那为什么在这边可以使用this.name而不会报错。其实这个我也不是很理解,大概这边的范围已经在父类中了吧,而且这边操作的也是父类的成员。
纯个人理解,希望有错的能有人帮我指出,自学难,但不放弃。