天天看点

内部类和接口

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("内部类实现监听");
        }
    }
}
           
  • 实现效果

运行代码:

内部类和接口

点击按钮:

内部类和接口

继续阅读