接口与多态

interface

接口里定义抽象方法

public interface InterFaceName {
	public abstract void method();
	//可以省略,默认前面带(public abstract)
	void method();
}

实现类,补充接口里抽象的内容

public class Animal implements InterFaceName {
	@Override
	public void method() {
	System.out.println("吃东西");
	}
}

创建对象

public class InterfaceDemo {
public static void main(String[] args) {
// 创建子类对象
	Animal a = new Animal();
// 调用实现后的方法
	a.method();
}
}

默认方法,可以解决接口升级的问题

  • 在接口中新添加抽象方法,使用默认类,不然实现类会报错
public interface InterFaceName {
	public abstract void method();
//新添加的方法,改成默认方法,default
	public default void methodDeafult(){
	System.out.println("这是新添加的默认方法");
	}
}
public class Animal implements InterFaceName {
	@Override
	public void method() {
	System.out.println("吃东西");
	}
}

可以直接调用默认方法

public class InterfaceDemo {
public static void main(String[] args) {
// 创建子类对象
	Animal a = new Animal();
// 调用默认方法,输出+这是新添加的默认方法
	a.methodDeafult();
}
}

接口当中定义静态方法

public interface LiveAble {
public static void run(){
	System.out.println("跑起来~~~");
}
}

调用

public class InterfaceDemo {
public static void main(String[] args) {
// Animal.run(); // 【错误】无法继承方法,也无法调用
//静态方法最简单,接口名称(LiveAble)直接调用,静态跟对象没关系,直接用接口名称调用
	LiveAble.run(); //
}
}

接口常量的定义

public interface LiveAble {
//final 不可变
//public各部分都能用
//static跟对象没关,只与类有关
//不能变的量,要换成大写
	public static final int NUM=10;
}

访问

public class InterfaceDemo {
public static void main(String[] args) {
	System.out.println(MyInterfaceConst.NUM_OF_MY_CLASS);
}
}

关系

  • 一个类可以实现多个接口
  • 接口与接口之间可以多继承,类与类之间是单继承
  • 优先父类

当Fu与MyInterface有重复的默认方法,优先使用父类

 public class Zi extends Fu implements MyInterface 
interface A {
	public abstract void showA();
	public abstract void show();
}
interface B {
	public abstract void showB();
	public abstract void show();

public class C implements A,B{
@Override
	public void showA() {
	System.out.println("showA");
}
@Override
public void showB() {
	System.out.println("showB");
}
//两个接口中都有show()
@Override
public void show() {
	System.out.println("show");
}
}

多态

  • 访问成员变量,等号左边用的是谁优先使用谁,没有则向上找
  • new的是谁,调用的就是谁,因此父子类有相同函数时,先调用的是子类的方法。但父类没有的方法不会往下子类里面找

父类方法

public class Fu{
	int	num=10;
	public void method(){
		System.out.println("父类方法");
}
	public void methodFu(){
		System.out.println("父类方法");
}
}

子类方法

public class Zi{
	int	num=20;
	@override
	public void method(){
		System.out.println("子类方法");
}
}

使用多态

public class InterfaceDemo {
public static void main(String[] args) {
//左父右子
	Fu obj=new Zi();
	//new的是谁,调用的就是谁,因此调用的是**子类的方法**
	//访问方法,看右边
	obj.method();
	obj.methodFu();
	//输出的是父类=10
	System.out.println(obj.num);
}
}

应用场景

  • Employee是固定的,若有新的身份,教授类,实验员类等,只需要new新的子类对象就可以

在这里插入图片描述

对象的上下转型

**向上转型 **,多态的写法
类似于 double num=100;int向上转型成double
创建了一只猫,当做动物看待

Animal animal=new Cat();

向下转型
本来是猫转变成动物,把动物进行还原,还原成猫
类似于int num=(int)10.0; (正确写法)
int num=(int)10.5;(错误写法,精度损失)

Animal animal=new Cat();
Cat cat=(Cat)animal;

查看这个父类引用对象本来是父类还是子类
instanceof 类可以得到一个boolean值

public class Test {
public static void main(String[] args) {
// 向上转型
	Animal a = new Cat();
	a.eat(); // 调用的是 Cat 的 eat
// 向下转型,先判断原型
//判断a的原型是不是Cat
	if (a instanceof Cat){
	Cat c = (Cat)a;
	c.catchMouse(); // 调用的是 Cat 的 catchMouse
}
//判断a的原型是不是Dog
else if (a instanceof Dog){
	Dog d = (Dog)a;
d.watchHouse(); // 调用的是 Dog 的 watchHouse
}
}
}

笔记本案例分析

  • 母口,使用接口,笔记本电脑类,笔记本不管是什么设备统一识别为usb设备
  • USB接口,实现交互
  • 公口,实现接口,鼠标类、键盘类

在这里插入图片描述
接口开关

interface USB {
	void open();// 开启功能
	void close();// 关闭功能
}

笔记本类

class Laptop {
// 笔记本开启运行功能
	public void run() {
	System.out.println("笔记本运行");
}
// 笔记本使用usb设备,这时当笔记本对象调用这个功能时,必须给其传递一个符合USB规则的USB设备
public void useUSB(USB usb) {
// 判断是否有USB设备
	if (usb != null) {
	usb.open();
// 类型转换,调用特有方法,向下转换
if(usb instanceof Mouse){
	Mouse m =Mouse)usb;
	m.click();
}else if (usb instanceof KeyBoard){
	KeyBoard kb = (KeyBoard)usb;
	kb.type();
}
	usb.close();
}
}
	public void shutDown() {
	System.out.println("笔记本关闭");
}
}

usb设备1,鼠标类

class Mouse implements USB {
@override
public void open() {
	System.out.println("鼠标开启,红灯闪一闪");
}
@override
public void close() {
	System.out.println("鼠标关闭,红灯熄灭");
}
public void click(){
	System.out.println("鼠标单击");
}
}

usb设备1,键盘类

class KeyBoard implements USB {
@override
public void open() {
	System.out.println("键盘开启,绿灯闪一闪");
}
@override
public void close() {
	System.out.println("键盘关闭,绿灯熄灭");
}
public void type(){
	System.out.println("键盘打字");
}
}

测试类

public class Test {
public static void main(String[] args) {
// 创建笔记本实体对象
	Laptop lt = new Laptop();
// 笔记本开启
	lt.run();
// 创建鼠标实体对象
	Usb u = new Mouse();
// 笔记本使用鼠标,传参的时候会进行向上转型
	lt.useUSB(u);
// 创建键盘实体对象
	KeyBoard kb = new KeyBoard();
// 笔记本使用键盘,传参的时候会进行向上转型
	lt.useUSB(kb);
// 笔记本关闭
	lt.shutDown();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值