一、接口
类和类之间是单继承的关系===>一个子类只能继承一个父类
类和接口之间是多实现的关系===>一个实现类可以实现多个接口
接口和接口之间是多继承的关系===>一个接口可以继承多个接口
1.1 接口的概念
JDK接口中只有抽象类和常量,在JDK8后还可以写入具体的方法
由于接口是规范的,那么规范的就一定是公开的,因此都是public的
关于常量
// 常量-一定要预先进行初始化
// public static final String School_name = "黑马";
String School_name = "黑马";
关于抽象方法
void run();
// public abstract void run();
1.2 接口的实现
接口象征着一种规范
// 定义一个接口类-运动员,每个运动员都要会跑步、比赛。
public interface Sportman {
void run();
void competition();
}
// 定义一个接口类-法律,法律是有一些规则的
public interface Law {
void rule();
}
实现类实现接口,就要实现接口中的所有抽象方法
// 定义一个乒乓球运动员类,他要会执行运动员的所有功能和遵守法律的所有规则
public class PingPongMan implements Sportman,Law{
private String name;
public PingPongMan(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + "必须跑步训练");
}
@Override
public void competition() {
System.out.println(name + "必须竞赛");
}
@Override
public void rule() {
System.out.println(name + "必须遵纪守法");
}
}
1.3 接口之间可以继承
当一个实现类要实现的接口太多的时候,接口的继承就体现了作用
// 定义一个People类-所有的人都会吃饭睡觉
public interface People {
void eat();
void sleep();
}
// 定义一个法律类-法律有自己特定的规则
public interface Law {
void rule();
}
// 定义一个运动员接口类-这个接口可以继承法律类和People类
public interface SportMan extends Law , People{
void run();
void competition();
}
由于接口类继承了,那么在写实现类的时候,可以变得简单一些
// 定义一个运动员类,实现以上三个接口类
// 也可以写成
// public class BasketballMan implements SportMan,Law,People
public class BasketballMan implements SportMan {
@Override
public void rule() {}
@Override
public void eat() { }
@Override
public void sleep() { }
@Override
public void run() { }
@Override
public void competition() { }
}
二、多态
访问特定
方法调用时:编译看左边,运行看右边
变量调用时:编译看左边,运行也看左边
KeyBoard类和Mouse类都继承了USB类
Mouse和KeyBoard都实现了USB类中的installUSB方法
public class Test {
public static void main(String[] args) {
Computer c = new Computer("外星人");
USB u = new KeyBoard("键盘");
c.installUSB(u);
USB u1 = new Mouse("罗技");
c.installUSB(u1);
}
}
三、内部类
3.1 匿名内部类(重要)
本质是一个没有名字的局部内部类
public class Test {
public static void main(String[] args) {
// Animal a = new tiger();
// a.run();
Animal a = new Animal() {
@Override
public void run() {
System.out.println("我会跑欸");
}
};
a.run();
}
}
子类
//class tiger extends Animal{
// @Override
// public void run(){
// System.out.println("老虎跑的快");
// }
//}
// 父类
abstract class Animal{
public abstract void run();
}
格式
Employee a = new Employee(){
public void work(){}
};
a.work();
匿名内部类简化代码情况
public class Test2 {
public static void main(String[] args) {
Swimming s = new Swimming() {
@Override
public void swim() {
System.out.println("学生快乐的游泳");
}
};
go(s);
System.out.println("--------------");
Swimming s1 = new Swimming() {
@Override
public void swim() {
System.out.println("老师游的也快");
}
};
go(s1);
}
public static void go(Swimming s){
System.out.println("开始。。。");
s.swim();
System.out.println("结束。。。");
}
}
class Student implements Swimming{
@Override
public void swim() {
System.out.println("学术快乐的自由泳");
}
}
interface Swimming{
void swim();
}
匿名内部类的应用
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test3 {
public static void main(String[] args) {
JFrame win = new JFrame("登录界面"); // 创建一个窗口
JPanel panel = new JPanel(); // 创建一个桌布
win.add(panel); // 把桌布放在win界面上
JButton btn = new JButton("登录"); // 创建一个按钮
// 匿名内部类为按钮添加一个监听事件
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(win,"点我一下");
}
});
panel.add(btn); // 把按钮添加到桌布上
// 定义一下格式
win.setSize(400,300);
win.setLocationRelativeTo(null);
win.setVisible(true);
}
}