初探Java内部类的使用

初探Java内部类的使用

什么是内部类

Java中的内部类,指的是定义在另一个类中的类。内部类被认为是一个单独的实体,能够访问其外部类的所有成员。因此,内部类拥有更多的访问权限及更加灵活的控制能力。

一个内部类可以具有任意的访问权限及修饰符,这其中最为关键的是private,即表示该内部类仅仅只能被它的外部类所访问。不同的内部类也拥有不同的访问权限及特殊性质,下面我们一一进行讲解与说明。

内部类的特点

  1. 应当了解的是,每一个内部类都能够独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

  2. 内部是外部的一个成员,所以访问权限是一样的。同样的,内部类也能访问外部类的所有数据,包括私有(private)数据。

  3. 外部不能直接访问内部类的成员数据,需要通过内部类对象来访问。

  4. 内部类可以将多个相关类组织在一起,方便编写和维护代码。

非静态内部类

非静态内部类也称为成员内部类,它是在外部类中定义的一个普通的内部类,没有使用static关键字修饰。非静态内部类能够访问外部类的所有成员变量和方法,甚至包括private成员变量和方法。

示例1

以一个学生类(Student)和一个班级类(Class)为例,学生可以加入班级,但是班级中又有一些方法只有学生才能调用。

public class Class {
    private Strint name;
    private List<Student> students = new ArrayList<>();

    public Class(String name) {
        this.name = name;
    }

    public void addStudent(Student student) {
        students.add(student);
    }

    public Student getStudent(String studentName) {
        for (Student student:students) {
            if(student.getName().equals(studentName)) {
                return student;
            }
        }
        return null;
    }

    //内部类,用来实现的辅助功能
    private class Helper {
        public void printClass() {
            System.out.println("班级名称:" + name);
        }
    }

    //公共的统一接口方法
    public void printClass() {
        Helper helper = new Helper();
        helper.printClass();
        for (Student student : students) {
            System.out.println(student.getName());
        }
    }

    public class Student {
        private String name;

        public Student(String name) {
            this.name = name;
        }

        //这个函数只有学生自己能够调用
        public void printClass() {
            System.out.println("我所在班级名称:" + Class.this.name);
        }

        public String getName() {
            return name;
        }
    }
}

在这个例子中,我们创建了一个班级类Class,以及一个Class.Student内部类,它表示一个学生。之后我们又增加了一个Class.Helper内部类,用来实现班级打印的辅助功能。我们完整地讲解了如何在内部类中访问外部类的成员变量和方法,并强调了Class.Student内部类中基本方法和Class.Helper内部类的链式操作。

静态内部类

静态内部类和非静态内部类不同,它是在外部类中定义的静态内部类,使用static关键字进行修饰。由于静态方法不能访问非静态域,所以静态内部类不能访问外部类的非静态成员对象方法。但是,相对的,静态内部类只能够访问外部类的静态成员变量或方法。

注意,通常静态内部类与外部类之间不存在继承关系,它们是通过独立的类相互关联。

示例2

通过示例2,了解如何创建一个内部类

public class StaticInnerClassDemo {
    private static String outerClassField = "outerClassField";
    private String instanceField = "instanceField";

    private static void outerClassMethod() {
        System.out.println("outerClassMethod");
    }

    private void instanceMethod() {
        System.out.println("instanceMethod");
    }

    public static class StaticInnerClass {
        public void innerClassMethod() {
            System.out.println("innerClassMethod");
            System.out.println(outerClassField);
            outerClassMethod();
        }
    }
}

本地内部类

局部内部类,也叫本地内部类,定义在方法中,只能方法中访问,一般的,定义在方法中的类,我们称之为局部变量,那么定义在局部变量中的类就叫做本地内部类了。本地内部类只能在该方法被调用的时候才能够使用。本地内部类可以访问该方法中的final类型的参数或者本地变量,这个操作非常类似于闭包。

注意,如果要在该方法中访问的本地变量非final类型,那么它的值将无法传递给本地内部类中的final属性,从而将无法进行访问。

示例3

通过示例3,了解桌面端Java实现Swing的一个经典范例:Button程序中嵌入ActionLister监听器,中间实现一个局部内部类。

public class ButtonTest {
    public static void main(String[] agrs) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        frame.add(panel);

        JButton button = new JButton("OK");
        panel.add(button);

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showConfirmDialog(null, "Hello World", "title", JOptionPane.YES_NO_OPTION);
            }
        });

        frame.pack();
        frame.setVisible(true);
    }
}

内部类的使用

内部类在访问外部类中的成员变量和方法时非常方便,也可以将多个相关类组织在一起,实现更好的结构化代码编写。不过,使用内部类的时候要注意内部类访问外部类的限制,还有就是在使用非静态内部类和本地内部类的时候,一定要记得建立先外部类的对象,然后再建立内部类的对象,否则程序在运行时会发生错误。我们通过示例说明,来帮助大家更好地掌握内部类的使用。

示例:

public class Outer {
    private String s;

    // 构造器
    public Outer(String s) {
        this.s = s;
    }

    // 内部类
    public class Inner {
        public void printS() {
            System.out.println(s);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer("Hello World");
        Outer.Inner oi = o.new Inner();
        oi.printS();
    }
}

在例子中,我们创建了一个外部类Outer以及它的内部类Inner,它们之间相互关联,通过实例化Outer类的实例对象,建立对于Inner内部类对象的引用,从而实现对Inner类的访问。需要重点注意的是,先外部类的对象,后内部类的对象,这是内部类使用时的标配,需谨记。同时也需要注意到的是,对于内部类的访问,也有其明确定义的规范,不能跑偏。

总结

Java语言中的内部类是一种非常重要的语言特性,可以方便的访问外部类中的所有成员数据,并且能够将多个相关类组织在一起,实现更好的结构化代码编写。在实际开发中,我们需要灵活的使用内部类,选择合适的内部类实现方式,以实现更加高效和易读的代码编写。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:初探Java内部类的使用 - Python技术站

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

相关文章

  • Java 实战范例之精美网上音乐平台的实现

    Java 实战范例之精美网上音乐平台的实现攻略 1. 概述 本文将介绍如何使用Java技术实现一个精美的网上音乐平台。本平台能够提供音乐播放、收藏喜欢的歌曲、搜索歌曲等功能。 2. 技术选项 本平台的后端通过Spring Boot实现,前端使用JavaScript和jQuery框架。平台使用MySQL作为数据库存储。同时,我们还使用了第三方API接口Spot…

    Java 2023年5月19日
    00
  • JVM内存增强之逃逸分析

    JVM内存增强之逃逸分析是指在Java应用程序启动时,JVM在运行过程中动态的分析程序的对象生命周期,将对象的使用范围限制在方法内部,从而达到减少对象在堆上的分配、减少GC(垃圾回收)压力、提高应用程序的性能等目的的一种技术手段。 下面是JVM内存增强之逃逸分析的完整攻略: 1. 什么是逃逸分析? 逃逸分析是一种程序优化技术,它对程序中的对象进行分析,识别出…

    Java 2023年5月19日
    00
  • SpringSecurity rememberme功能实现过程解析

    下面我给你详细讲解“SpringSecurity rememberme功能实现过程解析”的完整攻略。 1. 简介 Spring Security是一个流行的安全框架,可以为Web应用程序提供身份验证和授权的服务。其中的rememberme功能可以帮助用户在登出后不必重新登录,便能够快速访问应用程序。其实现原理是利用cookie存储用户登录凭据并在下次登录时使…

    Java 2023年5月20日
    00
  • spring-boot 如何实现单次执行程序

    Spring Boot 如何实现单次执行程序 在本文中,我们将详细讲解如何使用Spring Boot实现单次执行程序。我们将介绍两种不同的方法来实现这个目标,并提供示例来说明如何使用这些方法。 方法一:使用CommandLineRunner接口 Spring Boot提供了CommandLineRunner接口,它可以在Spring Boot应用程序启动时执…

    Java 2023年5月18日
    00
  • Java中Date与String相互转换的方法

    让我来详细讲解一下“Java中Date与String相互转换的方法”的攻略。 为什么需要进行Date与String的转换 在 Java 中,Date 类表示日期和时间。而在进行实际编程的过程中,我们常常需要将日期时间转换为字符串,或者将字符串转换为日期时间。因此,掌握 Date 和 String 相互转换的方法是非常重要的。 Date 转换为 String …

    Java 2023年5月27日
    00
  • Java模拟qq软件的详细过程

    我们来详细讲解“Java模拟QQ软件的详细过程”的完整攻略。 1. 项目概述 这个项目的目的是使用Java语言模拟QQ软件的基本功能,包括用户登录、好友管理、信息发送等。整个项目的实现分为三部分: 客户端GUI界面的设计 服务器端的实现 客户端和服务器端之间的通信 2. 客户端GUI界面设计 客户端的GUI界面需要考虑以下几个方面: 登录界面 好友列表界面 …

    Java 2023年6月15日
    00
  • Java如何打印完整的堆栈信息

    当Java程序遇到异常时,Java虚拟机会将堆栈信息打印到控制台中。但是,默认情况下,Java只会打印简略的堆栈信息,这对于开发中的调试并不方便。本文将会详细介绍如何打印完整的堆栈信息。 问题描述 通常情况下,Java虚拟机只会打印部分的堆栈信息,例如: Exception in thread "main" java.lang.NullP…

    Java 2023年5月26日
    00
  • JDBC用法小结

    下面是详细讲解“JDBC用法小结”的完整攻略。 JDBC简介 JDBC(Java Database Connectivity)是连接Java程序和数据库的一个Java API。它使用一组接口定义了数据库操作的标准,可以方便地让Java程序连接和操纵各种关系型数据库。 JDBC用法 JDBC的用法分为下面几步: 加载数据库驱动 在使用JDBC连接数据库时,第一…

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