前言
关于封装、继承、多态的概念网上有很多的描述,这里就不在重复了。本文仅以自己个人的理解,举个列子来说明他们的作用。
(偏入门,大佬轻喷)
准备工作
举个例子,水果父类Friuts,水果子类Apple、Banana…
/*
水果父类
*/
public class Friuts {
protected String name;
protected double price;
public void Peeling(){
//剥皮方法
System.out.println("Friuts is Peeling");
}
//get set方法省略
子类
/*
* 文件说明:苹果类
*/
public class Apple extends Friuts{
@Override
public void Peeling() {
System.out.println("用水果刀剥皮"); ;
}
}
/*
香蕉类
*/
public class Banana extends Friuts{
@Override
public void Peeling() {
System.out.println("香蕉可以直接用手剥皮");
}
}
进入正题
- 我们在父类里面定义了一个剥皮方法Peeling,并且在子类里面覆写。
- 我们把重复的属性封装在一个父类里面,让子类去继承他们,这样就减少了代码重复,这里就体现了封装和继承的作用
我们来看一下多态的概念:多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法,也就是说具体执行哪个方法在编译期间不知道。
那么这个有什么用呢?
这就要涉及到父类子类的继承了,换句话说,就是可以用子类去初始化父类,当然某些情况也可以用父类去初始化子类
具体请看廖雪峰的博客向上继承和向下继承:传送门
多态的作用
我们来写一个测试类。我们写一个水果篮子friutsList,然后里面添加苹果和香蕉
public class testFriuts {
public static void main(String[] args) {
//水果篮子
List<Friuts> friutsList = new ArrayList<Friuts>(){{
add(new Apple());
add(new Banana());
}};
//剥皮
for(Friuts friuts:friutsList){
friuts.Peeling();
}
}
}
当我们要进行剥皮操作的时候,按道理来说我们是要用Apple.Peeling和Banana.Peeling,那如果有1000个子类,我们就要去new 1000个子类然后去执行他们的方法吗?这个时候就轮到多态出场表演了。
我们用Friuts f1 = new Apple();Friuts f2 = new Banana();
所以我们只需要从水果篮子friutslist里面拿出friuts,然后执行friuts.Peeling()就行了,我们不需要知道这个水果是什么类型,在编译的时候也不知道这个方法会具体执行什么内容。具体执行的时候会根据用哪个子类实例化去执行对应子类重写的方法。