java 内部类(匿名类,匿名对象,静态内部类)详解及实例

Java内部类(匿名类,匿名对象,静态内部类)详解及实例

Java内部类是一个嵌套在其他类中的类,内部类可以访问外部类的所有成员(包括私有成员),并且可以用来实现一些特殊的功能。Java内部类通常分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类

成员内部类是定义在外部类的内部,并且不是 static 的内部类。成员内部类可以访问外部类的所有成员(包括私有成员),并且可以用来实现一些特殊的功能。例如,我们可以使用成员内部类来实现一个迭代器:

public class MyArrayList<T> {
    private T[] array;
    private int size;

    public MyArrayList() {
        this.array = (T[]) new Object[10];
        this.size = 0;
    }

    public void add(T value) {
        if (size >= array.length) {
            resize();
        }
        array[size] = value;
        size++;
    }

    public T get(int index) {
        return array[index];
    }

    public int size() {
        return size;
    }

    public void remove(int index) {
        for (int i = index; i < size - 1; i++) {
            array[i] = array[i+1];
        }
        size--;
    }

    public Iterator<T> iterator() {
        return new MyIterator();
    }

    private void resize() {
        T[] newArray = (T[]) new Object[array.length * 2];
        for (int i = 0; i < size; i++) {
            newArray[i] = array[i];
        }
        array = newArray;
    }

    private class MyIterator implements Iterator<T> {
        private int index;

        public MyIterator() {
            index = 0;
        }

        @Override
        public boolean hasNext() {
            return index < size;
        }

        @Override
        public T next() {
            T value = array[index];
            index++;
            return value;
        }

        @Override
        public void remove() {
            MyArrayList.this.remove(index-1);
            index--;
        }
    }
}

在上面的代码中,MyArrayList 类中包含了一个名为 MyIterator 的成员内部类,这个内部类实现了一个简单的迭代器,用于遍历 MyArrayList 中的元素。注意到在 MyIterator 中,可以直接访问外部类中的 array 和 size 等成员变量。

局部内部类

局部内部类是定义在方法内部的类。局部内部类只可以在定义类的方法中使用,其作用范围被限定在该方法内部,对外部是不可见的。局部内部类可以访问该方法的所有参数和方法变量,但要求这些变量必须是 final 类型的。例如,我们可以使用局部内部类来实现一个简单的计数器:

public class Counter {
    public static void main(String[] args) {
        System.out.println(count(10));
    }

    public static int count(int n) {
        class Counter {
            private int value;

            public Counter() {
                value = 0;
            }

            public void increment() {
                value++;
            }

            public int getValue() {
                return value;
            }
        }

        Counter counter = new Counter();

        for (int i = 0; i < n; i++) {
            counter.increment();
        }

        return counter.getValue();
    }
}

在上面的代码中,count 方法中定义了一个名为 Counter 的局部内部类,这个内部类实现了一个计数器,用于对参数 n 进行计数。在 count 方法中,我们可以创建一个 Counter 对象,并调用 increment 和 getValue 方法进行计数。

匿名内部类

匿名内部类是一种特殊的局部内部类,它在定义时没有完整的类名,通常只是使用一个接口或抽象类作为参数,然后在定义时直接实现其抽象方法。匿名内部类可以用来快速实现某些功能,例如实现一个简单的 OnClickListener:

public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick() {
                System.out.println("Button clicked!");
            }
        });
        button.click();
    }
}

interface OnClickListener {
    void onClick();
}

class Button {
    private OnClickListener onClickListener;

    public void setOnClickListener(OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }

    public void click() {
        if (onClickListener != null) {
            onClickListener.onClick();
        }
    }
}

在上面的代码中,我们定义了一个名为 Main 的类,其包含了一个点击按钮的示例。在 main 方法中,我们创建了一个 Button 对象,并使用匿名内部类实现了一个 OnClickListener 接口,用于当按钮被点击时输出一条信息。

静态内部类

静态内部类是定义在外部类内部,并且被声明为 static 的内部类。静态内部类可以访问外部类的所有静态成员,但是不能直接访问外部类的非静态成员(可以通过创建外部类对象来访问)。例如,我们使用静态内部类来实现一个简单的日志记录器:

public class Logger {
    private static List<String> logs = new ArrayList<>();

    public static void log(String message) {
        logs.add(message);
    }

    public static List<String> getLogs() {
        return logs;
    }

    public static class LoggerThread extends Thread {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Logger.getLogs());
            }
        }
    }
}

在上面的代码中,我们定义了一个名为 Logger 的类,其包含了一个静态内部类 LoggerThread,用于定时输出日志信息。在 LoggerThread 类中,我们可以直接调用 Logger.getLogs 方法来获取日志信息,并在 run 方法中输出日志信息。

总结

Java 内部类是一种用于实现某些特殊功能的嵌套类。Java 内部类通常分为成员内部类、局部内部类、匿名内部类和静态内部类。以上面几个示例为例,它们分别使用了各种类型的 Java 内部类来实现一个迭代器、一个计数器、一个 OnClickListener 和一个日志记录器。使用内部类时需要考虑访问权限、变量的作用域和生命周期等问题,建议根据实际需要决定使用哪种类型的内部类。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 内部类(匿名类,匿名对象,静态内部类)详解及实例 - Python技术站

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

相关文章

  • java Spring Boot 配置redis pom文件操作

    Java Spring Boot 是一个快速开发应用程序的框架,而 Redis 是一个基于内存存储的数据结构存储系统。在 Spring Boot 应用程序中,我们可以配置 Redis,以便有效地管理数据。 以下是配置 Redis 的 pom 文件操作的完整攻略: 步骤1:引入 Redis 依赖项 在 pom.xml 文件中添加以下代码: <depend…

    Java 2023年5月20日
    00
  • IDEA下创建SpringBoot+MyBatis+MySql项目实现动态登录与注册功能

    下面我将为您详细讲解“IDEA下创建SpringBoot+MyBatis+MySql项目实现动态登录与注册功能”的完整攻略。 环境准备 首先,我们需要在本地环境中安装好如下软件: JDK、IDEA、Maven、MySQL等开发环境 SpringBoot、MyBatis、MySql等相关依赖包 创建SpringBoot项目 步骤如下: 打开IDEA,选择 Cr…

    Java 2023年5月20日
    00
  • java通过url读取文件内容示例

    下面是“Java通过URL读取文件内容示例”的完整攻略。首先,我们需要了解一下读取文件的过程: 获取文件的URL地址; 通过URL对象打开连接,获得输入流; 通过输入流读取文件的内容; 关闭输入流,关闭连接。 接下来,我们来看两条示例。 示例1:通过URL读取文本文件 import java.io.*; import java.net.*; public c…

    Java 2023年5月19日
    00
  • 5分钟快速了解String.trim()到底做了什么事

    当我们使用Java字符串时,我们可以使用trim()方法来去除字符串的首尾空格。 一、什么是String.trim()方法? String.trim()方法属于Java String类的一个方法,用于去除字符串的首尾空格。该方法返回一个新的字符串,而不是修改原始字符串。 二、String.trim()方法的使用 在Java编程中,我们可以使用String.t…

    Java 2023年5月20日
    00
  • 一篇文章搞定数据库连接池

    数据库连接池是在应用程序和数据库之间起着缓冲作用的一个数据结构,其可以存储多个已经连接到数据库的连接,进行数据库操作时从连接池获取连接,使用完后再将连接返回连接池,避免了重复创建和断开数据库连接,既提高了数据库操作的性能,也节约了资源。 一、数据库连接池的基本介绍 数据库连接池是应用程序和数据库之间的中间件,其分为多个阶段: 应用程序向连接池请求连接。 连接…

    Java 2023年6月16日
    00
  • JQuery标签页效果实例详解

    接下来我将为你详细讲解“JQuery标签页效果实例详解”的完整攻略。 概述 本文将介绍如何使用 jQuery 实现一个标签页效果。标签页是一种常见的网页布局方式,用户可以通过点击标签来切换不同的内容。在本文中,我们将使用 jQuery 和 CSS 实现一个简单的标签页效果。 实现步骤 创建 HTML 结构 首先需要创建一个 HTML 结构,包含多个标签和对应…

    Java 2023年6月15日
    00
  • 深入理解Java中的字符串类型

    深入理解Java中的字符串类型 Java 的字符串类型 java.lang.String 在我们日常的开发工作中使用得非常频繁,而且它的使用非常方便。但是,我们了解得真的够全面吗?在本篇文章中,我们将会通过具体的示例,剖析 Java 字符串的底层实现原理,还会深入探讨 Java 字符串的常用方法和源代码分析。 1. Java 字符串类型的底层实现原理 Jav…

    Java 2023年5月20日
    00
  • Springmvc处理ajax请求并返回json数据

    下面我将介绍SpringMVC处理ajax请求并返回JSON数据的完整攻略。 什么是SpringMVC SpringMVC是一个基于Spring框架之上的Web框架,它可以帮助我们简化Web应用程序的开发,并且具有良好的可扩展性和灵活性。SpringMVC中最常见的请求方式是通过URL来映射到处理器(Controller)中的某个具体的方法,并由该方法来处理…

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