1.类的五大成分之一,如果一个类定义在另一个类的内部,这个类就是内部类。

面向对象高级 之  内部类_ide

(1)成院内部类,类中的一个普通成员。

public class test {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer().new Inner();//先新建外部类,再新建内部类
        inner.test();

    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
public class Outer {
    private int age = 20;

    public class Inner {
        public String name;
        private int age = 18;
        public static String school;

        public void test() {
            System.out.println(age);//18
            System.out.println(Outer.this.age);//20

        }

    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

(2)静态内部类。有static修饰的内部类,外部类自己持有。

package com.lzk.test;

public class test {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner();//先新建外部类,再新建内部类
        inner.test();

    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
package com.lzk.test;

public class Outer {
    private int age = 20;
    private static String name = "lzk";
    public static class Inner {
        public String name;

        public static String school;

        public void test() {
           // System.out.println(age);//报错 必须有对象进行访问
            System.out.println(name);//lzk

        }

    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

(3)局部内部类,定义在方法块、代码块、构造器等执行体。

(4)匿名内部类,特殊的局部内部类,匿名指的是程序员不需要为这个类声明名字

public class test {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.cry();
    }
}
    class Dog extends Animal {
        @Override
        public void cry() {
            System.out.println("Woof!");
        }
    }
    abstract class Animal{
        public abstract void cry();
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

这是之前调用cry,需要重写cry方法,有一个机制可以直接得到子类对象,使用这种方法可以更快创建子类对象进行调用

public static void main(String[] args) {
//        Animal dog = new Dog();
//        dog.cry();
        //1.new Animal 会把这个匿名内部类翻译成子类,然后立即创建一个对象出来。
      Animal dog =  new Animal() {
            @Override
            public void cry() {
                System.out.println("Woof!");
            }
        };
      dog.cry();
    }
}
//    class Dog extends Animal {
//    @Override
//        public void cry() {
//            System.out.println("Woof!");
//        }
//    }
    abstract class Animal{
        public abstract void cry();
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

例子:

public class test {
    public static void main(String[] args) {
        Swimming s = new Swimming() {
            @Override
            public void swim() {
                System.out.println("I can swim");

            }
        };
        go(s);
    }
    public static void go(Swimming s){
        System.out.println("-----swim-----");

        s.swim();
    }

    interface Swimming{
        void swim();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

执行结果:

面向对象高级 之  内部类_ide_02

简化:

public class test {
    public static void main(String[] args) {
//        Swimming s = new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("I can swim");
//
//            }
//        };
//        go(s);
        go(new Swimming() {
            @Override
            public void swim() {
            }
        });//把上边那一坨塞到()内

    }
    public static void go(Swimming s){
        System.out.println("-----swim-----");

        s.swim();
    }

    interface Swimming{
        void swim();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

2.内部类在开发中的真是使用场景

(1)可以更方便创建出一个子类对象

(2)匿名内部类通常最为一个参数传输给方法

看看就行了,GUI创建桌面图标的。

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class LoginExample {

    public static void main(String[] args) {
        // 创建主窗口
        JFrame win = new JFrame("登录界面");
        JPanel panel = new JPanel();
        win.add(panel);

        // 创建按钮
        JButton btn = new JButton("登录");
        panel.add(btn);

        // 给按钮添加单击事件监听器
        // btn.addActionListener(new ActionListener() {//这里就是匿名内部类
        //     @Override
        //     public void actionPerformed(ActionEvent e) {
        //         JOptionPane.showMessageDialog(win, "登录一下");
        //     }
        // });

        // 使用简化的Lambda表达式简化代码
        btn.addActionListener(e -> JOptionPane.showMessageDialog(win, "登录一下"));

        win.setSize(400, 400);
        win.setLocationRelativeTo(null);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setVisible(true);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.