JAVA基础-面向对象-day03

面向对象-day03

12. 多态思想

12.1. 接口

接口是一种约定规范是多个抽象方法的集合(制定规范)

作用:体现了规范和实现相分离的思想,也体现了组件之间低耦合的思想。

12.1.1. 接口定义和多继承性

接口可以认为是一种特殊的类,但是定义类的时候使用class关键字,定义接口使用interface关键字。

public	interface  接口名{
    //抽象方法1();
    //抽象方法2();
    //抽象方法2();
}

接口定义代码:

因为接口的中方法都是公共的抽象方法,所以实际开发中可以省略public abstract

public interface IWalkable {
	(public abstract) void walk();
}

类可以继承,但是只能单继承的,接口也可以继承接口,但是却可以继承多个接口,也就是说一个接口可以同时继承多个接口

可行走规范:

public interface IWalkable {
	void walk();
}

可游泳规范:

public interface ISwimable {
	void swim();
}

两栖动物规范,即可以游泳,又可以行走。

public interface IAmphibiable  extends IWalkable,ISwimable{
}

此时子接口能继承所有父接口的方法。

12.1.2. 接口实现类

和抽象类一样,接口是不能创建对象的

实现类,类和接口之间的关系称之为实现关系(implements)。

public class 类名 implements 接口名{
	//覆盖接口中抽象方法
}

在类实现接口后,覆盖接口中的抽象方法,完成功能代码,此时接口和实现类之间的关系:

  • 接口:定义多个抽象方法,仅仅定义有哪些功能,却不提供实现。
  • 实现类:实现接口,覆盖接口中抽象方法,完成功能具体的实现。

如果实现类没有全部实现接口中的方法,要么报错,要么把实现类设置为抽象类

12.2. 多态

多态时面向对象三大特征:封装、继承、多态。

在继承关系,是一种”is A”的关系,也就说子类是父类的一种特殊情况,有如下代码:

public class Animal{}
public class Dog extends Animal{}
public class Cat extends Animal{}

public class Dog extends Animal{}

public class Cat extends Animal{}

那么我们可以认为狗和猫都是一种特殊的动物,那么可以使用动物类型类来表示狗或猫。

Dog 	d 	= 	new Dog();  	//创建一只狗对象,赋给子类类型变量
Animal  a  	=	new Cat();    	//创建一只猫对象,赋给父类类型变量

Animal a = new Cat(); //创建一只猫对象,赋给父类类型变量

此时对象(a)具有两种类型:

  • 编译类型:声明对象变量的类型——>Animal
  • 运行类型:对象的真实类型 ——>Dog

当编译类型和运行类型不一致的时候,此时多态就产生了:

注意:编译类型必须是运行类型的父类或接口。

所谓多态,表示一个对象具有多种形态。

在这里插入图片描述

多态操作有两种定义格式和操作语法:

  • 操作继承关系(开发中不是很多):
父类 变量名 = new 子类();
变量名.方法();
  • 操作实现关系(开发中最频繁):
接口 变量名 = new 实现类();
变量名.方法();

12.2.3. 多态时方法调用问题

把子类对象赋给父类变量,此时调用方法:

Animal a = new Cat();
a.shout();

那么a对象调用的shout方法,是来自于Animal中还是Cat中?判断规则如下:

一张图,看懂到底调用的是哪一个类中的方法!

在这里插入图片描述

12.2.4. 类型转换和instanceof运算符(了解)

自动类型转换:把子类对象赋给父类变量(多态)

Animal a = new Dog();
Object  obj = new Dog();	//Object是所有类的根类

强制类型转换:把父类类型对象赋给子类类型变量(前提:该对象的真实类型应该是子类类型)

Animal a = new Dog();
Dog	d = (Dog) a;	//正确
Cat c = (Cat) a;	//错误  ClassCastException:类型转换异常,当把一个对 象转换-个 类型不匹配                            的对象时

instanceof 运算符:判断该对象是否是某一个类的实例,在开发中运用不是很多

语法格式:boolean b = 对象A   instanceof  类B;  //判断 A对象是否是 B类的实例?如果是,返回true

代码如下:

Animal a = new Dog();
System.out.println(a instanceof Animal);	//true
System.out.println(a instanceof Dog);		//true
System.out.println(a instanceof Cat);		//false

12.2.5. 多态的好处-USB案例

USB规范接口:

//定义一种规范,用来约束所有的USB设备应该具有的功能
public interface IUSB {
	//USB设备工作的方法
	void swapData();
}

在Mouse和Keyboard类遵循于USB规范——工作的方法名称也就相同了。

public class Mouse implements IUSB{
	
	public void swapData() {
		System.out.println("鼠标在移动");
	}
}

public class Keyboard implements IUSB{
	
	public void swapData() {
		System.out.println("用键盘打字");
	}
}

主板类,在安装方法plugin上也体现出了多态的特征:

public class MotherBoard {
   //IUSB类型可以接受实现类对象  这里的形式参数的类型是IUSB(父类型), 所以可以接收所有该类型的子类型的对象
	public void plugin(IUSB usb) {
		usb.swapData();
	}
}

​ 面向接口编程,体现的就是多态,其好处:把实现类对象赋给接口类型变量,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程。

public class USBDemo {
	public static void main(String[] args) {
		// 创建主板对象
		MotherBoard board = new MotherBoard();
		// 创建鼠标对象
		Mouse m = new Mouse();
		// 创建键盘对象
		Keyboard k = new Keyboard();
		//在主板上安装鼠标
		board.plugin(m);
		//在主板上安装键盘
		board.plugin(k);
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值