当前位置: 首页 > article >正文

Java中GUI编程和内部类的学习

目录

GUI的概念

Swing概述

容器组件

窗口(JFrame)

面板(JPanel)

布局管理器

FlowLayout

BorderLayout

GridLayout

常用组件

事件处理(事件监听)

添加事件监听器(此处即为匿名类)

JOptionPane对话框

内部类

什么是内部类

内部类定义

内部类的特点

匿名内部类

内部类的意义


GUI的概念

       GUI(Graphical User Interface)即图形用户界面,是指采用图形方式显示的用户界面,与早

期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。

Swing概述

   swing 是一个为Java设计的GUI工具包javax.swing,该包中包括了图形用户界面的各种组件支持

   一个 Java 的图形界面,由各种不同类型的“元素”组成,这些“元素”被称为组件(Component)

   swing中的组件可以分为两大类:容器(如窗口,对话框,面板)和功能组件(如按钮,输入框,菜单等)

容器组件

  功能组件不能独立地显示出来,必须将组件放在一定的容器(container)中才可以显示出来。

  容器可以容纳多个组件,通过调用容器的add(Component comp)方法向容器中添加组件。

  窗口(JFrame)和面板(JPanel)是最常用的两个容器。

窗口(JFrame)

   JFrame类用来创建窗体; 我们的类可以直接继承该类, 实现窗体制作。
public class LoginFrame1 extends JFrame{
        public LoginFrame1(){
            //在构造方法中对创建的窗口特征进行设置
            this.setSize(300, 300);//设置窗口大小
            this.setTitle("欢迎登录");//设置标题
            //this.setLocation(500,200);设置窗口位置
            this.setLocationRelativeTo(null);//设置窗口水平垂直居中
            this.setResizable(false);//设置窗口不可以调整大小
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行

            this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
        }


        public static void main(String[] args) {
            new LoginFrame1();//创建一个窗口
        }
    }

面板(JPanel)

    JPanel面板,它是轻量级的容器。

    面板中可以添加其它组件,也可以设置布局,我们一般使用面板来实现布局嵌套。

自己创建Jpanel面板对象,把JPanel作为一个组件添加到窗口或某个面板中

常用方法:

      void setBackground(Color bg)设置面板的背景色,由参数bg指定颜色

      void setLayout(LayoutManager mgr)设置面板的布局,参数是布局管理器

      Component add(Component comp)往面板中添加一个组件

public class LoginFrame2 extends JFrame{
    public LoginFrame2(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行
        //创建面板
        JPanel jPanel = new JPanel();
        //jPanel.setBackground(Color.GREEN);
        jPanel.setBackground(new Color(117, 136, 133));//自定义颜色

        //创建一个功能组件  按钮组件
        JButton jButton = new JButton("保 存");
        //把按钮添加到,面板上
        jPanel.add(jButton);

        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
    }


    public static void main(String[] args) {
        new LoginFrame2();//创建一个窗口
    }
}

布局管理器

swing中,提供了布局管理器类的对象可以管理

       每个Jpanel都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,

就会调用其对应的布局管理器,调用Jpanel的setLayout方法改变其布局管理器对象或通过构造方法

设置。

    Java中的图形界面在布局管理上采用容器和布局管理相分离的方案,也就是说容器只是把组件

放进来,但它不管怎样放置。至于如何放置需要用到布局管理器(Container) 。Java中有几种常

用的布局管理器,分别是:FlowLayout , BorderLayout, GridLayout

FlowLayout

     FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排,

并在默认情况下使组件尽量居中放置。

                         this.setLayout(new FlowLayout());

     FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。

     不改变组件的大小,按组件原有尺寸显示组件,可设置不 同的组件间距,行距以及对齐方式。

构造方法:

    new FlowLayout(FlowLayout.RIGHT,20,40);右对齐,组件之间水平间距20个像素,垂直间距40

个像素。

    new FlowLayout(FlowLayout.LEFT);左对齐,水平和垂直间距为缺省值(5)。

    new FlowLayout();使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)。

public class LoginFrame3 extends JFrame {
    public LoginFrame3(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行
          /*
              创建面板
              面板可以设置布局管理器
              流式布局
                 组件在面板上从左到右排列, 一行占满重新换行   b不影响组件的大小
           */
        //JPanel jPanel = new JPanel(new FlowLayout());//设置流式布局  默认是水平居中 上下左右为5个像素间距
        JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));//设置流式布局  设置组件左对齐  上下左右为5个像素间距
        //JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT,20,50));//设置流式布局  设置组件左对齐 水平 垂直间距
        JButton jButton1 = new JButton("按钮1");
        JButton jButton2 = new JButton("按钮2");
        JButton jButton3 = new JButton("按钮3");
        JButton jButton4 = new JButton("按钮4");
        JButton jButton5 = new JButton("按钮5");

        jPanel.add(jButton1);
        jPanel.add(jButton2);
        jPanel.add(jButton3);
        jPanel.add(jButton4);
        jPanel.add(jButton5);

        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
    }

    public static void main(String[] args) {
        new LoginFrame3();//创建一个窗口
    }
}

BorderLayout

   BorderLayout布局管理器只允许在容器内放置5个组件,这5个组件的位置是由BorderLayout类中

的North、South、East、West和Center5个常量来确定的,他们对应着容器中的上下左右中,用法

如下:

           this.add(new Button(“按钮”) ,BorderLayout.NORTH);

           this.add(new Button(“按钮”) ,BorderLayout.CENTER);

     组件在BorderLayout中的大小都是可以改变的。一般情况下可以让中间区域大一些,而且可以只用其中几个区域。

         BorderLayout将整个容器的布局划分成   东(EAST)       西(WEST)      南(SOUTH) 北(NORTH)中 (CENTER)五个区域,组件只能被添加到指定的区域。

      如不指定组件的加入部位,则默认加入到CENTER区。

      每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。

public class LoginFrame4 extends JFrame {
    public LoginFrame4(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行

          /*
              创建面板
              面板可以设置布局管理器
              边界布局(共有5个区域)
                上北
                下南
                左西
                右东
                中间(是不能少的)
                添加到某个区域的组件,会默认撑开与此区域一样大
           */
        JPanel jPanel = new JPanel(new BorderLayout());

        JButton jButton1 = new JButton("按钮1");
        JButton jButton2 = new JButton("按钮2");
        JButton jButton3 = new JButton("按钮3");
        JButton jButton4 = new JButton("按钮4");
        JButton jButton5 = new JButton("按钮5");

        jPanel.add(jButton1,BorderLayout.NORTH);
        //jPanel.add(jButton2,BorderLayout.SOUTH);
        jPanel.add(jButton3,BorderLayout.WEST);
        //jPanel.add(jButton4,BorderLayout.EAST);
        jPanel.add(jButton5,BorderLayout.CENTER);

        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
    }

GridLayout

     GridLayout布局管理器是矩形网格,在网格中放置组件,每个网格的高度和宽度都相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的大小和创建网格的多少来确定的。其用法如下:

                          this.setLayout(new GridLayout(2 , 3)); //创建一个2行3列的网格

                          this.add(new Button(“按钮”));

     在 GridLayout 构造方法中指定分割的行数和列数

public class LoginFrame5 extends JFrame{
    public LoginFrame5(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行

         /*
              创建面板
              面板可以设置布局管理器
              网格布局
                设置行 列
           */
        JPanel jPanel = new JPanel(new GridLayout(4, 1));

        JButton jButton1 = new JButton("按钮1");
        JButton jButton2 = new JButton("按钮2");
        JButton jButton3 = new JButton("按钮3");
        JButton jButton4 = new JButton("按钮4");

        jPanel.add(jButton1);
        jPanel.add(jButton2);
        jPanel.add(jButton3);
        jPanel.add(jButton4);


        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
    }


    public static void main(String[] args) {
        new LoginFrame5();//创建一个窗口
    }
}

常用组件

标签(JLabel)

     标签是容纳文本和图标的控件,通常用来在界面中标识别的控件。

     构造函数:JLabel()

     创建一个空的标签JLabel(String text)

     创建一个带文本的标签方法:void setText(String text)

     设置标签上的文本String getText()

     获得标签上的文本setFont(new Font(“宋体”,Font.BOLD, 18)); 设置字体

单行文本(JTextField)

     JTextField的构造函数: JTextField(int columns)

方法:

     void setText(String text)    设置文本框中的文本

     String getText()      获得文本框中的文本

密码框(JPasswordField)

构造函数:

     JPasswordField(String text)

     JPasswordField(String text, int columns)

方法:

     char[] getPassword()

public class LoginFrame6 extends  JFrame{
    public LoginFrame6(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行

        /*

         */
        JPanel jPanel = new JPanel(new FlowLayout());
        //标签组件, 可以放文字
        JLabel label = new JLabel("账号");
        //label.setText("密码");
        label.setFont(new Font("楷体", Font.BOLD,20));//设置字体

        //创建输入框组件
        JTextField jTextField = new JTextField(15);
        jTextField.getText();//获得输入框内容

        JLabel label1 = new JLabel("密码");

        //创建密码框
        JPasswordField jPasswordField = new JPasswordField(15);
        //jPasswordField.getText();
        String password = new String(jPasswordField.getPassword());//获取密码


        jPanel.add(label);
        jPanel.add(jTextField);
        jPanel.add(label1);
        jPanel.add(jPasswordField);


        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
    }


    public static void main(String[] args) {
        new LoginFrame6();//创建一个窗口
    }
}
多行文本框(JTextArea)

构造函数:

        JTextArea(int rows, int columns) 创建一个指定行数和列数的空文本域

方法:

      void setText(String text) 设置文本域中的文本

     String getText() 获得文本域中的文本

     void setFont(Font font) 设置文本域中文本的字体

     void setLineWrap(boolean wrap) //是否自动换行,默认false

如果需要文本区自动出现滚动条,可将文本区对象放入滚动窗格(JScrollPane)中:

      JScrollPane scrollPane = new JScrollPane(txtArea);

      add(scrollPane );

按钮(JButton)

构造方法:

     JButton(String text)     创建一个带文本的标签

方法:

    void setBackground(Color bg)    设置按钮的背景色

    void setEnabled(boolean b)      设置启用(或禁用)按钮,由参数b决定

    void setToolTipText(String text)     设置按钮的悬停提示信息

public class LoginFrame7 extends JFrame{
    public LoginFrame7(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行

        /*

         */
        JPanel jPanel = new JPanel(new FlowLayout());

        //创建文本域(多行多列)
        JTextArea area = new JTextArea(10,20);
        area.setLineWrap(true);//设置内容强制换行
        //带滚动条的面板
        JScrollPane  jScrollPane = new JScrollPane(area);

        JButton jButton = new JButton("保存");
        //jButton.setEnabled(false);//设置按钮是否可用
        jButton.setToolTipText("点击保存");



        jPanel.add(jScrollPane);
        jPanel.add(jButton);
        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
    }


    public static void main(String[] args) {
        new LoginFrame7();//创建一个窗口
    }
}

菜单栏组件

     构造方法:JMenuBar();

     方法:add(menu); 向菜单栏添加菜单

菜单组件:

     构造方法:JMenu(“菜单名称");

     方法:add(menuItem); 向菜单添加菜单选项

菜单项组件:

     构造方法:JMenuItem(“菜单项名称");

     将菜单栏添加到窗口   setJMenuBar(menuBar);

public class LoginFrame8 extends JFrame {
    public LoginFrame8(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行
        //创建菜单栏
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单
        JMenu jMenu1 = new JMenu("文件");
        JMenu jMenu2 = new JMenu("编辑");
        JMenu jMenu3 = new JMenu("帮助");
        //创建菜单选项
        JMenuItem jMenuItem1 = new JMenuItem("新建");
        JMenuItem jMenuItem2 = new JMenuItem("保存");
        JMenuItem jMenuItem3 = new JMenuItem("关于我们");

        jMenu1.add(jMenuItem1);
        jMenu1.add(jMenuItem2);
        jMenu3.add(jMenuItem3);

        jMenuBar.add(jMenu1);
        jMenuBar.add(jMenu2);
        jMenuBar.add(jMenu3);

        this.setJMenuBar(jMenuBar);//把菜单栏添加到窗口上
        /*
         */
        JPanel jPanel = new JPanel(new FlowLayout());
        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
    }

    public static void main(String[] args) {
        new LoginFrame8();//创建一个窗口
    }
}

事件处理(事件监听)

    对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前为止,我们编写的图形用

户界面程序都仅仅只是完成了界面,而没有任何实际的功能,要实现相应的功能,必须进行事件处

理。

     用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输入一个字符、点击鼠标

等等;

     当前我们要关注的并不是“事件是如何产生的” ,而是讨论当发生事件后,我们应当“如何处理” 

Java中,事件处理的基本思路如下:

        一个事件源产生一个事件并把它送到监听器那里,监听器一直等待,直到它收到一个事件,

一旦事件被接受,监听器将处理这些事件。

案例

     由于我们想要处理按钮的点击事件,因此,按钮便是事件源。

     监听器类型是ActionListener。

添加事件监听器(此处即为匿名类)

按钮对象.  addActionListener(new ActionListener() {

      // 事件处理

     @Override

        public void actionPerformed(ActionEvent e) {

      执行操作

     }

  }); 

public class LoginFrame9 extends JFrame{
    JTextField jTextField ;
    public LoginFrame9(){
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行
        //创建菜单栏
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单
        JMenu jMenu1 = new JMenu("文件");
        JMenu jMenu2 = new JMenu("编辑");
        JMenu jMenu3 = new JMenu("帮助");
        //创建菜单选项
        JMenuItem jMenuItem1 = new JMenuItem("新建");
        JMenuItem jMenuItem2 = new JMenuItem("保存");
        JMenuItem jMenuItem3 = new JMenuItem("关于我们"); //菜单项就是一个事件源,为事件源添加事件监听,处理程序

        jMenu1.add(jMenuItem1);
        jMenu1.add(jMenuItem2);
        jMenu3.add(jMenuItem3);

        jMenuBar.add(jMenu1);
        jMenuBar.add(jMenu2);
        jMenuBar.add(jMenu3);

        this.setJMenuBar(jMenuBar);//把菜单栏添加到窗口上
        /*
         */
        JPanel jPanel = new JPanel(new FlowLayout());

        jTextField = new JTextField(15);
        JButton jButton = new JButton("保存");

        jPanel.add(jTextField);
        jPanel.add(jButton);
        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行
        //为文本框添加事件监听
        jTextField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) { //按键输入完成释放时触发
                System.out.println(jTextField.getText());
            }
        });
        
        //为组件添加监听 及 事件处理程序
        jMenuItem3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("记事本v1.0");
            }
        });
            /*
               new  接口/抽象类 不是new接口/抽象类的对象
               java为了简化语法,为接口和抽象类提供了一个匿名的类来实现继承他们
             */
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String account = jTextField.getText();
                if(account.length()==0){
                    //对话框组件
                    JOptionPane.showMessageDialog(null,"请输入账号");
                    return;
                }
            }

        });

    }
    //此种场景下使用内部类更加合适, 内部类中可以直接使用外部类的成员
    /*class ActionImpl  implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("我被点击了"+ jTextField.getText());
        }
    }*/
    public static void main(String[] args) {
        new LoginFrame9();//创建一个窗口
    }
}

JOptionPane对话框

         showMessageDialog():消息对话框

主要有五种消息类型,类型不同,图标不同:

        ERROR_MESSAGE      错误消息提示

        INFORMATION_MESSAGE     信息提示

        WARNING_MESSAGE     警告提示

        QUESTION_MESSAGE     问题提示

        PLAIN_MESSAGE      简洁提示

    showConfirmDialog():确认对话框

主要有四种消息类型,类型不同,图标不同:

        DEFAULT_OPTION    默认选项

        YES_NO_OPTION    /否选项

        YES_NO_CANCEL_OPTION   //取消选项

        OK_CANCEL_OPTION 确定/取消

public class LoginFrame extends JFrame {
    public LoginFrame() {
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("欢迎登录");//设置标题
        //this.setLocation(500,200);设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直居中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 EXIT_ON_CLOSE-关闭窗口时,程序退出运行
        /*
         */
        JPanel jPanel = new JPanel(new FlowLayout());

        JButton jButton = new JButton("保存");
        jPanel.add(jButton);
        //把面板添加到窗口上
        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来, 放在设置的最后一行

        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //消息框
                //JOptionPane.showMessageDialog(null,"提示信息");
                //JOptionPane.showMessageDialog(null,"账号不能为空","登录提示",JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null,"账号不能为空","登录提示",JOptionPane.INFORMATION_MESSAGE);
                //JOptionPane.showMessageDialog(null,"账号不能为空","登录提示",JOptionPane.QUESTION_MESSAGE);
                //JOptionPane.showMessageDialog(null,"账号不能为空","登录提示",JOptionPane.WARNING_MESSAGE);

                //选择对话框
                //int res =  JOptionPane.showConfirmDialog(null,"您确定要删除吗?"); //是-0  否-1 取消-2

                //确认-0,  取消-2
                int res = JOptionPane.showConfirmDialog(null, "您确定要删除吗?", "操作提示", JOptionPane.OK_CANCEL_OPTION);
                System.out.println(res);

                //输入对话框
                String name = JOptionPane.showInputDialog(null, "请输入姓名");
                System.out.println(name);
            }
        });
    }

    public static void main(String[] args) {
        new LoginFrame();//创建一个窗口
    }

内部类

什么是内部类

把类定义在另一个类的内部,该类就被称为内部类。

     如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而

类 Outer 则称为外部类(或称为宿主类)。

内部类定义

内部类 —— 就是位于外部类成员位置的类
       特点:可以使用外部类中所有的成员变量和成员方法(包括 private

内部类的特点

     内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外

部类的类名和$符号。

    内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类

的成员变量,无论是否为 private 的。

匿名内部类

匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。

    new 接口名称/抽象类名称() {

       重写抽象方法;

}

     在实际开发中,我们常常遇到这样的情况:一个接口/抽象类的方法的某个实现方式在程序中只

会执行一次,但为了使用它,我们需要创建它的实现类。此时可以使用匿名内部类的方式,可以无

需创建新的类,减少代码冗余。

public class InternalA {
    private  int num  = 10;
    public void test(){
        JButton jButton = new JButton("");
        //jButton.addActionListener(new B());

        //new + 接口/抽象类  不是创建接口和抽象类的对象,  创建了接口和抽象类的匿名类对象,  省去创建一个类,简化了语法
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
    }
    /*
      内部类
       在一个类的内部定义的类称为内部类, 内部类也是外部类的成员
      为什么用内部类
         1.内部类中可以直接访问外部类成员
         2.内部类只服务当前外部类, 其他地方用不到此类
      匿名内部类
         new + 接口/抽象类  不是创建接口和抽象类的对象,  创建了接口和抽象类的匿名类对象,  省去创建一个类,简化了语法
      内部类意义
         封装性
         实现多继承

     */
  /*  private  class B implements ActionListener {

        public void test(){
            System.out.println(num);
        }

        @Override
        public void actionPerformed(ActionEvent e) {

        }
    }*/

    public static void main(String[] args) {
        new ArrayList<>().iterator();//其中就用到了内部类
    }
}
/*
    类C中需要用到类中的成员, 类C是一个外部类,无法使用到类A中的成员

    就可以把类C定义到类A中去.
       还有原因,就是类C只服务于类A,其他类中用不到类C,  此种情况下也可以将类C定义为类A的内部类
 */
public class InternalC {

}

内部类的意义

1.封装性

      将只有在某个类中使用的功能定义在内部中,并可以使用不同访问权限修饰控制.

2.实现多继承
     java是不支持多继承的,多继承有一个致命性的缺陷,容易出现钻石继承结构,例如下图:
     而如果使用内部类的方法,则只需要创建俩个内部类继承俩个类,那么就可以new内部类的对
象,从而实现另外俩个类的方法了。

http://www.kler.cn/a/508995.html

相关文章:

  • ZooKeeper 核心知识全解析:架构、角色、节点与应用
  • 使用FRP进行内网穿透
  • 【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)
  • 简历_使用优化的Redis自增ID策略生成分布式环境下全局唯一ID,用于用户上传数据的命名以及多种ID的生成
  • 【力扣Hot 100】普通数组1
  • Conda的一些常用命令
  • 【SQL 中的分组查询与联合查询详解】
  • 面试经验分享-回忆版某小公司
  • Spring经典面试题
  • unfold函数
  • 什么是长连接?Netty如何设置进行长连接?
  • Docker详解与部署微服务实战
  • Ansible深度解析:如何精准区分并选用command与shell模块
  • Ruby语言的数据库交互
  • Redis 设计与实现:深入理解高性能缓存数据库
  • 【逆境中绽放:万字回顾2024我在挑战中突破自我】
  • 数据结构——堆(介绍,堆的基本操作、堆排序)
  • 【MySQL】简单解析一条SQL更新语句的执行过程
  • Zookeeper 配置文件:核心参数优化与实操指南
  • csp22前2题
  • JWT(数据结构、认证流程、加密、解密过程)、对称加密和非对称加密
  • C++从入门到实战(一)C++入门基础
  • WPS数据分析000001
  • SparkSQL函数
  • ComfyUI 矩阵测试指南:用三种方法,速优项目效果
  • 适配器模式详解:解决接口不兼容问题的灵活设计模式