Java进阶之内部类

简介: 【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。

Java进阶之内部类
内部类的好处就是可以直接访问外部类的成员方法。内部类通常用来封装外部类的实现细节,提高代码的可读性和可维护性。
顾名思义,内部类就是在类内部的类,内部类通常是为其外部类设计的,它们之间存在一种紧密的关系。
内部类的主要用途是逻辑上和概念上与外部类捆绑在一起,以便它们可以共享访问权限,并且可以相互通信,而不需要通过公共接口。
通过使用内部类,你可以将一些只对外部类有用的类或接口隐藏在外部类的内部,而不是将它们暴露给整个包或模块。这样可以减少命名冲突,并保护外部类的实现细节不被外部访问。
此外,内部类还可以提供一种方式来创建具有特定功能的类,而这些功能只在特定的外部类上下文中才有意义。这有助于保持代码的模块化和组织性,因为它允许你在外部类的内部定义相关的辅助类,而不是创建一堆独立的类。
内部类可以访问其外部类的成员,包括私有成员。
Java中主要包含以下几种内部类:
成员内部类(Member Inner Class): 成员内部类是最常见的内部类类型,它像外部类的一个成员一样,可以访问外部类的所有成员和方法。成员内部类不能包含任何static变量或方法。如果你想要在外部类的静态方法中使用内部类,那么该内部类也应该被声明为静态的。
静态内部类(Static Nested Class): 静态内部类与其他静态成员一样,可以包含静态或非静态成员。静态内部类可以访问其外部类的静态成员,但不能访问外部类的非静态成员。
局部内部类(Local Inner Class): 局部内部类是定义在一个块中的类,例如一个方法或一个作用域块。它们仅在该块执行时可见,并且可以访问该块内的final或effectively final变量。
匿名内部类(Anonymous Inner Class): 匿名内部类是没有名称的局部内部类,它们通常用于扩展一个类或实现一个接口的一次性使用。匿名内部类通常用于事件处理和其他简短的操作。
内部类的一些特点:
内部类可以包含与外部类相同的成员(方法、字段等)。
内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外部类对象关联。
内部类可以声明为私有的,这样它们就不能被外部类以外的代码访问。
内部类对象的创建通常依赖于外部类对象的创建。
示例:
假设我们有一个图形类Shape,它包含了不同的图形,比如圆形Circle和矩形Rectangle。我们可以使用内部类来组织和封装这些具体的图形类。
public class Shape {
private String color;
public Shape(String color) {
this.color = color;
}
public void draw() {
System.out.println("Drawing a shape of color " + color);
}
// 静态内部类
public static class Circle extends Shape {
private double radius;

          public Circle(String color, double radius) {
              super(color);
              this.radius = radius;
          }

          @Override
          public void draw() {
              System.out.println("Drawing a " + color + " circle with radius " + radius);
          }
      }
      // 非静态内部类
      public class Rectangle extends Shape {
          private double width;
          private double height;
          public Rectangle(String color, double width, double height) {
              super(color);
              this.width = width;
              this.height = height;
          }
          @Override
          public void draw() {
              System.out.println("Drawing a " + color + " rectangle with width " + width + " and height " + height);
          }
      }
  }
  public class Main {
      public static void main(String[] args) {
          // 创建Shape的静态内部类Circle的实例
          Shape.Circle circle = new Shape.Circle("blue", 5.0);
          circle.draw();

          // 创建Shape的非静态内部类Rectangle的实例
          Shape shape = new Shape("red");
          Shape.Rectangle rectangle = shape.new Rectangle("green", 4.0, 3.0);
          rectangle.draw();
      }
  }
  Circle和Rectangle是Shape的内部类。Circle被声明为静态内部类,而Rectangle是非静态内部类。
  使用内部类可以让代码更加清晰和结构化,也提供了一种封装和隐藏实现细节的方式。但也可能会导致代码复杂性增加。
  END
目录
相关文章
|
2月前
|
Java 编译器
【Java】内部类
【Java】内部类
22 0
|
4月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
4月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
41 5
|
5月前
|
Java Perl
Java进阶之正则表达式
【7月更文挑战第17天】正则表达式(RegEx)是一种模式匹配工具,用于在字符串中执行搜索、替换等操作。它由普通字符和特殊元字符组成,后者定义匹配规则。
36 4
|
5月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
27 4
|
5月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
30 3
|
5月前
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
32 2
|
5月前
|
Java 编译器 API
Java进阶之标准注解
【7月更文挑战第15天】Java标准注解包括标记注解(如@Deprecated)、@Override(检查方法重写)、@SuppressWarnings(抑制警告)。多值注解如@RequestMapping在Spring中用于HTTP请求映射。元注解如@Retention控制注解保留策略,@Target指定应用位置。Java8引入类型注解(@FunctionalInterface、@SafeVarargs)和重复注解(@Repeatable)。自定义注解可通过反射读取,如示例中的MyMarkerAnnotation等。
27 2
|
5月前
|
Java 编译器 API
Java进阶之标准注解
Java进阶之标准注解
31 1
|
5月前
|
IDE Java 测试技术
Java进阶之反射
【7月更文挑战第14天】Java反射机制允许在运行时动态获取类信息、创建对象及调用其方法。它基于`Class`类,让我们能访问类的属性、方法、构造器。例如,通过`Class.forName()`加载类,`Class.newInstance()`创建对象,`Method.invoke()`执行方法。反射广泛应用于动态代理、单元测试、序列化及框架中,提供灵活性但牺牲了性能,且可破坏封装性。IDE的代码补全也是反射的应用之一。在使用时需谨慎,避免对私有成员的不当访问。
41 1