JAVA 内部类详解及实例

yizhihongxing

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日

相关文章

  • jsp Response对象页面重定向、时间的动态显示

    JSP Response对象是JSP页面中的内置对象,可以用于控制页面的输出内容和实现页面的重定向。本文将详细讲解JSP Response对象的两个重要功能:页面重定向和时间的动态显示,并且会给出两个示例说明。 页面重定向 页面重定向是指当浏览器访问一个JSP页面时,服务器将浏览器的请求重定向到另一个页面,这个过程叫做页面重定向。一般情况下,页面重定向是由服…

    Java 2023年6月15日
    00
  • 详解Java并发编程基础之volatile

    下面我将详细讲解“详解Java并发编程基础之volatile”的攻略。首先,我们需要了解volatile的作用。 什么是volatile 在Java中,一个变量被声明为volatile,意味着它是一个“易变的”变量。它告诉编译器和JVM,这个变量在任何时刻都可能被其它线程修改,因此需要特别处理。 volatile的应用场景 volatile主要用于保证变量的…

    Java 2023年5月19日
    00
  • IDEA连接Mysql数据库的详细图文教程

    下面是“IDEA连接MySQL数据库的详细图文教程”的完整攻略,包含两条示例。 准备工作 首先需要准备好以下工具和环境:- IntelliJ IDEA(版本最好是Community或Ultimate,均支持插件安装)- MySQL数据库- MySQL JDBC驱动程序(可以从mysql官网下载) 安装MySQL JDBC驱动程序 下载MySQL JDBC驱动…

    Java 2023年5月20日
    00
  • jQuery 导航自动跟随滚动的实现代码

    jQuery 导航自动跟随滚动是一种常见的页面交互效果,它可以使页面导航栏在用户滚动页面时自动跟随滚动并保持固定位置。下面是实现这个效果的详细攻略: 1.添加导航栏 首先,在 HTML 文件中添加一个导航栏,通常是一个 ul 列表,其中包含若干个 li 子项。 <nav> <ul> <li><a href=&quot…

    Java 2023年6月15日
    00
  • 详解spring与jdbc整合操作

    详解spring与jdbc整合操作 1. Spring JDBC介绍 Spring JDBC是spring框架中最重要的部分之一,提供了一组用于执行SQL操作和访问关系型数据库的类和接口。 Spring JDBC提供的主要API为JdbcTemplate和NamedParameterJdbcTemplate,以及支持Transaction(事务)和DAO(数…

    Java 2023年5月20日
    00
  • SpringMVC中拦截器的实现

    以下是关于“SpringMVC中拦截器的实现”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用Java Web开发框架,其核心思想是基于MVC模式来实现Web应用程序开发。而拦截器是SpringMVC框架的一个重要组件,可以在请求到达Controller之前或之后进行一些处理。本攻略将详细讲解SpringMVC中拦截器的实现方法。 2…

    Java 2023年5月16日
    00
  • 教你开发脚手架集成Spring Boot Actuator监控的详细过程

    下面我将为您详细讲解“教你开发脚手架集成Spring Boot Actuator监控的详细过程”的完整攻略。 前言 在进行Spring Boot应用开发过程中,我们通常使用Spring Boot提供的Actuator来监控应用程序运行状况,但是每次开发都要重复搭建这个环境是非常浪费时间的,本文将教大家如何将Actuator融入开发的脚手架中,降低开发成本。 …

    Java 2023年6月3日
    00
  • 浅谈java实现背包算法(0-1背包问题)

    浅谈Java实现背包算法(0-1背包问题) 背包问题 背包问题是计算机科学中的一个经典问题,形式化地说,给定一个有限的物品集合,每一个物品都有一个重量和价值,目标是找到一个所包含物品的子集,使得这些物品的总重量不超过背包的容量,且这些物品的价值最大。 0-1背包问题 0-1背包问题指的是在背包问题的基础上,要求选出的物品的数量必须是0或1。最优解可能有多个,…

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