目录
- 多态:
- * 多态的常见形式:
- * 多态中成员访问的特点:
- * 方法调用:
- //变量调用
- // 多态下的类型转换
- //自动类型转化
- //强制类型转换
- //1.将父类(Animal)a 转换成子类(Dog)b,运行可能会出错
- /**2.变量名 instanceof 真实类型
- * 多态的优势
多态:
* 同类型的对象,执行同一个动作,输出不同的行为
//父类,子类共同存在的行为
abstract class Animal{ public String name="动物类"; public abstract void run(); }
//子类1
class Dog extends Animal{ public String name ="dog"; //重写run() public void run(){ System.out.println("dog run"); } }
//子类2,改写父类的方法为自己所用
class Cat extends Animal{ public String name="cat"; //重写run() public void run(){ System.out.println("cat run"); } //自己的miao () public void maio(){ System.out.println("cat 叫"); } }
主函数
public class Main {
public static void main(String[] args) {
/**
* 多态的常见形式:
* 父类类型 对象名称=new 子类构造器;
* 接口 对象名称=new 实现类构造器;
*/
Animal d=new Dog();//构造动物类型的子类1 Animal c=new Cat();
/**
* 多态中成员访问的特点:
* 方法调用:
编译看左边(父类),运行看右边(子类)
- 多态下不能使用子类独有的功能;
*/
d.run();//运行子类1.run() c.run();//运行子类2.run() c.maio();//编译错误
//变量调用
编译看左边,运行也看左边
System.out.println(d.name);//调用:子类1.name 输出:动物类 System.out.println(c.name);//调用:子类2.name 输出:动物类
// 多态下的类型转换
//自动类型转化
Animal a=new Dog();//就是多态的常见形式
//强制类型转换
//1.将父类(Animal)a 转换成子类(Dog)b,运行可能会出错
Dog b=(Dog)a; System.out.println(b.name);//dog
- 有继承或实现关系才可以这样强转
Cat e=(Cat)b; / **子类强转子类报错: * Unresolved compilation problem:Cannot cast from Dog to Cat * /
*/
/**2.变量名 instanceof 真实类型
- 判断instanceof左边变量的对象的真实类型,是否是右边的类型或者右边的子类类型
*/
if(a instanceof Dog){ Dog b=(Dog)a; System.out.println(b.name); }else if(a instanceof Cat){ Cat e=(Cat)a; System.out.println(e.name); } }
/**
* 多态的优势
- 右边对象可以实现解耦合,便于扩展和维护
- 便利性与扩展性:将父类作为定义方法时的参数,该方法可以接收这个父类所有的子类对象
*/
public static void enter(Animal a){ System.out.println("进入"); a.run(); System.out.println("结束"); } } enter(d);//进入 dog run 结束