• JAVA_内部类 学习笔记


    概述

    内部类的作用

    静态内部类

    成员内部类

    内部类中各范围中变量的访问

    局部内部类(了解即可)

    匿名内部类

    匿名内部类的使用

    概述

    内部类就是定义在一个类里面的类。

    1. public class People{
    2. // 内部类
    3. public class Heart{
    4. }
    5. }

    场景:当一个事物的内部,还有一个部分需要一个完整的结构进行描述时。

    内部类的作用

    内部类通常可以方便访问外部类的成员,包括私有的成员。

    内部类提供了更好的封装性,内部类本身就可以用private ,protectecd等修饰,封装性可以做更多控制。

    静态内部类

    • 有static修饰,属于外部类本身。
    • 它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已。
    1. public class A{
    2. // 静态成员内部类
    3. public static class B{
    4. }
    5. }

     静态内部类创建对象:

    外部类名.内部类名 对象名 = new 外部类名.内部类构造器;

    例如:

    1. //外部类
    2. public class Out {
    3. public static class In{//内部类
    4. private String name;
    5. private int age;
    6. public static String cname;
    7. public In(String name, int age) { //内部类的有参构造器
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public In() { //内部类的无参构造器
    12. }
    13. //get 、 set 方法
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. this.name = name;
    19. }
    20. public int getAge() {
    21. return age;
    22. }
    23. public void setAge(int age) {
    24. this.age = age;
    25. }
    26. public static String getCname() {
    27. return cname;
    28. }
    29. public static void setCname(String cname) {
    30. In.cname = cname;
    31. }
    32. }
    33. }
    1. public class test {
    2. public static void main(String[] args) {
    3. Out.In a = new Out.In();
    4. a.setName("香克斯");
    5. a.setAge(40);
    6. System.out.println(a.getName()+" "+a.getAge());
    7. }
    8. }

    *

    静态内部类中可以直接访问外部类的静态成员

    静态内部类中不可以直接访问外部类的实例成员

    成员内部类

    无static修饰,属于外部类的对象。

    1. public class Outer {
    2. // 成员内部类
    3. public class Inner {
    4. }
    5. }

    成员内部类创建对象:

    外部类名.内部类名 对象名 = new  外部类构造器.new 内部类构造器();

     例如:

    1. //外部类
    2. public class Out {
    3. public class In{
    4. private String name;//内部类
    5. private int age;
    6. private static String cname; //成员内部类中可以有静态成员变量
    7. public static void eat(){ //成员内部类中可以有静态方法
    8. }
    9. public In(String name, int age) { //有参构造器
    10. this.name = name;
    11. this.age = age;
    12. }
    13. public In() {//无参构造器
    14. }
    15. //get、 set方法
    16. public String getName() {
    17. return name;
    18. }
    19. public void setName(String name) {
    20. this.name = name;
    21. }
    22. public int getAge() {
    23. return age;
    24. }
    25. public void setAge(int age) {
    26. this.age = age;
    27. }
    28. public String getCname() {
    29. return cname;
    30. }
    31. public void setCname(String cname) {
    32. this.cname = cname;
    33. }
    34. }
    35. }
    1. public class test {
    2. public static void main(String[] args) {
    3. Out.In i = new Out().new In();
    4. i.setName("路飞");
    5. System.out.println(i.getName());
    6. }
    7. }

    *

    静态内部类中可以直接访问外部类的静态成员

    静态内部类中可以直接访问外部类的实例成员

    内部类中各范围中变量的访问

    1. //外部类
    2. public class Out {
    3. private int a = 10; //外部类对象 访问时 外部类名.this.对象
    4. public class In { //内部类
    5. private int b = 20; //成员内部类的对象变量 访问使用this关键字
    6. public void print() {
    7. int c = 30;
    8. System.out.println(c);//输出30
    9. System.out.println(this.b);//输出20
    10. System.out.println(Out.this.a);//输出10
    11. }
    12. }
    13. }

    局部内部类(了解即可)

    局部内部类放在方法、代码块、构造器等执行体中。

    局部内部类的类文件名为: 外部类$N内部类.class。

    匿名内部类

    本质上是一个没有名字的局部内部类。

    作用:方便创建子类对象,最终目的是为了简化代码编写。

    格式:

    1. new 类|抽象类名|或者接口名() {
    2. 重写方法;
    3. };

    例如:

    1. abstract class F{ //定义父类抽象类
    2. abstract void eat();
    3. }
    1. public class test {
    2. public static void main(String[] args) {
    3. F a = new F() {
    4. @Override //重写
    5. void eat() {
    6. System.out.println("很能吃");
    7. }
    8. };
    9. a.eat();
    10. }
    11. }

    *

    匿名内部类是一个没有名字的内部类,同时也代表一个对象。

    匿名内部类产生的对象类型,相当于是当前new的那个的类型的子类类型。

    匿名内部类的使用

    如:

    某个学校需要让学生参加游泳比赛

    常规写法 有子类:

    1. /*
    2. 游泳接口
    3. */
    4. public interface Swimming {
    5. void swim();
    6. }
    1. public class test {
    2. public static void main(String[] args) {
    3. Swimming s = new Student();
    4. goSwimming(s);
    5. }
    6. // 定义一个方法让所有角色进来一起比赛
    7. //需求:goSwimming方法
    8. public static void goSwimming(Swimming s) {
    9. System.out.println("开始");
    10. s.swim();
    11. System.out.println("结束");
    12. }
    13. }
    14. class Student implements Swimming{
    15. @Override
    16. public void swim() {
    17. System.out.println("学生游泳比赛");
    18. }
    19. }

    匿名内部类的写法:

    1. /*
    2. 游泳接口
    3. */
    4. public interface Swimming {
    5. void swim();
    6. }
    1. public class test {
    2. public static void main(String[] args) {
    3. Swimming s = new Swimming() {
    4. @Override
    5. public void swim() {
    6. System.out.println("学生游泳比赛");
    7. }
    8. };
    9. goSwimming(s);
    10. }
    11. // 定义一个方法让所有角色进来一起比赛
    12. //需求:goSwimming方法
    13. public static void goSwimming(Swimming s) {
    14. System.out.println("开始");
    15. s.swim();
    16. System.out.println("结束");
    17. }
    18. }

    运行是以回调形式:

     匿名内部类可以作为一个对象,直接传输给方法。

    使用匿名内部类的案例:

    通过GUI编程 理解匿名内部类的使用

    1. import javax.swing.*;
    2. import java.awt.event.ActionEvent;
    3. import java.awt.event.ActionListener;
    4. public class test {
    5. public static void main(String[] args) {
    6. //创建窗口
    7. JFrame windo = new JFrame("登录界面");
    8. //定义一个桌布
    9. JPanel panel = new JPanel();
    10. windo.add(panel);
    11. //创建一个按钮对象
    12. JButton button1 = new JButton("登录");
    13. //使用匿名内部类
    14. button1.addActionListener(new ActionListener() {
    15. @Override
    16. public void actionPerformed(ActionEvent actionEvent) {
    17. //提示框
    18. JOptionPane.showMessageDialog(windo, "点击了一下");//监听对象并输出
    19. }
    20. });//监听器和接口对象
    21. //将按钮对象添加到桌布对象中
    22. panel.add(button1);
    23. //设置窗口大小
    24. windo.setSize(300, 400);
    25. //展示窗口
    26. windo.setVisible(true);
    27. //窗口居中
    28. windo.setLocationRelativeTo(null);
    29. }
    30. }

  • 相关阅读:
    ANR系列之ContentProvider类型原理讲解
    HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(三)
    苹果电脑压缩软件哪个好用一些? mac电脑用什么压缩软件 mac电脑压缩文件怎么设置密码
    Linux常用命令 - 权限管理命令
    HummerRisk V0.5.1 发布:新增对象存储、优化K8s 资源态势和资源拓扑等
    【java】多线程
    pyppeteer框架基本语法备忘录
    代码随想录Day25 回溯算法 LeetCode T51 N皇后问题
    RabbitMQ系列【16】AmqpTemplate接口详解
    关系抽取:传统:UniRel: Unified Representation and Interaction for Joint Relational
  • 原文地址:https://blog.csdn.net/dafsq/article/details/125508286