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日

相关文章

  • 使用@Value为静态变量导入并使用导入的静态变量进行初始化方式

    下面是”使用@Value为静态变量导入并使用导入的静态变量进行初始化方式”的完整攻略。 什么是@Value注解? 在Spring中,@Value注解可以用于从外部文件中加载配置值或者在运行时从环境变量中获取配置值,然后赋值给一个属性或类静态变量。 使用@Value导入静态变量 Spring允许我们使用@Value导入静态变量。只需要在使用该注解时加上静态变量…

    Java 2023年5月19日
    00
  • jsp+servlet实现猜数字游戏

    JSP (Java Server Pages) 和 Servlet 是 Java Web 开发中最常用的技术组合之一。这两个技术结合可以实现各种功能强大的 Web 应用程序,其中包括猜数字游戏。下面是实现猜数字游戏的完整攻略: 1. 准备开发环境 在开始实现猜数字游戏之前,需要先准备好 Java 开发环境。具体的步骤如下: 安装 JDK; 安装 Eclips…

    Java 2023年6月15日
    00
  • Java实现一个简易版的多级菜单功能

    Java实现一个简易版的多级菜单功能 思路概述 实现一个简易版的多级菜单功能,需要用到递归和HashMap的知识。我们可以将菜单项存储在HashMap中,其中键为菜单名称,值为对应菜单的子菜单。如果一个菜单项没有子菜单,我们将其子菜单设置为null。 通过递归的方式,我们可以深度遍历每个菜单项,并打印出每个菜单项的名称。如果该菜单项还有子菜单,我们则继续递归…

    Java 2023年5月19日
    00
  • 深入解析Java编程中方法的参数传递

    深入解析Java编程中方法的参数传递 在Java编程中,方法是我们进行代码模块化的基本单位,而方法的参数传递是Java编程中比较基础但也比较重要的概念之一。本文将从以下几个方面深入解析Java编程中的方法参数传递。 Java方法参数是按值传递还是按引用传递? 这是一个比较基础的问题。实际上,在Java中,方法参数是按值传递的,而不是传递引用。 所谓“按值传递…

    Java 2023年5月26日
    00
  • java swing编程入门代码编写(java编程入门)

    Java Swing是一种基于Java语言的GUI(图形用户界面)编程框架。通过使用Swing框架,开发人员可以轻松地构建具有丰富功能和良好交互性的应用程序。 以下是Java Swing编程入门的完整攻略: 1. 准备工作 在开始编写Java Swing代码之前,需要准备以下工具: JDK:Java开发工具包(JDK)是编写Java应用程序所必需的。确保已安…

    Java 2023年5月19日
    00
  • JDBC连接MYSQL分步详解

    JDBC连接MYSQL分步详解 JDBC是Java Database Connectivity的缩写,表示Java数据连接,是一种标准的Java API。JDBC提供了跨多种数据库管理系统的连接协议,能够让Java程序通过这套协议与数据库进行交互,从而实现对数据的增删改查操作。 本文将详细介绍如何使用JDBC连接MYSQL数据库,包括以下几个步骤: 下载安装…

    Java 2023年5月19日
    00
  • JavaWeb简单文件上传流程的实战记录

    JavaWeb简单文件上传实战攻略 简介 本攻略基于JavaWeb开发,帮助初学者快速入门文件上传功能。我们将介绍一个基于Servlet/JSP的简单文件上传例子,包含完整的代码示例、攻略细节和实践体验。 文件上传流程 JavaWeb文件上传可以分为以下几个步骤: 表单设计 – 创建一个包含 file type input 元素的表单,实现文件上传UI. 解…

    Java 2023年5月19日
    00
  • 面向对象可视化工具:UML类图

    1. UML类图 UML(Unified Modeling Language,统一建模语言),用来描述软件模型和架构的图形化语言。 常用的UML工具软件有PowerDesinger、Rose和Enterprise Architect。 UML工具软件不仅可以绘制软件开发中所需的各种图表,还可以生成对应的源代码。 在软件开发中,使用UML类图可以更加直观地描述…

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