网站建设会议,广东手机网站建设报价,网站建设项目执行情况报告模板,网站建设软文文章目录1、多态的介绍2、多态的格式3、对象的强制类型转换4、instanceof 运算符5、案例#xff1a;笔记本USB接口1、多态的介绍
多态#xff08;Polymorphism#xff09;按字面意思理解就是“多种形态”#xff0c;即一个对象拥有多种形态。
即同一种方法可以根据发送对…
文章目录1、多态的介绍2、多态的格式3、对象的强制类型转换4、instanceof 运算符5、案例笔记本USB接口1、多态的介绍
多态Polymorphism按字面意思理解就是“多种形态”即一个对象拥有多种形态。
即同一种方法可以根据发送对象的不同而采用多种不同的行为方式。
一个对象的实际类型是确定的但可以指向对象的引用的类型有很多。 多态存在的条件 有继承基类或 实现 (接口) 关系子类重写父类的方法父类引用变量指向子类对象
注多态是针对实例方法的多态不是属性的多态也不是类方法的多态。
java 引用变量分为两种类型一种是编译时类型一种是运行时类型。
编译时类型由声明该变量时使用的类型决定运行时类型由实际赋值给该变量的对象决定。
如果编译时类型和运行时类型不一致就**可能(重写了方法的话)**出现所谓的多态。
class Person {public void eat() { }
}class Student extends Person {// 重写了基类中的方法public void eat() {}// 子类中特有的方法public void study() {}
}class Applicaton {public static void main(String[] args) {// 不存在多态 编译时类型和运行时类型一致Student s3 new Student();// 不存在多态 编译时类型和运行时类型一致Person s2 new Person();// 存在多态 编译时类型和运行时类型不一致重写了基类中的方法Person s1 new Student();s1.eat();// 报错 原因下方会解释// s1.study();}
}当把一个子类对象直接赋值给父类引用变量时
例如上面的 Person s1 new Student();
这个 s1 的引用变量的编译类型是 Person而运行时类型是 Student当运行时调用该引用变量的方法时其方法行为总是表现出子类方法的行为特征而不是父类方法的行为特征这就可能出现相同类型的变量调用同一个方法时呈现出多种不同的行为特征这就是多态。
这里的相同类型就是指同一个引用变量s1调用同一个方法但指向不同的子类对象时表现出不同的行为特征。
注
1、通过引用变量来直接访问其包含的实例变量时系统总是试图访问它编译时类型定义的实例变量而不是运行时类型所定义的实例变量。
2、引用变量在编译阶段只能调用其编译时类型所具有的方法但运行阶段则可以调用它运行时类型所具有的的方法。
还是上面的例子Person s1 new Student(); s1 引用变量只能调用 Person 类的方法不能直接调用 Student 里独有的方法。 作用 简单来说就是建立一个父类对象的引用变量指向不同的子类对象。
把不同的子类对象都当做父类来看待屏蔽不同子类对象之间的差异写出通用的代码以适应需求的不断变化。
而且无论右边 new 的时候换成了哪个子类对象等号左边的调用方法都不会变化。
2、多态的格式
代码当中体现多态性其实就是一句话父类引用指向子类对象。格式
基类类型 引用变量名称 new 子类类型(); // 通过继承实现
or
接口类型 引用变量名称 new 实现类类型(); // 通过接口实现对象的自动类型 多态的写法其实就是对象的自动类型类型向上转只不过是编译器自动完成的。
注
向上转型一定是成功的这也证实了子类其实是一种特殊的父类。
这种类型转换只是表明这个引用变量的编译时类型是基类运行时类型是子类执行方法时表现的是子类对象的行为方式。
如果想让基类引用变量调用子类中特有的方法就需要进行强制类型转换。
3、对象的强制类型转换
强制类型转换需要借助于类型转换运算符—— (类型)。
类型转换运算符的用法(类型)变量名称
通过类型转换运算符将一个父类引用变量强转成子类引用变量时需要注意一下几点
1、基本类型之间的转换只能在数值类型之间进行。
数值类型整型byte、short、int、long、字符型char、浮点型float、double。
数值类型和布尔类型之间不能进行类型转换。
2、引用类型之间的转换只能在具有继承 or 实现关系的两个类型之间进行如果把两个不相关的类型之间进行转换则会报类型转换异常ClassCastException 示例 Person s1 new Student();
// Person 类中没有 study() 方法 进行强制类型转换
((Student) s1).study();考虑到进行强制类型转换时可能出现的异常因此进行类型转换之前应先通过 instanceof 运算符来判断是否可以成功转换避免出现异常以增强程序的健壮性。
4、instanceof 运算符
使用A instanceof B
作用判断其左边对象指运行时对象是否为其右边类的实例返回 boolean 类型的数据。
如果 A 和 B 不存继承话会出现编译错误。
示例 1
class Animal {}class Cat extends Animal {}class Dog extends Animal {}class Applicaton {public static void main(String[] args) {Animal animal new Dog();if (animal instanceof Dog) {System.out.println(汪汪~);} else if (animal instanceof Cat) {System.out.println(喵喵~);}}
}实例 2
// obj引用变量 编译时类型是 Object运行时类型是String
// 因为Object是所有类、接口的父类所以以下才可通过
Object obj chatGPT;
// String 是 Object 类的实例
System.out.println(obj instanceof Object);
// String 是 String 类的实例
System.out.println(obj instanceof String);
// String 不是 Math 类的实例
System.out.println(obj instanceof Math);
// String 是 Comparable 接口的实例。接口理解成一种特殊的类
System.out.println(obj instanceof Comparable);// 注意这里的 str 没有用多态的写法
String str hello;// 编译不通过str引用变量编译时类型是String和Math没有继承关系
// System.out.println(str instanceof Math);// String 对象是 Object 类的实例
System.out.println(str instanceof Object);5、案例笔记本USB接口
重点接口的基本使用、对象的上下转型以及使用接口作为方法的参数。 Computer 使用 USB接口Mouse、KeyBoards 实现 USB接口 USB 接口 // USB接口类
public interface USB {void open();void close();
}Computer 类 // 电脑类
public class Computer {public void powerOn(){System.out.println(电脑开机);}public void powerOff(){System.out.println(电脑关机);}// 接口作为方法的参数public void useDevice(USB usb){usb.open();if (usb instanceof Mouse){ // 一定要先判断Mouse mouse (Mouse)usb; // 向下转型mouse.click();} else if (usb instanceof KeyBoard) {KeyBoard keyboard (KeyBoard)usb;keyboard.type();}usb.close();}
}Mouse 类 // 鼠标类
public class Mouse implements USB{Overridepublic void open() {System.out.println(打开鼠标);}Overridepublic void close() {System.out.println(关闭鼠标);}public void click(){System.out.println(鼠标点击);}
}KeyBoard 类 // 键盘类
public class KeyBoard implements USB{Overridepublic void open() {System.out.println(打开键盘);}Overridepublic void close() {System.out.println(关闭键盘);}public void type(){System.out.println(键盘输入);}
}Demo02Main 测试类 public class Demo02Main {public static void main(String[] args) {Computer computer new Computer();computer.powerOn();USB usbMouse new Mouse();computer.useDevice(usbMouse);// USB usbKeyBoard new KeyBoard();KeyBoard keyBoard new KeyBoard();computer.useDevice(keyBoard);computer.powerOff();}
}