1、多态,NIIT培训 铸就辉煌IT人生,目标:,多态 对象造型(Casting ) instanceof运算符 关键字static final,为什么使用多态(1),宠物生病了,需要主人给宠物看病 不同宠物看病过程不一样不同宠物恢复后体力值不一样,打针,吃药,吃药,疗养,狗狗,Q仔,为什么使用多态(2),编写主人类 编写给狗狗看病的方法 编写给Q仔看病的方法 编写测试方法 调用主人类给狗狗看病的方法 调用主人类给Q仔看病的方法,public class Master public void Cure(Dog dog) if (dog.getHealth() 50) dog.setHealth(6
2、0);System.out.println(“打针、吃药“);public void Cure(Penguin penguin)if (penguin.getHealth() 50) penguin.setHealth(70);System.out.println(“吃药、疗养“); ,主人类, Master master = new Master(); master.Cure(dog); master.Cure(penguin); ,测试方法,为什么使用多态(3),如果又需要给XXX看病,怎么办? 添加XXX类,继承Pet类 修改Master类,添加给XXX看病的方法,使用多态优化设计,频繁
3、修改代码,代码可扩展性、可维护性差,为什么使用多态(4),使用多态优化后的代码, Pet pet = new Dog(); Master master = new Master(); master.Cure(pet); ,测试方法,public class Dog extends Pet public void toHospital() this.setHealth(60);System.out.println(“打针、吃药“); ,public class Penguin extends Pet public void toHospital() this.setHealth(70);Syst
4、em.out.println(“吃药、疗养“); ,public class Master public void Cure(Pet pet) if (pet.getHealth() 50)pet.toHospital(); ,主人类,Dog类,Penguin类,1,2,3,4,又要给XXX看病时,只需: 1. 编写XXX类继承Pet类(旧方案也需要) 2. 创建XXX类对象(旧方案也需要) 3. 其他代码不变(不用修改Master类),如何实现多态(1),用多态实现打印机 分为黑白打印机和彩色打印机 不同类型的打印机打印效果不同,黑白打印机,彩色打印机,打印,如何实现多态(2),使用多态实现
5、思路 编写父类 编写子类,子类重写父类方法 运行时,使用父类的类型,子类的对象,计算机可以连接各种打印机,无论连接何种打印机打印方法都相同,根据连接打印机不同,效果也不同,如何实现多态(3),编码实现,实现多态的两个要素: 1. 方法重写 2. 使用父类类型,abstract class Printer()print(String str); ,class ColorPrinter ()print(String str) System.out.println(“输出彩色的“+str); ,class BlackPrinter ()print(String str) System.out.pri
6、ntln(“输出黑白的“+str); ,public static void main(String args) Printer p = new ColorPrinter();p.print();p = new BlackPrinter();p.print(); ,父类,子类,运行,同一种操作方式,不同的操作对象,只能调用父类已经定义的方法,多态总结,多态在Java中,子类的对象可以替代父类的对象使用。 Java引用变量与所引用对象间的类型匹配关系: 1. 一个对象只能属于一种确定的数据类型,该类型自对象创建直至销毁不能改变。 2. 一个引用类型变量可能引用(指向)多种不同类型的对象既可以引用
7、其声明类型的对象,也可以引用其声明类型的子类的对象。 引用类型数组元素相当于引用类型变量,多态性也同样适用: 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。 方法声明的参数类型为父类类型,可以使用子类的对象作为实参调用该方法:,对象造型(Casting ),引用类型数据值之间的强制类型转换称为类型转换,具体规则如下: 从子类到父类的类型转换可以自动进行; 在多态的情况下,从父类到子类的类型转换必须通过造型(强制类型转换)实现; 无继承关系的引用类型间的转换是非法的。,instanceof运算符,运算符instanceof用于检测一个
8、对象的真正类型。,关键字static,在Java类中声明属性、方法和内部类时,可使用关键字static作为修饰符。 static标记的属性或方法由整个类(所有实例)共享,如访问控制权限允许,可不必创建该类对象而直接用类名加.调用。 static成员也称“类成员”或“静态成员”,如“类属性”、“类变量”、“类方法”、“静态方法”等。 static属性由其所在类(包括该类所有的实例)共享,而非static属性则必须依赖具体/特定的对象(实例)而存在。 static方法 Static初始化块:在类的定义体中、方法的外部可包含static语句块,static块仅在其所属的类被载入时执行一次,通常用于初
9、始化化static (类)属性,而非static的初始化块在创建对象时被自动调用 静态导入用于在一个类中导入其他类或接口中的static成员,语法格式: import static * 或: import static double d = sin(PI*0.45); /double d = Math.sin(Math.PI*0.45);,关键字final,在声明Java类、变量和方法时可以使用关 键字final来修饰,以使其具有“终态”的特性: final标记的类不能被继承。 final标记的方法不能被子类重写。 final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。 final标记的成员变量必须在声明的同时或在每个构造方法中显式赋值,然后才能使用。 final不允许用于修饰构造方法、抽象类以及抽象方法。,