目录
- 多态的概念
- 多态的前提
- 多态的作用
- 多态的访问特点
- 方法调用
- 变量调用
- 多态的应用
- 多态的类型转换
- 最后
多态的概念
多态是同一个行为具有多种不同的表现形式
多态的前提
有继承/实现关系
有方法重写
有父类引用指向子类对象。(或者接口指向实现类对象)
多态的作用
增加通用性,可以将一个变量使其可以接收多种类型的变量。
多态的访问特点
方法调用
编译看左边(父类),运行看右边(子类)
编译看左边(能调用什么方法,要看父类,父类没有的方法无法调用),运行看右边(具体的运行效果参照子类)
变量调用
编译看左边(父类),运行也看左边(子类)
(变量没有多态性)
多态的应用
把方法的参数设计为父类,调用时可以接收任意子类,提高代码的扩展性和灵活性
//Animals
public class Animals {
public void eat(){
System.out.println("动物吃饭");
}
}
//Cat
public class Cat extends Animals{
@Override
public void eat() {
System.out.println("猫吃耗子");
}
}
//Dog
public class Dog extends Animals {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
//测试类
public class Person {
public static void main(String[] args) {
feed(new Cat());
System.out.println("---------");
feed(new Dog());
}
/*方法的参数如果定义成Cat或Dog,那就只能传入一种
如果想再传入另一种只能进行方法重载
在这里将参数定义为父类Animals,运用了多态,可以传入多种类型
*/
public static void feed(Animals a) {
System.out.println("开始");
a.eat();
System.out.println("结束");
}
}
多态的类型转换
方法调用:编译看左边,运行看右边
缺点:多态下无法使用子类特有的方法
解决方法:类型转换
在强转时,如果实际类型不匹配,就会造成转换异常
对象名 Instanceof 类名 :对象是否属于类,属于返回true,否则返回false
给Cat和Dog加上特有的方法
//Animals
public class Animals {
public void eat(){
System.out.println("动物吃饭");
}
}
//Cat
public class Cat extends Animals{
@Override
public void eat() {
System.out.println("猫吃耗子");
}
//特有方法
public void games(){
System.out.println("猫玩毛球");
}
}
//Dog
public class Dog extends Animals {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
//特有方法
public void games(){
System.out.println("狗玩飞盘");
}
}
public class Person {
public static void main(String[] args) {
feed(new Cat());
System.out.println("---------");
feed(new Dog());
System.out.println("--------");
//调用特殊方法
skill(new Dog());
skill(new Cat());
}
public static void feed(Animals a) {
System.out.println("开始");
a.eat();
System.out.println("结束");
}
public static void skill(Animals a){
if(a instanceof Cat){
//并没有产生新的对象,而只是进行了类型转换
Cat cat = (Cat) a;
cat.games();
}else if(a instanceof Dog){
Dog dog = (Dog)a;
dog.games();
}
}
}
最后
如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。