目录
一、多态
(一)多态的形象理解
(1)生活中的多态
1、H2O根据不同的温度产生不同的形态
条件 | 形态 | 该形态的名称 |
常温常压 | 液态 | 水 |
标压100℃以上 | 气态 | 水蒸气 |
标压0摄氏度以下 | 固态 | 冰 |
2、龙生九子,各有不同
(2)多态在其他语言中的表现
1、HTML
<input> 根据不同的type属性值,展示不同的形态
- type=”text” 文本框
- type=”password” 密码框
- type=”button” 按钮
(二)JAVA中的多态
(1)主角
父类(与继承不同,继承的重心和主角都是子类)
(2)含义
一个父类 根据 创建不同的子类,调用同一个方法,产生不同的结果
(3)多态的前提条件(必须全部满足)
1、必须出现在继承体系中
2、必须具备方法的重写
3、必须满足一种写法“向上转型”
向上转型 引用是 父类 ,对象是 子类(父类引用指向子类对象)
例子:
写法1: Role role = new Hero();
写法2:Hero hero = new Hero();
Role role = hero ;
写法3:Hero hero = new Hero();
Enemy en =new Enemy();
WildMonster Wild = new WildMonster();
Role[] arr = {hero,en,wild};
(4)多态的验证:
在满足以上三个条件的基础上,所有的创建出来的子类对象调用同一个方法,产生不同的结果。
(5)多态的常见写法
1、当数组的类型是父类类型时,所有的子类对象都能存进数组中。
2、当方法的形式参数是父类的类型时,所有的子类对象都能传进来
3、当方法的返回值类型是父类类型时,所有的子类对象都能返回出来
(6)多态的优势
让程序更加的灵活,提高代码的扩展性
(7)多态的劣势
在多态的环境中,对象名无法直接访问子类特有的方法(只能访问重写的父类方法)
解决方法:向下转型
例子:
Hero 类有 backhome 方法而Role类没有,那么:
((Hero)role).backhome();
二、接口
引用数据类型 :数组、对象
对象:类、接口
(一)接口关键字
interface
(二)接口与类对比
类 | 接口 |
成员属性 | 默认都是常量 public static final (修饰符可以省略) 常量命名规范:全部字母大写 多个单词使用下划线分割 |
构造方法 | 不允许写(意味着无法实例化) |
成员方法 | 默认都是抽象方法(jdk 1.8之后,若要使用普通方法,需在方法声明前加上 default 关键字) |
(三)接口作用
1、设计
2、规定/协议
(四)实现关系
(1)接口为了继承体系中的实现关系做铺垫
(2)含义
类与接口之间的关系(师徒关系)
(3)关键字
implement
class A implements 接口B,接口C,接口D
(4)特点
类A必须重写接口中所有的抽象方法,除非A是个抽象类
(五)案例
模拟计算机中USB接口加载和运行
- USB 接口
- 电脑类
- 鼠标类
- 键盘类
- 测试类
package demo02;
public interface USB {
//USB驱动程序的方法
void driver();
}
package demo02;
public class Mouse implements USB{
@Override
public void driver() {
// TODO Auto-generated method stub
System.out.println("鼠标的驱动加载完毕!鼠标可以运作!");
}
}
package demo02;
public class KeyBoard implements USB{
public KeyBoard() {
// TODO Auto-generated constructor stub
}
@Override
public void driver() {
// TODO Auto-generated method stub
System.out.println("键盘的驱动加载完毕!键盘可以运作!");
}
}
package demo02;
public class Computer {
private USB[] usbArr ;
public Computer() {
// TODO Auto-generated constructor stub''
usbArr = new USB[3];
}
public USB[] getUsbArr() {
return usbArr;
}
public void setUsbArr(USB[] usbArr) {
this.usbArr = usbArr;
}
//电脑加载所有USB程序的方法
public void loadUSB() {
for (int i = 0; i < usbArr.length; i++) {
if(usbArr[i]!=null) {usbArr[i].driver();}
}
}
}
package demo02;
public class Test01 {
public static void main(String[] args) {
Computer pc = new Computer();
Mouse m = new Mouse();
KeyBoard k =new KeyBoard();
//插入USB
pc.getUsbArr()[0] = m;
pc.getUsbArr()[1] = k;
pc.loadUSB();
}
}