Java 第十一章 GUI编程(3)

发布于:2025-03-22 ⋅ 阅读:(151) ⋅ 点赞:(0)

目录

内部类

内部类定义

内部类的特点

匿名内部类

格式:

内部类的意义

实例


内部类


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

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


内部类定义

内部类——就是位于外部类成员位置的类

特点:可以使用外部类中所有的成员变量和成员方法(包括private的)

class Outer {
      private int age = 20;
      class Inner {
                   public void show() {
                      System.out.println(age);
              }
       }
 }

内部类的特点

  • 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立 的.class文件,但是前面冠以外部类的类名和$符号。
  •  内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部 类可以自由地访问外部类的成员变量,无论是否为 private 的。

匿名内部类

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

格式:

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

重写抽象方法;

}

注:在实际开发中,我们常常遇到这样的情况:一个接口/抽象类的方法的某个实现方 式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类。此时可以 使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。

public interface IA {

abstract void fun1();

}

new IA() {

@Override public void fun1() {

System.out.println("匿名类实现fun1");

  }

};

内部类的意义

1.封装性

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

2.实现多继承 java是不支持多继承的,多继承有一个致命性的缺陷, 容易出现钻石继承结构,例如图。

public class Father{
    public string powerul="市长";
}
publie class Mother{
    public string wealthy=" 百万";
}
public class son {
class xtends Father extends Father{
}
c1ass xtends Mother extends Mother{
}
publie void sayHello(}{
    String father new xtends rather().powerul;
    String mother = new xtends Mother().wealthv;
    System.out.println("my father is:" + father + "my mother has:" + mother);
  }
}

实例(设置内部线程类)

 //为我们发送按钮注册事件监听
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取输入的聊天内容
                String s = textField1.getText();
                if (s.length()==0) {
                    JOptionPane.showMessageDialog(null, "聊天内容不能为空!");
                    return;
                }
                //发送聊天内容
                try { //拼接聊天内容 把账户,发送时间,聊天内容
                    s= account+"  "+dataUntil.strdom(new Date())+"\n"+s+"\n";
                       dataOutputStream.writeUTF(s);
                       textField1.setText("");
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, "发送失败" );
                }
            }
        });
        //来到聊天窗口后,就会随时有别的客户端发送消息,在聊天窗口中,循环监听来自服务器发送的消息
        new ReceiveThread().start();//启动监听线程
    }
   //创建接收服务器发送的消息的线程
   private class ReceiveThread extends Thread {
        boolean mark = true;
        @Override
        public void run() {
            while (mark){//如果接收到消息就会传入消息框中
                try {
                    String s = dataInputStream.readUTF();
                    textArea1.append(s);
                } catch (IOException e) {
                    mark = false;
                }


            }
        }
    }