Java继承中子类和父类的私有变量

按照我之前的理解,父类的私有变量只有当前类能访问,子类不能访问,所以子类不能继承父类的私有变量。子类可以通过get set方法访问到父类的私有变量,那么,这个访问的变量是哪里的?是父类变量的?还是子类实际上是继承了父类的私有变量,get set访问的就是子类的(可是set方法里面是this.xx = xx; this表示当前对象,也就是子类实例化的对象,按理说没有访问父类私有变量的权限)?带着这些疑问,我重新开始思考,子类到底能不能继承父类的私有变量。

public class Category{
	private int id;
	private String name;
	public int getId(){
		return id;
	}
	public void setId(int id){
		this.id = id;
	}
	public int getName(){
		return name;
	}
	public void setName(int name){
		this.name= name;
	}
	@Override
	public String toString(){
		return "Category [id="+id+",name="+name+"]";
	}
	public void giao(){
		System.out.println("giao");
	}
}
public class CategoryExtend extends Category{
	List<Integer> list;
	public int getList(){
		return list;
	}
	public void setList(int list){
		this.name= name;
	}
	@Override
	public String toString(){
		return "CategoryExtend [list="+list+",getId()="+getId()+",getName()="
		+getName()+",getClass()="+getClass()+",toString()="+super.toString()+"]";
	}
}
public class CategoryTest{
	public static void main(String args[]){
		CategoryExtend categoryExtend = new CategoryExtend();
		categoryExtend.setId(5);
		categoryExtend.setName("lil xan");
		List<Integer> vector = new Vectory<>();
		vector.add(1);
		vector.add(2);
		categoryExtend.setList(vector);
		System.out.println(categroyExtend);
		categroyExtend.giao();
	}
}

程序的运行结果是这样的

CategoryExtend [list=[1,2], getId()=5, getName()=lil xan,getClass()=class CategoryExtend,toString()=Category [id=5, name=lil xan]]
giao

通过运行结果,我们可以看到在子类的toString()中,调用了super.toString(),然后打印出了Category对象,它的id和name的值正是和子类实例化对象使用set方式设置的值。我们都知道,在实例化子类对象是,会自动调用父类的构造器,是不是说这个set get方法指向的是实例化子类对象的过程中实例化出来的父类对象呢?
带着这个疑问,我们使用debug对代码进行分析,可以看到实例化的子类对象是包含id和name两个属性的(图后面上),也就是说子类是可以继承父类私有变量的,但是无法直接访问。那么子类通过set get方法访问父类私有变量又是怎么回事呢?在网上我找到了一个说法,实例化子类对象会调用父类构造器,子类对象实际上是有父类对象跟子类特有的部分组装起来的,通过super和this关键字可以对子类对象资源进行访问,super只能访问父类部分资源,this可以访问父类部分资源,也可以访问子类特有部分资源,优先访问子类特有部分资源。套到上面的代码,可以解释为,子类的toString()方法中,super.toString()调用的是父类部分的资源,所以打印了Category [id=5, name=lil xan]。子类通过set()方法里面的关键字this,首先扫描子类有无相关属性,没有,然后去父类资源访问。
按照我目前对Java的理解,上面这种说法我还是比较认可的,但是毕竟通过debug也无法再深入更深的底层进行分析,所以这个推理也算是“假说——演绎”,等哪天发现不对再修改吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值