在深入本模块之前,让我们回顾一下【day11】中的关键内容:
extends
用于实现类继承。new
的对象。super
:代表父类引用,用于调用父类构造、成员变量和成员方法。this
:代表当前对象,用于区分重名的成员变量和局部变量。本模块我们将探索接口和多态的概念,包括:
instanceof
判断类型。接口是Java中一种定义标准和规则的方式,它允许类实现一个或多个接口,从而确保类遵循特定的规范。
接口:是一个引用数据类型,是一种标准,规则
public interface 接口名 {
// 抽象方法、默认方法、静态方法、成员变量
}
public class 实现类名 implements 接口名 {
// 实现接口中的抽象方法
}
public interface USB {
public abstract void open();
public abstract void close();
}
public class Mouse implements USB {
@Override
public void open() {
System.out.println("鼠标打开");
}
@Override
public void close() {
System.out.println("鼠标关闭");
}
}
public class Test01 {
public static void main(String[] args) {
Mouse mouse = new Mouse();
mouse.open();
mouse.close();
}
}
public interface USB {
public abstract void open();
}
public default 返回值类型 方法名(形参){
方法体
return 结果
}
public interface USB {
public default void methodDef() {
System.out.println("我是默认方法");
}
}
public class Mouse implements USB {
@Override
public void methodDef(){
System.out.println("我是重写接口中的默认方法");
}
}
public class Test01 {
public static void main(String[] args) {
Mouse mouse = new Mouse();
mouse.methodDef();
}
}
public static 返回值类型 方法名(形参){
方法体
return 结果
}
public interface USB {
public static void methodSta() {
System.out.println("我是接口中的静态方法");
}
}
public interface USB {
public static final int NUM1 = 100;
}
当一个类实现多个接口时,如果接口中的抽象方法有重名且参数一样的,只需要重写一次
public interface InterfaceA {
public abstract void method();
}
public interface InterfaceB {
public abstract void method();
}
public class InterfaceImpl implements InterfaceA,InterfaceB{
@Override
public void method() {
System.out.println("重写的method方法");
}
}
当一个类实现多个接口时,如果多个接口中默认方法有重名的,且参数一样的,必须重写一次默认方法
public interface InterfaceA {
public abstract void method();
public default void methodDef(){
System.out.println("我是接口A中的默认方法");
}
}
public interface InterfaceB {
public abstract void method();
/* public default void methodDef(){
System.out.println("我是接口B中的默认方法");
}*/
public default void methodDef(int a) {
System.out.println("我是接口B中的默认方法");
}
}
public class InterfaceImpl implements InterfaceA,InterfaceB{
@Override
public void method() {
System.out.println("重写的method方法");
}
/* @Override
public void methodDef() {
System.out.println("重写后的默认方法");
}*/
}
public class Test01 {
public static void main(String[] args) {
InterfaceImpl anInterface = new InterfaceImpl();
anInterface.methodDef();
anInterface.methodDef(10);
}
}
面向对象三大特征: 封装、继承 、多态
多态是面向对象编程的三大特征之一,它允许父类引用指向子类对象,从而在运行时动态决定调用哪个类的方法。
public abstract class Animal {
public abstract void eat();
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗啃骨头");
}
//特有方法
public void lookDoor(){
System.out.println("狗会看门");
}
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
//特有方法
public void catchMouse(){
System.out.println("猫会捉老鼠");
}
}
public class Test01 {
public static void main(String[] args) {
//原始方式
Dog dog = new Dog();
dog.eat();//重写的
dog.lookDoor();//特有的
Cat cat = new Cat();
cat.eat();//重写的
cat.catchMouse();//特有的
System.out.println("==================");
//多态形式new对象
Animal animal = new Dog();//相当于double b = 10
animal.eat();//重写的 animal接收的是dog对象,所以调用的是dog中的eat
// animal.lookDoor(); 多态前提下,不能直接调用子类特有成员
Animal animal1 = new Cat();
animal1.eat();//cat重写的
}
}
new
的对象。多态提高了程序的扩展性和灵活性。通过多态,我们可以编写出更通用、更灵活的代码,使得代码更容易维护和扩展。
Animal animal = new Dog();
Dog dog = (Dog) animal;
向下转型可能会抛出ClassCastException
,因此在向下转型之前,我们可以使用instanceof
进行类型检查。
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
}
定义笔记本类,具备开机,关机和使用USB设备的功能。具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,不然鼠标和键盘的生产出来无法使用; 进行描述笔记本类,实现笔记本使用USB鼠标、USB键盘
public interface USB {
void open();
void close();
}
public class Mouse implements USB {
@Override
public void open() {
System.out.println("鼠标开启");
}
@Override
public void close() {
System.out.println("鼠标关闭");
}
//特有方法
public void click() {
System.out.println("点击鼠标");
}
}
public class KeyBoard implements USB {
@Override
public void open() {
System.out.println("键盘开启");
}
@Override
public void close() {
System.out.println("键盘关闭");
}
public void input() {
System.out.println("敲击键盘");
}
}
public class NoteBook {
//开机
public void start(){
System.out.println("开机");
}
//使用USB
/*
USB usb = mouse 多态
USB usb = keyBoard 多态
*/
public void useUSB(USB usb){
if (usb instanceof Mouse){
Mouse mouse = (Mouse) usb;
mouse.open();
mouse.click();
mouse.close();
}else{
KeyBoard keyBoard = (KeyBoard) usb;
keyBoard.open();
keyBoard.input();
keyBoard.close();
}
//usb.open();
//usb.close();
}
//关机
public void stop(){
System.out.println("关机");
}
}
public class Test01 {
public static void main(String[] args) {
NoteBook noteBook = new NoteBook();
Mouse mouse = new Mouse();
noteBook.start();
noteBook.useUSB(mouse);
noteBook.stop();
System.out.println("===========");
KeyBoard keyBoard = new KeyBoard();
noteBook.start();
noteBook.useUSB(keyBoard);
noteBook.stop();
}
}