Java多态的理解

面向对象编程有三大特性:封装,继承,多态。本文主要介绍一下自己对java中多态的理解。


要想清楚的理解什么是多态,就必须要了解“向上转型”这个概念。 下面我们通过一个例子来介绍向上转型。

public class Person {
	
	private void eat(){
		System.out.println("Person is eating");
	}
	
	protected void sleep(){
		System.out.println("Person is sleeping");
	}

	public void play(){
		System.out.println("Person is playing");
	}
	
}

public class Student extends Person {
	
	public void study(){
		System.out.println("Student is studying");
	}
	
}

public class Main {

	public static void main(String[] args) {
		
		Student s = new Student();   //实例化Student类的对象
		s.study();  
		s.play();   
		s.sleep();
		
		Person p = s;   //向上转型
		p.play();      
		p.sleep();
		
	}
}

上面代码中定义了两个类:Person类和Student类。Student类继承自Person类。 

Person类中有三个方法:私有方法eat(), 保护方法sleep(),公有方法play()。

因为Student类继承自Person类,则Person类中的protected方法和public方法可以被继承下来。所以Student类拥有三个方法:sleep(),play(), study()。这三个方法可以被Student类对象调用。


Person p = s;    该行代码即实现了所谓的“向上转型”操作。 所谓“向上转型”,即:将子类对象的引用转换为父类的引用。

该行代码中,s为子类Student类的引用,p为父类Person类的引用。


那么进行向上转型操作后,会有什么效果呢,也就是说我们要弄清父类引用p可以调用哪些方法。

既然向上转型为父类引用,则p只可以调用父类的方法,而且只能是父类中可以被子类继承的方法(这样说不太严谨,暂且先不考虑方法的重写)。换句话说,子类的新方法都会被遗弃。向上转型之后,父类引用所能调用的方法,相对子类对象引用所能调用的方法来说,会变窄。


明白了上述“向上转型”之后,我们接下来,再看下面的代码:

public class Person {
	
	private void eat(){
		System.out.println("Person is eating");
	}
	
	protected void sleep(){
		System.out.println("Person is sleeping");
	}

	public void play(){
		System.out.println("Person is playing");
	}
	
}

public class Student extends Person {
	
	public void study(){
		System.out.println("Student is studying");
	}
	
	public void play(){
		System.out.println("Student is playing");
	}
	
}

public class Worker extends Person{

	public void work(){
		System.out.println("Worker is working");
	}
	
	public void play(){
		System.out.println("Worker is playing");
	}
	
}

public class Main {

	public static void main(String[] args) {
		
		Person p1 = new Student();
		p1.play();
		
		Person p2 = new Worker();
		p2.play();
	}
}

上述代码的变化之处在于:父类中有play()方法,而其两个子类中也都分别有play()方法。则子类中的方法将会覆盖父类中的方法。也就是说,当我们写如下代码时:

Student s = new Student();

s.play();

代码将会输出:Student is playing。 由此可知子类覆盖了父类的方法。


而对于上述main方法中的代码来说,我分别实例化了两个子类对象,并将其向上转型为父类引用,当我们运行上述程序之后,我们发现父类引用分别调用了对应的子类中的方法。Such a suprise! 对于这种机制,我们称之为“多态”。


总的来说,多态的实现有三个条件:继承,方法重写,父类引用指向子类对象。

串起来来说就是:子类继承父类,并且子类重写了父类中的方法,我们实例化一个子类对象,并用父类的引用去指向它。父类引用调用重写方法时,会在运行时正确调用对应子类中的方法。


或者说:当我们进行向上转型之后,我们拥有父类的引用,而这个父类的引用只能够调用父类中可以被子类继承的方法。而如果正好父类中的这个方法在子类中进行了重写,那么父类引用在调用这个方法时,将会调用的是子类中的方法,不再是父类中的方法,这便是多态。


参考文献:Java编程思想


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值