接口、多态

接口

1、接口中的方法全部为抽象方法

2、接口中无法定义普通的成员变量

定义抽象方法:固定格式
public abstract 返回值类型 方法名字(参数列表) //均为公共方法

public interface MyInterface {
    public abstract void function(); 
}

定义成员变量,必须为常量
固定格式:public static final 数据类型 变量名 =public static final int a = 1;
类实现接口
public class InteraceImpl implements MyInterface{
    public void function(){
        System.out.println("实现类,重写接口抽象方法");        
    }
}
接口中成员的特点

成员变量:

public static final int x = 3;

注意:public static final 修饰符,在接口的定义中可以省略不写,三个修饰符,还可以选择性书写
public interface MyInterface {
    //public static final int x = 3;
    int a = 5;
}

成员方法:

public abstract 返回值类型 方法名(参数)

注意:public abstract可以不写
public interface MyInterface {
    public abstract void function();
    void fucntion2();
}

接口不可以创建对象

子类必须重写接口中所有的抽象方法,子类才可以实例化,不然子类是一个抽象类

接口可以多实现

子类如果同时实现多个接口,必须重写所有接口中的所有抽象方法,才能实例化

接口可以多继承

实现类需重写接口的所有抽象方法

public interface A {
    public abstract void a();
}
public interface B {
    public abstract void b();
}
public interface C extends A,B{
    public abstract void c();
}

public class D implements C{
    @Override
    public void a() {
    }
    @Override
    public void b() {
    }
    @Override
    public void c() {
    }
}

多态

Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。

最终多态体现为父类引用变量可以指向子类对象。

多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。

在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法

//普通类
public class Fu {
    public void show(){
        System.out.println("父类");
    }
}
public class Zi extends Fu{
    public void show(){
        System.out.println("子类");
    }
}

//抽象类
public abstract class Animal {
    public abstract void eat();
}
public class Cat extends Animal{
    public void eat(){
        System.out.println("猫吃猫粮");
    }
}

//接口
public interface Smoking {
    public abstract void smok();
}
public class Student implements Smoking{
    public void smok(){
        System.out.println("学生在抽烟");
    }
}

public class Test {
    public static void main(String[] args) {
        //公式:父类类型或者是接口类型  变量  =  new  子类对象()
        Fu f = new Zi();
        f.show();

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

        Smoking s = new Student();
        s.smok();
    }
}
多态中成员的特点

成员变量:编译的时候,参考父类中有没有这个变量,如果有,编译成功

​ 运行的时候,运行的是父类中的变量值

成员方法::编译的时候,参考父类中有没有这个方法,如果有,编译成功

​ 运行的时候,运行的是子类的重写方法

instanceof关键字

比较引用数据类型:比较一个引用类型的变量,是不是这个类型的对象

//引用变量 instanceof 类名

public class Test {
    public static void main(String[] args) {
        Person p = new Student();
        //Person p = new Teacher();
        p.sleep();

        boolean b = p instanceof Student;
        System.out.println(b);
    }
}
多态转型

多态的转型分为向上转型与向下转型两种:

1、向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。

使用格式:

父类类型  变量名 = new 子类类型();

如:Person p = new Student();

2、向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!

使用格式:

子类类型 变量名 = (子类类型) 父类类型的变量;:Student stu = (Student) p;  //变量p 实际上指向Student对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGLtBNkZ-1586873807068)(E:\Typora\workspace\多态转型.png)]

举例

定义USB接口(具备开启功能、关闭功能),笔记本要使用USB设备,即笔记本在生产时需要预留可以插入USB设备的USB接口,即就是笔记本具备使用USB设备的功能,但具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,不然鼠标和键盘的生产出来无法使用

进行描述笔记本类,实现笔记本使用USB鼠标、USB键盘

1、USB接口,包含开启功能、关闭功能

2、笔记本类,包含运行功能、关机功能、使用USB设备功能

3、鼠标类,要符合USB接口

4、键盘类,要符合USB接口

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

class Mouse implements USB {
	public void open() {
		System.out.println("鼠标开启");
	}
	public void close() {
		System.out.println("鼠标关闭");
	}
}

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(); // 创建笔记本实体对象
		nb.run(); // 笔记本开启
		
		Mouse m = new Mouse(); // 创建鼠标实体对象
		nb.useUSB(m); // 笔记本使用鼠标  多态向上转型

		KeyBoard kb = new KeyBoard(); // 创建键盘实体对象
		nb.useUSB(kb); // 笔记本使用键盘

		nb.shutDown(); // 笔记本关闭
	}
}

void main(String[] args) {
NoteBook nb = new NoteBook(); // 创建笔记本实体对象
nb.run(); // 笔记本开启

	Mouse m = new Mouse(); // 创建鼠标实体对象
	nb.useUSB(m); // 笔记本使用鼠标  多态向上转型

	KeyBoard kb = new KeyBoard(); // 创建键盘实体对象
	nb.useUSB(kb); // 笔记本使用键盘

	nb.shutDown(); // 笔记本关闭
}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值