接口
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(); // 笔记本关闭
}
}