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("内部類實作監聽");
}
}
}
- 實作效果