/**
1. 描述笔记本,笔记本使用USB鼠标,USB键盘
2. 定义USB接口,笔记本要使用USB设备,即笔记本在生产时需要预留可以插入USB设备的USB接口,即就是笔记本具备使
3. 用USB设备的功能,但具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。
4. 鼠标和键盘要能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,不然鼠标和键盘的生产出来无法使用。
*/
//定义鼠标、键盘,笔记本三者之间应该遵守的规则
interface USB{
void open();//开启功能
void close();//关闭功能
}
//鼠标实现USB规则
class Mouse implements USB{
public void open(){
System.out.println("鼠标开启");
}
public void close(){
System.out.println("鼠标关闭");
}
}
//键盘实现USB规则
class KeyBoard implements USB{
public void open(){
System.out.println("键盘开启");
}
public void close(){
System.out.println("键盘关闭");
}
}
// 定义笔记本
class NoteBook{
//笔记本开启运行功能
public void run(){
System.out.println("笔记本运行");
}
//笔记本使用usb设备,这时当笔记本实体调用这个功能时,必须给其传递一个符合USB规则的USB设备
public void useUSB(USB usb){
//判断是否有USB设备
if(usb != null){
usb.open();
usb.close();
}
}
public void shutDown(){
System.out.println("笔记本关闭");
}
}
public class Test {
public static void main(String[] args) {
//创建笔记本实体对象
NoteBook nb = new NoteBook();
//创建鼠标实体对象
Mouse m = new Mouse();
//创建键盘实体对象
KeyBoard kb = new KeyBoard();
//笔记本开启
nb.run();
//笔记本使用鼠标
nb.useUSB(m);
//笔记本使用键盘
nb.useUSB(kb);
//笔记本关闭
nb.shutDown();
}
}
多态的好处:
提高了程序的扩展性
多态的弊端:
通过了父类引用操作子类对象时,只能使用父类中已有的方法,不能操作子类特有的方法 多态的前提:
必须有继承或者实现的关系
通常都有重写操作
多态成员的特点
- 多态出现后会导致父类中的成员变量有微弱的变化
class Fu
{
int num = 4;
}
class Zi extends Fu
{
int num = 5;
}
class Demo
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);
Zi z = new Zi();
System.out.println(z.num);
}
}
多态成员变量:
子父类中出现同名的成员变量的时候,多态调用该变量的时候,
编译时期看引用变量所属的雷诺中是否有被调用的成员变量,没有,编译失败
运行时期也是调用引用型变量所属的类中的成员变量
所以这种情况的时候编译和运行都是看的左边
- 多态成员函数:
class Fu
{
int num = 4;
void show()
{
System.out.println("Fu show num");
}
}
class Zi extends Fu
{
int num = 5;
void show()
{
System.out.println("Zi show num");
}
}
class Demo
{
public static void main(String[] args)
{
Fu f = new Zi();
f.show();
}
}
编译时期看引用变量所属的类,当所属类中没有该调用的函数,编译失败。
运行时期看引用变量所指的对象所属的类,并运行对象所属类中的成员函数。
编译看左边运行看右边
- 多态静态函数:
class Fu
{
int num = 4;
static void method()
{
System.out.println("fu static method run");
}
}
class Zi extends Fu
{
int num = 5;
static void method()
{
System.out.println("zi static method run");
}
}
class Demo
{
public static void main(String[] args)
{
Fu f = new Zi();
f.method();
}
}
编译看左边,运行看右边
结论
结论:
- 对于成员变量,编译和运行都看左边
- 对于成员函数和静态函数,编译看左边,运行看右边