天天看點

内部類和接口

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

運作代碼:

内部類和接口

點選按鈕:

内部類和接口

繼續閱讀