玩转Java面向对象编程:理解多态
最编程
2024-08-02 22:11:46
...
java多态
- 多态概念
- 对象的上下转型
多态概念
多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
多态存在的三个必要条件:
- 需要存在继承和实现关系
- 同样的方法调用而执行不同操作、运行不同代码(重写)
- 在运行时,父类或者接口的引用变量可以引用其子类的对象
多态的作用:
- 多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离
- 多态消除了类型之间的耦合关系
- 多态的存在提高了程序的拓展性和后期的可维护性
简单案例:
abstract class Animal
{
String name;
abstract public void eat();
}
class Animal
{
String name;
public void eat(){};
}
class Dog extends Animal
{
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗吃骨头");
}
}
class Cat extends Animal
{
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼");
}
}
public class Test {
public static void main(String[] args) {
Animal an1 = new Dog();
Animal an2 = new Cat();
an1.eat();
an2.eat();
}
}
执行结果:
对象的上下转型
- 由子类转型成父类,在继承图上是向上移动的,一般称为向上转型。
- 向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集
- 向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法。
- 向下转型,不安全(可能需要instanceof操作符协助)
向上转型:
Animal an1 = new Dog();
instanceof运算符用来运行时通过返回值来指出对象是否是特定类或者是它是子类的一个实例
用法:
result = object instanceof class
result:布尔类型
object:必选项,任意对象表达式
class:必选项,任意已定义的对象类
说明:如果 object 是 class 或其子类的一个实例,则 instanceof 运算符返回true,如果不是,或者 object 是null,则返回false。
使用场合:
在对对象做向下转型之前,没有其它有关对象信息时,务必使用 instanceof 来判断一下,以避免抛出ClassCastException异常。
abstract class Animal
{
String name;
abstract public void eat();
}
class Dog extends Animal
{
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗吃骨头");
}
public void sleep(){
System.out.println("狗睡觉");
}
}
class Cat extends Animal
{
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼");
}
}
public class Test {
public static void main(String[] args) {
Animal an1 = new Dog(); //向上转型
Animal an2 = new Cat(); //向上转型
an1.eat();
//an1.sleep(); //向上转型后的方法丢失,所以不能使用
an2.eat();
if(an2 instanceof Cat){ //向下转型要判断一下,an2是不是Cat类型的实例化
Cat cat = (Cat)an2; //向下转型
cat.eat();
}
}
}
执行结果:
多态案例应用:
class School
{
public DaYingJi dayingji;
public void anZhuang(DaYingJi dayingji){
this.dayingji = dayingji;
}
public void daYin(String contex){
dayingji.print(contex);
}
}
class DaYingJi
{
String PinPai;
public void print(String contex){
}
}
class CaiSeDaying extends DaYingJi
{
public void print(String contex) {
// TODO Auto-generated method stub
System.out.println("彩色打印机:"+contex);
}
}
class HeiBaiDaying extends DaYingJi
{
public void print(String contex) {
// TODO Auto-generated method stub
System.out.println("黑白打印机:"+contex);
}
}
public class Test {
public static void main(String[] args) {
School s = new School();
CaiSeDaying c = new CaiSeDaying();
s.anZhuang(c);
s.daYin("yang");
HeiBaiDaying h = new HeiBaiDaying();
s.anZhuang(h);
s.daYin("杨");
}
}
执行结果:
上一篇: 理解多态性:一种强大的编程概念
下一篇: 理解面向对象编程的三个重要特性