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开发工具IntelliJ IDEA安装图解

    下面我来给你详细讲解“Java开发工具IntelliJ IDEA安装图解”的完整攻略。 准备工作 在安装IntelliJ IDEA之前,我们需要先准备好Java环境。具体步骤如下: 1.下载并安装JDK。在官网下载 JDK,根据自己电脑的操作系统选择下载对应版本的JDK,并安装到默认路径下。 2.配置环境变量。将JDK的安装路径添加到系统环境变量中,具体步骤…

    Java 2023年5月26日
    00
  • Spring+SpringMVC+MyBatis整合详细教程(SSM)

    以下是关于“Spring+SpringMVC+MyBatis整合详细教程(SSM)”的完整攻略,其中包含两个示例。 1. 前言 Spring+SpringMVC+MyBatis整合(简称SSM)是一种常用的Java Web开发框架,它将Spring、SpringMVC和MyBatis三个框架整合在一起,提供了一种灵活的方式来开发Web应用程序。本攻略将详细讲…

    Java 2023年5月16日
    00
  • SpringBoot详细讲解视图整合引擎thymeleaf

    让我来详细讲解一下“SpringBoot详细讲解视图整合引擎thymeleaf”的完整攻略。 1. 什么是Thymeleaf Thymeleaf是一种现代化的服务器端模板引擎,可支持HTML、CSS、XML、JavaScript等文档类型。它的语法十分简单且灵活,可以通过简单而自然的模板表达式快速地构建出动态内容渲染的视图。 2. 如何整合Thymeleaf…

    Java 2023年5月19日
    00
  • 如何用idea数据库编写快递e站

    如何用IDEA数据库编写快递E站的完整攻略: 安装数据库和IDEA 首先需要安装数据库和IDEA,常用的数据库有MySQL和PostgreSQL。使用过程中也需要安装相应的驱动程序。如果你使用的是Maven或Gradle等构建工具,那么你可以在配置文件中添加相应的依赖项,自动下载驱动程序。 创建数据库和表格 在IDEA中连接到数据库服务器,创建一个新的数据库…

    Java 2023年5月20日
    00
  • 基于Spring整合mybatis的mapper生成过程

    下面是基于Spring整合MyBatis的Mapper生成过程的完整攻略。 1. 准备工作 在开始整合MyBatis和Spring之前,确保已经完成以下工作: 已经拥有一个Spring项目并且能够正常运行; 已经添加了MyBatis和MyBatis-Spring的依赖; 已经配置了MyBatis的数据源、事务管理和SqlSessionFactory等内容。 …

    Java 2023年5月20日
    00
  • 关于Java垃圾回收开销降低的几条建议

    关于Java垃圾回收开销降低的几条建议 背景 在Java程序运行时,垃圾回收器自动地回收未被引用的内存,以免Java运行时内存不足。然而,频繁的垃圾回收和内存分配会增加系统的开销。因此,为了降低Java垃圾回收开销,我们可以采取以下几个建议: 建议一:减少内存分配 内存分配是Java运行时系统的开销之一。我们可以采取以下方法来减少内存分配: String处理…

    Java 2023年5月27日
    00
  • Spring Security 密码验证动态加盐的验证处理方法

    针对“Spring Security 密码验证动态加盐的验证处理方法”的完整攻略,我将分为以下几个部分进行讲解: 加盐的原理及作用 Spring Security 密码验证流程 实现动态加盐的验证处理方法 示例代码和测试 1. 加盐的原理及作用 在密码存储中,加盐是一种常用的安全策略,其原理是在密码明文前后添加一段随机的字符串(即盐),然后对整个字符串进行哈…

    Java 2023年5月20日
    00
  • Java线程的三种创建方式

    Java线程的创建方式一般有三种,分别是继承Thread类、实现Runnable接口和实现Callable接口。下面我们一一进行讲解。 一、继承Thread类 该方式最简单的方式就是继承Thread类,然后重写run方法,在run方法中编写线程执行的任务。 public class MyThread extends Thread { @Override pu…

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