莆田人做的网站,旅游网站课程设计,网站推广优化怎样,北京 设计 网站建设什么是多态#xff1f;
多态是在继承/实现情况下一种现象#xff0c;表现为#xff1a;对象多态和行为多态。
同一个对象#xff0c;在不同时刻表现出来的不同形态。 多态的前提#xff1a; 要有继承/实现关系 要有方法的重写 要有父类引用指向子类对象。 多态的具体代码…
什么是多态
多态是在继承/实现情况下一种现象表现为对象多态和行为多态。
同一个对象在不同时刻表现出来的不同形态。 多态的前提 要有继承/实现关系 要有方法的重写 要有父类引用指向子类对象。 多态的具体代码体现
People类
package cn.ensource.d1_polymorphism;// 父类
public class People {public void run() {System.out.println(人类快跑);}
}
Teacher类
package cn.ensource.d1_polymorphism;public class Teacher extends People{Overridepublic void run() {System.out.println(老师快跑!);}
} Student类
package cn.ensource.d1_polymorphism;public class Student extends People{Overridepublic void run() {System.out.println(学生快跑);}
}
Test类
package cn.ensource.d1_polymorphism;public class Test {public static void main(String[] args) {// 目标认识对象多态、行为多态// 对象多态People p1 new Teacher();People p2 new Student();// 行为多态p1.run(); // 编译看左边运行看右边看真实对象的方法p2.run();}
} 多态的一个注意事项
多态对对象、行为的多态Java中的属性成员变量不谈多态。
package cn.ensource.d1_polymorphism;public class Test {public static void main(String[] args) {// 目标认识对象多态、行为多态// 对象多态People p1 new Teacher();People p2 new Student();// 行为多态p1.run(); // 编译看左边运行看右边看真实对象的方法p2.run();System.out.println(p1.name); // 识别技巧编译看左边运行看左边变量不讲多态性System.out.println(p2.name);}
} 多态中成员访问特点记忆 成员访问特点 成员变量编译看父类运行看父类 成员方方法编译看父类运行看子类 多态使用的好处
在多态的形式下右边对象是解耦合的更便于扩展和维护。 高内聚、低耦合。 定义方法的时候使用父类类型的形参可以接受一切子类对象扩展性强更便利。
提高了程序的扩展性定义方法的时候使用父类型作为参数在使用的时候使用具体的子类型参与操作。
弊端不能使用子类特有的成员。
package cn.ensource.d2_polymorphism;public class Test {public static void main(String[] args) {// 目标认识多态的好处//好处一可以实现解耦合右边对象可以随时切换后续业务随机改变
// People p1 new Student();People p1 new Teacher();p1.run();// 好处二 可以使用父类类型的变量作为形参可以一切子类对象Student s new Student();Teacher t new Teacher();}public static void go(People p) {}
}
多态下会存在一个问题怎么解决
多态下不能使用子类的独有功能。
package cn.ensource.d2_polymorphism;public class Test {public static void main(String[] args) {// 目标认识多态的好处//好处一可以实现解耦合右边对象可以随时切换后续业务随机改变
// People p1 new Student();People p1 new Teacher();p1.run();
// p1.test(); // 无法调用子类的独有功能因为编译时看左边人类是没有这个方法的。// 好处二 可以使用父类类型的变量作为形参可以一切子类对象Student s new Student();Teacher t new Teacher();}public static void go(People p) {}
} 多态下的类型转换问题
类型转换 自动类型转换 父类 变量名 new 子类 强制类型转换子类 变量名 子类父类变量 强类型转换的一个注意事项
存在继承/实现关系就可以在编译阶段进行强制类型转换编译阶段不会报错。
运行时如果发现对象的真实类型与强制后的类型不同就会报类型转换异常ClassCastException的错误出来。 Exception in thread main java.lang.ClassCastException: class cn.ensource.d2_polymorphism.Student cannot be cast to class cn.ensource.d2_polymorphism.Teacher (cn.ensource.d2_polymorphism.Student and cn.ensource.d2_polymorphism.Teacher are in unnamed module of loader app)at cn.ensource.d2_polymorphism.Test.main(Test.java:19)
强转前Java建议
使用instanceof关键字判断当前对象的真实类型再进行强转。 对象回调。 多态中的成员转型 向上转型 父类引用指向子类对象就是向上转型。 向下转型 格式子类 对象名 子类型父类引用。