java多态-继承相关问题的探讨

提出问题:

Demo1
public class CSDN {
	public static void main(String[] args) {
		System.out.println("==================父类引用子类=================");
		Super sup=new Sub();
		System.out.println("count:"+sup.count);
		sup.print();
		System.out.println("==================子类引用子类=================");
		Sub sub=new Sub();
		System.out.println("count:"+sub.count);
		sub.print();		
	}
}
class Super{
	public int count=0;
	public void print(){
		System.out.println("Super here!");
	}
}
class Sub extends Super{
	public int count =1;
	public void print(){
		System.out.println("Sub here!");
	}	
}

Demo1说明的是父类引用子类对象,这是java的向上转型特性,当父类引用子类对象时,如果父类的成员变量被子类覆盖,通过父类调用该变量,获取的是父类的成员变量。如果父类的成员方法被重写,通过父类调用的是子类的成员方法。

//out

==================父类引用子类=================
count:0
Sub here!
==================子类引用子类=================
count:1
Sub here!

Demo2
public class CSDN {
	public static void main(String[] args) {
		System.out.println("==================父类=================");
		Super.print();
		System.out.println("==================子类=================");
		Sub.print();		
	}
}
class Super{
	public static void print(){
		System.out.println("Super here!");
	}
}
class Sub extends Super{
    public static void print(){
		System.out.println("Sub here!");
	}	
}

Demo2说明是通过类名调用类方法。

//out

==================父类=================
Super here!
==================子类=================
Sub here!

Demo3
public class CSDN {
	public static void main(String[] args) {
		Super sup =new Sub();
		sup.addAll();
	}
}
class Super{
	public void add(){
		System.out.println("super add");		
	}
	public void addAll(){
		System.out.println("super addAll");
		add();		
	}
}
class Sub extends Super{
	public void add(){
		System.out.println("sub add");
	}
	public void addAll(){
		System.out.println("sub addAll");
		add();
	}
}

Demo3说明的是子类继承父类,并重写父类的add和addAll方法,addAll方法的实现调用了add方法。当通过父类引用子类对象,调用addAll方法时,其实调用了子类的addAll方法,由于子类中addAll方法调用了add方法,也就调用了子类的add方法。

//out

sub addAll
sub add

Demo4
public class CSDN {
	public static void main(String[] args) {
		Super sup =new Sub();
		sup.addAll();
	}
}
class Super{
	public void add(){
		System.out.println("super add");		
	}
	public void addAll(){
		System.out.println("super addAll");
		add();		
	}
}
class Sub extends Super{
	public void add(){
		System.out.println("sub add");
		super.add();
	}
	public void addAll(){
		System.out.println("sub addAll");
		super.addAll();
	}
}

Demo4说明的父类引用子类对象,同Demo3相同的是存在add和addAll方法,不同的是在子类中的addAll方法,指定调用了父类的addAll方法。那么,父类中的add方法会调用哪一个add方法呢。实验证明,调用了子类的add方法。这是由于java的动态方法调用的特性,成员方法的调用是在运行时决定的。当子类重写了父类的成员方法时,编译器会选择重写后的方法调用,也可以通过在子类中指定super调用父类方法。

//out

sub addAll
super addAll
sub add
super add

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值