类的扩展

class P {
	public int x=1;
	public void setX(int x) {
		this.x=x;
	}
	public int getX() {
		return x;
	}

}
class Pi extends P{
	public int x=2;
	public int z=3;
	public void setX(int x) {
		this.x=x+10;
	}
	public void setXi(int x) {
		this.x=x+20;
	}
}
class Demo {
	public static void main(String[] args) {
		Pi pi=new Pi();
		P p=pi;
		/*当一个超类类型的引用指向一个子类类型的具体对象时,不能利用该引用访问超类中未定义的成员*/
		//System.out.println(p.z);//报错
		//p.setXi(1);  //报错

		/*父类的非静态域被隐藏*/
		System.out.println(p.x);//1
		System.out.println(pi.x);//2
		/*非静态方法被继承,又被改写。不存在隐藏这一说法。只存在一个setX()方法,
所以不管是p.setX(5);还是pi.setX(6);即不管用哪个引用来操作,都是调用的改写后的方法*/
		p.setX(5);
		System.out.println(p.x);//1
		System.out.println(pi.x);//15
		pi.setX(6);
		System.out.println(p.x);//1
		System.out.println(pi.x);//16
	}
}
/*既然是new Pi();的空间,那么不管是用P类型的引用还是Pi类型的引用指向,这块空间是Pi类型的是确定的,
那么就要考虑Pi类里有啥??
首先是自己定义的x,z,所以继承来的x被隐藏。setX()getX()被继承,同时setX()被改写,又自己定义了setXi()。
这就是这块空间里存在的东西。即3个域,3个方法。上面的输出是啥都要基于这块空间有啥来判断*/
class P {
	public int x=1;
	public void setX(int x) {
		this.x=x;
	}
	public int getX() {
		return x;
	}

}
class Pi extends P{
	public int x=2;
	public int z=3;
	
	public void setXi(int x) {
		this.x=x+20;
	}
}
class Demo {
	public static void main(String[] args) {
		Pi pi=new Pi();
		P p=pi;
		

		/*父类的非静态域被隐藏*/
		System.out.println(p.x);//1
		System.out.println(pi.x);//2
		/*非静态方法被继承。只存在一个setX()方法,但是这个方法所操作的非静态域x有两个,
一个是父类的被隐藏的,一个是子类的*/
		/*子类继承下来的方法操作继承下来的域*/
		p.setX(5);
		System.out.println(p.x);//5
		System.out.println(pi.x);//2
		pi.setX(6);
		System.out.println(p.x);//6
		System.out.println(pi.x);//2
	}
}
class SuperClass {
	int x=10;
	void method0() {method1();}
	void method1() {
		x=11;
	}
}
class SubClass extends SuperClass {
	int x=100;
	void method1() {	x=2;	}
	public static void main(String[] args) {
		SubClass rSub=new SubClass();
		SuperClass rSuper=rSub;
		rSub.method0();//或者	rSuper.method0();
		System.out.println(rSuper.x+","+rSub.x);//10,2
	}}
/*
子类继承了父类的method0(),继承并改写了method1()。对于子类来讲只有一个改写后的method1()和直接继承的method0()。
调用rSub.method0();或者	rSuper.method0();内部仍然调用改写后的method1(),对子类的x进行操作,操作不到被隐藏的父类x
*/
class SuperClass {
	int x=10;
	void method0() {method1();}
	private void method1() {System.out.println("call SuperClass method1");
		x=11;
	}
}
class SubClass extends SuperClass {
	int x=100;
	void method1() {	System.out.println("call SubClass method1");x=2;	}
	public static void main(String[] args) {
		SubClass rSub=new SubClass();
		SuperClass rSuper=rSub;
		rSub.method0();//或者	rSuper.method0();
		System.out.println(rSuper.x+","+rSub.x);
	}}
	/*	call SuperClass method1
		11,100
	*/

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值