1.概述
多态:同一个事物个体的多种表现形态
比如:一个人在学校里的角色是学生,回到家里是父亲的儿子,爷爷的孙子,老婆的老公,一个人在不同场景下可以有不同的角色。
java中事物的个体就是类的对象,多态就是同一个对象的多种表现形式
java中对象的正常形态通过变量体现,比如:学生类的对象创建出来存到一个变量,变量依托数据类型
Student s = new Student();
java对象的多种形态通过变量的不同数据类型体现
存放一个对象的变量的数据类型可以不一样,但是不能随便写,有要求的。前提:要存在继承或者接口实现关系。
Teacher t = new Student();//不合法
Student 继承Person
Student s = new Student();
Person p = s;//合法
多态体现时的对象也不能是随意的一个对象,应该是子类的对象
接口下的多态
接口:PoliceDog
Dog类实现PoliceDog,相当于继承了这个接口
Dog d = new Dog();
PoliceDog pd = d;
父类或者接口类型的引用,指向子类或者实现类对象
而且多态的存在时合理的
特点:
父类的引用指向子类对象
父类引用:父类类型的变量
指向子类对象:父类类型的变量存放了子类对象的地址值
或
接口类型引用指向实现类对象
接口类型引用:接口类型的变量
指向实现类对象:接口类型的变量存放了实现类对象的地址值
格式:
父类名 变量【对象名】 = new 子类名(实参);
接口名 变量名 = new 实现类(实参);
只要出现上面的格式,就发生了多态
public class Person { //Dog g = new Dog(); }
public class Student extends Person { }
public class UseStudent { public static void main(String[] args) { Student s = new Student(); System.out.println(s); Person p = new Student(); System.out.println(p); } }
2.多态的弊端和好处
一旦产生多态,就相当于缩小了真实类型对象的访问范围,因为只能访问到父类中有的内容,或者是父子类中都出现的内容,子类独有的内容就访问不到了
好处:
增强了代码的扩展性,提升代码复用性
综合案例:
public interface USB { void openIt(); void closeIt(); }
public class KeyBord implements USB{ @Override public void openIt() { System.out.println("打开键盘"); } @Override public void closeIt() { System.out.println("关闭键盘"); } public void use(){ System.out.println("打字"); } }
public class Mouse implements USB { @Override public void openIt() { System.out.println("打开鼠标"); } @Override public void closeIt() { System.out.println("关闭鼠标"); } public void use(){ System.out.println("点击"); } }
public class NoteBook { public void open(){ System.out.println("open"); } public void close(){ System.out.println("close"); } public void useUSBDriver(USB usb){ open(); usb.openIt(); usb.closeIt(); close(); } }
public class Test { public static void main(String[] args) { NoteBook n = new NoteBook(); Mouse m = new Mouse(); n.useUSBDriver(m); KeyBord k = new KeyBord(); n.useUSBDriver(k); } }