1. 接口
接口,可以看作是一个特殊的抽象类。一般情况下,一个文件一个类,一个文件中,只能有一个public的类或接口。
- JDK1.8之前:
- 1.所有的方法都是public abstract 修饰的抽象方法,如果不写,默认也是public abstract修饰。
public interface Inter { public abstract void m1();// 使用public abstract修饰,无方法体 void m2();// 默认也是使用public abstract修饰,所以没有方法体 }
- 2.所有的属性,都是public static final修饰的常量(不可变的变量),所以要大写。如果不写,默认仍是public static final修饰的。
public interface Inter { public static final int AGE = ; String NAME;// 报错:The blank final field NAME may not have been initialized }
- 3.类与抽象类是继承关系,使用extends关键字。类与接口是实现关系,使用implements关键字。这里的implements可以看作是一种特殊的继承。
- 4.一个类只能继承自一个父类,一个类可以实现多个接口。即用接口可实现Java中的多继承功能。
- 5.接口与接口之间是继承关系,并且可以多继承。
public interface Inter{ } interface Inter2{ } interface Inter3 extends Inter,Inter2{ }
- 6.接口没有构造方法,不能创建对象。如何使用:通过多态。父类(父接口)的引用指向子(实现)类的对象。
- 7.接口里面没有main方法。
- 1.所有的方法都是public abstract 修饰的抽象方法,如果不写,默认也是public abstract修饰。
- JDK1.8之后
- 1.接口里面可以有静态方法
- 2.接口里面可以有default修饰的方法,称为默认方法。
public interface Inter {
public abstract void m1();
void m2();
// 主方法(静态方法)
public static void main(String[] args) {
}
// 默认方法(default修饰)
public default void m5(){
}
}
- 接口的体现:按钮的监听事件
2.内部类
定义在类中的类(与属性同级)
- 1.成员内部类(与成员(全局)变量相似)
public class MemInner{
private int age;
public class MyMemInner{
System.out.println("我是成员内部类");
}
}
-
2.局部内部类(与局部变量相似)
局部内部类在方法中定义,在定以后直接使用。在JDK1.8之前在局部内部类中,只能使用外部类的属性和final修饰的局部变量;JDK1.8后,不用final修饰的局部变量,使用在局部内部类中时,默认添加final修饰。
public class LocalInner{
public void m(){
int a = ;
// 局部内部类,不能用权限修饰符
class MyLocalInner{
public void method(){
System.out.println("我是局部内部类");
a = ;// 报错,因为age为final修饰不可变
}
}
}
}
-
3.匿名内部类
new + 父类/父接口()的形式来定义并使用类。没有名字,也没有class关键字,也没有extends或implements
public class AnnoInner{
public void m1(InTer inter){
inter.method();
}
public void m2(){
m1(new InTer(){// new + InTer(){...}创建了匿名内部类
@Override
public void method(){
System.out.println("我是匿名内部类");
}
});
}
}
interface InTer{
public abstract void method();
}
- 备注:在下面的swing界面编程代码中将体现内部类的应用
3.重写限制
- 1.发生在父子类中
- 2.同名同参同返回(1.5之后可以返回子类)
-
3.子类的重写方法的修饰符不能比父类的更封闭(要么相同,要么更开放)
public
protected>
default>
private>
- 4.子类重写方法抛出的异常,不能比父类更宽泛
- 5.static修饰的方法会被子类继承,当子类重写静态方法时,方法的实现取决于调用的方法的类:
调用则实现父类方法,父类.
调用则实现子类方法子类.
4.swing界面编程
package cn.ucai.day15;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 监听模式
*
* 在局部内部类中,只能使用外部类的属性和final修饰的局部变量
*/
public class MyFrame extends JFrame {
private JButton btnClick;
public MyFrame() {
// 定义画布(面板)
JPanel pnBasic = new JPanel();
// 设置画布的背景颜色
pnBasic.setBackground(Color.GREEN);
class MyListener1 implements ActionListener {// 局部内部类
// 当鼠标点击按钮时,执行的方法
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("局部内部类实现监听");
}
}
MyListener1 ml = new MyListener1();
// 定义按钮
this.btnClick = new JButton("点我");
btnClick.addActionListener(ml);// 局部内部类实现监听
btnClick.addActionListener(new MyListener2());// 内部类实现监听
btnClick.addActionListener(new ActionListener() {// 匿名内部类实现监听
@Override
public void actionPerformed(ActionEvent e) {
Random ran = new Random();
int ni = ran.nextInt();
// 将ni设置到按钮上面去
btnClick.setText(ni + "");
}
});
// 将按钮添加到画布pnBasic上
pnBasic.add(btnClick);
// 把画布贴到画板上
setContentPane(pnBasic);
// 添加结束程序的方法
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("我的小窗体");
setBounds(, , , );
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
public class MyListener2 implements ActionListener {// 内部类
// 当鼠标点击按钮时,执行的方法
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("内部类实现监听");
}
}
}
- 实现效果
运行代码:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISOxIjNxIDNwITMwgDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)