目录
一、多态小故事
二、走进多态
1、多态继承的三个必要条件
三、具体多态
四、抽象类多态
1、认识抽象类:
2、抽象类的特点:
五、接口类多态
1、认识接口
2、接口类的特点
前言:多态,顾名思义是对象有多种形态。继承是多态的基础,没有继承就没有多态。多态分为具体多态、抽象多态和接口多态。下面我们将从这三个方面具体的为大家介绍多态。
一、多态小故事
多态其实有点像葫芦娃的感觉,七个兄弟,七中不同的能力,他们的思想都传承于爷爷,都要降妖除魔!只是各自的方法不同!
爷爷说:孙儿们啊,一定要长大出掉蝎子精和蛇精啊!
大娃说:爷爷看我的,我用巨石砸死他们!
二娃说:“爷爷别怕我有顺风耳和千里眼!”
三娃说:“爷爷看我用千里眼、顺风耳去帮大娃!”
四娃说:“爷爷我会喷火!,让我烧了他们!”
五娃说:“我会喷水,让我淹了这些妖怪!!!”
六娃说:“我会隐身,我去救哥哥他们!”
七娃说:“爷爷看我,用我的宝葫芦,收了这些妖怪!”
因为爷爷教育葫芦娃要降妖除魔,保卫一方平安!所以每个葫芦娃都有自己的绝招来斩妖除魔!爷爷并没有说怎么除魔!所以每个葫芦娃都有自己的方法!在面对对象的多态里面,“爷爷”就像一个抽象类,“葫芦娃”继承了爷爷的思想,并用自己的方法除魔!每个“葫芦娃”就是子类拥有自己独特的属性和行为。比如火娃能喷火,水娃能喷水,都有自己独特的属性,便有不同的行为!
蛇精的如意,蝎子精也可以用!如意可以理解为一个接口!我可以继承到我的实现类蛇精和蝎子精身上!
讲到这里大概应该有个大概的了解了!那么辉仔带大家更加理论的学习多态!
二、走进多态
多态就是对象面对不同事物,在不同时刻,具有不同的形态。就像你用steam玩游戏,你可能会玩自由城类的GTA5、也有可能玩大逃杀模式PUBG、还有可能玩FPS竞技的CSGO。他们的共性都是通过steam这个游戏平台进行游戏,但是在不同的时刻,具有不同的内容与表现形式。你可以随意在steam添加游戏或者删除游戏,说明了其有很强的扩展性与替换性。并且每个游戏互不冲突,你玩CSGO的时候,不会影响其他游戏的运行。说明了减少了耦合行。
通过steam这个列子我们能发现,多态具有以下优点
优点1:扩展性和替换性强。 优点2:减少了类与类之间的耦合性
优点3:灵活性和简化性。
1、多态继承的三个必要条件
继承、子类重写父类方法、父类引用指向子类对象。
三、具体多态
我个人理解具体类多态,就是父类能够被实例化,可以实现自己的具体行为的。子类可以调用父类的方法和子类自己特有的方法。在实际使用中其实几乎不用。没有多大的意义。所以这里只进行简单的描述。
四、抽象类多态
1、认识抽象类:
什么是抽象类呢?我理解的抽象类是多个具有共性的子类归纳出来的一个父类。是一个由下到上的一个过程。就像中国人用筷子吃饭、印度人用手抓饭、欧洲人习惯用刀叉吃饭。他们的共性就是吃饭的方式,具体的实现都是不同的。是一般到特殊的过程。而他们的共性归纳出了这个抽象类,因为一个父类无法具体实现三种不同的行为,它只需要一种模糊的概念——吃饭的方式,具体怎么吃,那就用子类自己去实现。
2、抽象类的特点:
①抽象类必须用abstract来修饰。
public abstract class 类名 {}
②抽象类中的抽象方法,可以有,也可以没有。但是!没有的话就没啥意义。
public abstract void 方法名();
③抽象如何实例化,采用多态的方式,这就是抽象类的多态。
向上转型:父类 对象名 = new 子类()
编译看父类,执行看子类。缺点:不能实例化子类特有的方法。
向下转型:子类 对象名 = (子类)父类引用
④ 抽象类的成员特点。
❶成员变量 ❷构造方法 ❸成员方法
既可以是变量 空参构造 抽象方法
也可以是常量 空参构造 普通方法
代码测试:
//抽象类
public abstract class Animal {
private int age = 20;
private final String city = "北京";
public Animal() {}
public Animal(int age) {
this.age = age;
}
public void show() {
age = 40;
System.out.println(age);
// city = "上海";
System.out.println(city);
}
public abstract void eat();
}
//猫类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//测试类
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
a.eat();
a.show();
}
}
五、接口类多态
1、认识接口
如果要给接口下定义,那么是这样的,接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。接口注重的是对行为的抽象,而抽象是对属性和行为的抽象。一般情况下类只能继承一个抽象类。所以抽象类主要表达对象根源性问题,就是对象是什么。而接口侧重于对象能做什么。就像学生会跑,狗会跑,他们的共性是跑这样理解就不太对了。学生是人,狗是动物。他们的行为,可以用接口实现。这样抽象类回到了自己的本质工作上,接口就单纯的变成一个体系外的额外功能。说明接口是由上到下,是因为有这个行为,才实例到有需求的类上。
2、接口类的特点
①接口类必须用interface来修饰。
public interface 接口名 {}
②类实现接口用implements表示
public class 类名 implements 接口名 {}
③接口如何实例化,采用多态的方式,这就是接口类的多态。
④ 接口的实例,要不重写接口的抽象方法,要不实例进行抽象。
⑤接口成员特点
❶成员变量
只能是常量,默认修饰符为:public static final
❷构造方法
接口中没有构造方法
❸成员方法
接口中可以有抽象方法,默认修饰符为:public abstract
⑥接口中还可以存在默认方法、静态方法和私有方法
❶默认方法
格式:
public default void show3() { }
解释:
默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字 (public可以省略,default不能省略)。
❷静态方法
格式:
public static 返回值类型 方法名(参数列表) { }
public static void show() {}解释:
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
( public可以省略,static不能省略)
❸私有方法
格式:
private static void method() { }
解释:默认方法可以调用私有的静态方法和非静态方法
静态方法只能调用私有的静态方法
代码测试:
//动物类
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
//跳高接口
public interface Jumpping {
public abstract void jump();
}
//猫类
public class Cat extends Animal implements Jumpping {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void jump() {
System.out.println("猫可以跳高了");
}
}
//测试类
public class Cat extends Animal implements Jumpping {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void jump() {
System.out.println("猫可以跳高了");
}
}
辉仔故事也讲了,理论也讲了,希望大家多多点赞呀!评论!每一次点赞都是对辉仔的激励!!!