JAVA 内部类详解及实例

JAVA 内部类详解及实例

Java内部类可以看作是一种定义在另一个类内部的类。它们有访问外部类的所有成员的权限。Java内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类

成员内部类定义在外部类的内部,并且不是static类型的。成员内部类可以直接访问外部类的成员变量和方法,并且可以通过this关键字访问自己的成员变量和方法。下面是一个成员内部类的示例代码:

public class OuterClass {
    private int outerField;

    public class InnerClass {
        private int innerField;

        public void accessOuterField() {
            System.out.println("Outer field value: " + outerField);
        }

        public void accessInnerField() {
            System.out.println("Inner field value: " + innerField);
        }
    }
}

上述代码中,InnerClass是OuterClass的成员内部类。在InnerClass中,可以访问外部类的私有成员变量outerField,并且可以访问自己的私有成员变量innerField。

在外部类中创建InnerClass的示例代码如下:

OuterClass outerObj = new OuterClass();
OuterClass.InnerClass innerObj = outerObj.new InnerClass();

使用new关键字创建InnerClass的实例时,需要首先创建OuterClass的实例。然后通过outerObj.new的方式来创建InnerClass的实例。最后,通过innerObj来访问InnerClass的成员方法和变量。

局部内部类

局部内部类定义在方法内部,可以访问方法内的变量和参数,但是这些变量和参数必须是final类型的。下面是一个局部内部类的示例代码:

public class OuterClass {
    public void someMethod() {
        final int localVar = 3;

        class LocalInnerClass {
            public void printLocalVar() {
                System.out.println("Local variable value: " + localVar);
            }
        }

        LocalInnerClass innerObj = new LocalInnerClass();
        innerObj.printLocalVar();
    }
}

上述代码中,LocalInnerClass是OuterClass的局部内部类,可以访问someMethod()方法中的局部变量localVar。需要注意的是,localVar必须是final类型的。

匿名内部类

匿名内部类是没有名字的局部内部类,并且它们是在创建对象时定义的。匿名内部类通常用于简单的单次操作,它们可以实现接口或扩展抽象类。下面是一个匿名内部类的示例代码:

public interface MessageService {
    void sendMessage(String message);
}

public class Foo {
    public void sendMessage() {
        MessageService messageService = new MessageService() {
            public void sendMessage(String message) {
                System.out.println("Sending message: " + message);
            }
        };
        messageService.sendMessage("Hello, world!");
    }
}

上述代码中,MessageService是一个接口,Foo类中的sendMessage()方法创建了一个实现了MessageService接口的匿名内部类,在匿名内部类中实现了sendMessage()方法并打印了消息。然后,通过messageService.sendMessage()方法来发送消息。

静态内部类

静态内部类是定义在外部类内部的静态class。静态内部类通常用于分类关系,例如使用多个类来实现一个接口。静态内部类不能访问外部类的非静态变量和方法。下面是一个静态内部类的示例代码:

public class OuterClass {
    private static int outerField;

    public static class StaticInnerClass {
        private int innerField;

        public void accessOuterField() {
            System.out.println("Outer field value: " + outerField);
        }

        public void accessInnerField() {
            System.out.println("Inner field value: " + innerField);
        }
    }
}

上述代码中,StaticInnerClass是OuterClass的静态内部类,可以访问OuterClass的静态成员变量outerField,但不能访问非静态成员变量。

在外部类中创建StaticInnerClass的示例代码如下:

OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass();

使用类名.的方式来创建StaticInnerClass的实例。

示例1

下面是一个成员内部类和局部内部类联合使用的示例代码:

public class OuterClass {
    private int outerField;

    public void callInnerClasses() {
        InnerClass1 innerObj1 = new InnerClass1();
        innerObj1.accessOuterField();

        int localVar = 3;
        class LocalInnerClass {
            public void printLocalVar() {
                System.out.println("Local variable value: " + localVar);
            }
        }
        LocalInnerClass innerObj2 = new LocalInnerClass();
        innerObj2.printLocalVar();
    }

    public class InnerClass1 {
        private int innerField1;

        public void accessOuterField() {
            System.out.println("Outer field value: " + outerField);
        }

        public void accessInnerField() {
            System.out.println("Inner field value: " + innerField1);
        }

        public void callInnerClass2() {
            InnerClass2 innerObj2 = new InnerClass2();
            innerObj2.accessInnerField();
        }

        public class InnerClass2 {
            private int innerField2;

            public void accessInnerField() {
                System.out.println("Inner field value: " + innerField2);
            }
        }
    }
}

上述代码中,InnerClass1是OuterClass的成员内部类。InnerClass2是InnerClass1的成员内部类。在callInnerClasses()方法中,创建了InnerClass1和内部局部类LocalInnerClass的实例,并且访问了它们的成员变量和方法。InnerClass1的callInnerClass2()方法中,创建了InnerClass2的实例并访问了它的成员变量。

示例2

下面是一个使用匿名内部类的示例代码:

public interface MessageService {
    void sendMessage(String message);
}
public class Foo {
    public void sendMessage() {
        MessageService messageService = new MessageService() {
            public void sendMessage(String message) {
                System.out.println("Sending message: " + message);
            }
        };
        messageService.sendMessage("Hello, world!");
    }
}

上述代码中,MessageService是一个接口,Foo类的sendMessage()方法创建了一个实现了MessageService接口的匿名内部类,实现了sendMessage()方法并打印了消息。然后,通过messageService.sendMessage()方法来发送消息。

以上就是JAVA内部类的详细讲解及示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA 内部类详解及实例 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java 逻辑控制详解分析

    Java 逻辑控制详解分析 概述 逻辑控制是程序设计中最基本的概念之一,它能够控制程序的流程、分支、循环等,以达到特定的目的。在 Java 编程语言中,逻辑控制主要包括条件语句、循环语句、跳转语句等。本文将从这三个方面详细介绍 Java 逻辑控制的使用方法。 条件语句 条件语句主要包括 if 和 switch 两种语句,它们都是通过判断条件来决定程序的执行流…

    Java 2023年5月23日
    00
  • GSON实现Java对象与JSON格式对象相互转换的完全教程

    GSON实现Java对象与JSON格式对象相互转换的完全教程 什么是GSON GSON是Google提供的用来在Java对象和JSON数据之间进行序列化和反序列化的Java库。GSON可以将Java对象转化为JSON字符串,也可以将JSON字符串转化为相应的Java对象。 准备工作 在使用GSON之前,您需要做以下准备工作: 下载GSON库 可以通过Mave…

    Java 2023年5月26日
    00
  • IntelliJ IDEA中新建Java class的解决方案

    当在IntelliJ IDEA中需要新建一个Java class时,可以按照以下步骤进行操作: 在IntelliJ IDEA的菜单栏中,选择File -> New -> Java Class,或者使用快捷键Alt+Insert(MacOS中为Command+N)。 在弹出的对话框中,输入class的名称,选择class所在的包名,也可以选择一个已…

    Java 2023年5月26日
    00
  • 关于spring boot使用 jdbc+mysql 连接的问题

    请看下面的攻略: 1.引入相关依赖 在pom.xml文件中加入以下依赖: <dependencies> <!– Spring Boot JDBC 依赖 –> <dependency> <groupId>org.springframework.boot</groupId> <artifact…

    Java 2023年5月20日
    00
  • SpringBoot+slf4j实现全链路调用日志跟踪的方法(一)

    SpringBoot+slf4j实现全链路调用日志跟踪的方法(一) 在分布式系统中,日志跟踪是非常重要的,它可以帮助我们快速定位问题,提高系统的可维护性和可靠性。本文将详细讲解如何使用SpringBoot和slf4j实现全链路调用日志跟踪,包括以下内容: 日志跟踪的基本概念 SpringBoot中的日志跟踪实现方法 示例一:使用MDC实现日志跟踪 示例二:使…

    Java 2023年5月15日
    00
  • Java实现屏幕截图工具的代码分享

    Java实现屏幕截图工具的代码分享 介绍 本文将介绍如何使用Java完成屏幕截图的功能。屏幕截图是一项非常有用的工具,可以用于在教育、演示和软件开发中捕获屏幕上的图像。我们将使用Java的Graphics2D类和Robot类来创建这个屏幕截图工具。 创建一个基本的屏幕截图应用程序 我们将从创建一个基本的屏幕截图应用程序开始。该应用程序将使用一个按钮来触发屏幕…

    Java 2023年5月19日
    00
  • Java中「Future」接口详解

    目录 一、背景 二、Future接口 1、入门案例 2、Future接口 三、CompletableFuture类 1、基础说明 2、核心方法 2.1 实例方法 2.2 计算方法 2.3 结果获取方法 2.4 任务编排方法 2.5 异常处理方法 3、线程池问题 四、CompletableFuture原理 1、核心结构 2、零依赖 3、一元依赖 4、二元依赖 …

    Java 2023年4月17日
    00
  • JAVA基础之继承(inheritance)详解

    JAVA基础之继承(inheritance)详解 什么是继承 Java中的继承是指子类继承父类的特征和行为,并可以在子类中进行修改和扩展。子类是指拥有父类特征和行为的类,父类则是被继承的类。Java中的继承通过关键字extends实现。 声明子类的语法: class Subclass extends ParentClass { // subclass bod…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部