`
reniaL
  • 浏览: 94084 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java 嵌套类

阅读更多

Java 嵌套类其实平时很少用,常见的是在多线程和事件处理(例如 Swing,xml 解析)时才需要用到。这里总结一下嵌套类的一些特性。

 

嵌套类的定义

  • 在一个类中定义的类,就称为嵌套类 (nested class)。嵌套类分为两大类,静态嵌套类 (static nested class) 和非静态嵌套类 (non-static nested class),非静态嵌套类也叫内部类 (inner class)。
  • 定义嵌套类时可以使用任意访问修饰符 (private, protected, public, 默认),不同于普通类只能使用 public 或者默认。

使用嵌套类的原因

  • 嵌套类可作为一种类的逻辑分组方式。例如类 B 只对类 A 有用,那么将 B 作为 A 的内部类更合适。
  • 更好的封装。例如上述类 A 和 B,如果 B 是内部类,就可以直接访问 A 的成员。
  • 能使代码的可读性和可维护性更好。

静态嵌套类

  • 静态嵌套类实际上跟一个普通的类一样,只是因为有利于类的逻辑分组而使用。

内部类

  • 内部类跟类的成员相似,可以访问其它类成员(变量或方法)。一个内部类的实例必须存在其外部类的一个实例中。内部类不能有静态成员(静态成员只能在顶级类或静态嵌套类中声明)。
  • 内部类出现跟外部类成员变量同名的变量时,默认访问内部类成员,但可以用 "外部类名.this.变量名" 来访问同名的外部类成员。
  • 在方法内定义的类称为本地内部类 (local inner class)。
  • 如果一个内部类是一个子类(继承了父类或者实现了接口),它可以没有类名,这样的类称为匿名内部类或匿名类 (anonymous [inner] class)。
Outer outer = new Outer();
Inner inner = outer.new Inner(); // 内部类的实例化

 

匿名类

  • 匿名类不能定义构造方法(因为它没有类名),但可以使用初始化块 (initialization block) 进行初始化。如果它继承自某个类,则新建实例时可以调用父类的构造方法(但不能重写)。
  • 匿名类如果处于方法内,则使用其包围方法的局部变量时,这个变量必须声明为final。而使用其外部类的成员时则没有这个限制。
// 匿名类例子
public class AnonymousClassTest {
  
  private String str = "outer str";
  
  public static void main(String[] args) {
    Base base = new AnonymousClassTest().getBase();
    base.print();
  }
  
  public Base getBase() {
    return new Base(5) { // 匿名类,调用父类的构造函数
      
      private String str = "inner str"; // 跟外部类成员变量同名
      
      {
        i = 10; // 可以在初始化块中进行必要的初始化
      }
      
      public void print() {
        System.out.println("Anonymous print(), i = " + i + 
            ", str = " + AnonymousClassTest.this.str); // 访问同名的外部类成员
      }
    };
  }

}

abstract class Base {
  protected int i;
  
  public Base(int i) {
    System.out.println("Base Constructor, i = " + i);
  }
  
  public abstract void print();
}

 

参考资源

http://download.oracle.com/javase/tutorial/java/javaOO/nested.html

 

http://www.java2s.com/Tutorial/Java/0100__Class-Definition/0201__Anonymous-inner-class.htm

1
0
分享到:
评论

相关推荐

    Java 深入理解嵌套类和内部类

    Java 嵌套类和内部类详解 Java 中的嵌套类和内部类是指在一个类的内部定义另一个类,这种类称为嵌套类(nested classes)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称...

    从Java嵌套类中访问外部类成员.doc

    在给定的文档中,讨论的是如何从Java嵌套类中访问外部类的成员以及一些相关的概念。 首先,嵌套类分为两种主要类型:静态嵌套类(也称为内部静态类)和非静态嵌套类(也称为实例内部类)。非静态嵌套类可以访问外部...

    深入理解Java嵌套类和内部类

    深入理解Java嵌套类和内部类 Java 嵌套类(nested classes)是指在一个类的内部定义另一个类,这种类有两种类型:静态嵌套类和非静态嵌套类。非静态嵌套类也称为内部类(inner classes)。在Java中,嵌套类从JDK1.1...

    java嵌套类

    在Java语言中,嵌套类(Nested Classes)是Java语言规范中定义的术语,指的是在其他类或接口的主体内部声明的类。嵌套类可以细分为多种类型,每种类型都有其特点和使用场景。 首先,根据嵌套类定义的位置,可以将...

    java-嵌套类(inner class)-来自oracle官网

    ### Java嵌套类详解 #### 一、嵌套类(Nested Class)概述 嵌套类是一种在Java中非常有用的特性,允许开发者在一个类或者接口的内部定义另一个类。这种结构可以增强代码的组织性和封装性。 ##### 1.1 嵌套类的...

    java嵌套接口程序

    java 嵌套接口 程序 学习java必须要学习的经典案例,加油学习把

    java 嵌套类的详解及实例代码

    Java中的嵌套类是一种强大的特性,它允许在一个类的内部定义另一个类。这种设计模式提供了更高的封装性和灵活性,尤其在处理复杂的数据结构和算法时。本文将深入探讨嵌套类的详解及其实例代码。 首先,我们要区分两...

    Java嵌套类和内部类详解

    Java中的嵌套类和内部类是面向对象编程中一种特殊的类定义方式,允许在一个类的定义内部创建另一个类。这种特性使得代码结构更加紧凑,同时也提供了更高级别的封装和抽象。在Java中,嵌套类分为静态嵌套类和非静态...

    19.java嵌套的try…catch语句.zip

    19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的try…catch语句.zip19.java嵌套的...

    json转对象(java 多级嵌套)

    例如,如果`InnerObject`还包含另一个嵌套的JSON对象,只需在Java类中添加相应的字段并定义相应的getter和setter即可。`ObjectMapper`会根据JSON结构解析并填充Java对象。 5. **反向操作:Java对象转JSON** 除了将...

    java和kotlin的内部类静态嵌套类

    Java和Kotlin是两种在移动开发领域广泛应用的编程语言,尤其在Android开发中占据主导地位。内部类和静态嵌套类是...在提供的资源中,"java内部类嵌套类"和"kotlin内部类嵌套类"的示例代码将帮助你进一步巩固这些概念。

    java实现多层嵌套循环参数转换

    例如,如果有一个表示组织结构的类,其中包含子组织的列表,我们可以使用递归或嵌套循环来遍历整个结构: ```java public void traverseOrganization(Organization org) { // 处理当前组织 processOrganization...

    Java精华版 chm Java API、嵌套类和内部类、与时间有关的类Date,DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等

    本Java精华内容深入Java API、嵌套类和内部类、与时间有关的类Date,DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及...

    java for语句嵌套练习,打印各种星型

    这是一个关于Java的for语句嵌套练习,可以打印出各种星型,供大家学习,很有意思哦~~

    java静态内部类(嵌套类)

    ### Java静态内部类(嵌套类)详解 #### 一、静态内部类概念与特性 在Java编程语言中,静态内部类(也被称为嵌套类)是一种特殊的内部类形式,它通过`static`关键字来定义。与普通内部类相比,静态内部类具有以下...

    java try…catch嵌套捕获异常的实例

    总结来说,`try-catch`嵌套在Java中用于更精细化的异常处理,允许我们针对不同类型的异常执行不同的恢复策略。通过这种方式,我们可以编写更健壮、更易维护的代码,确保程序在面对错误时能够优雅地处理并继续运行。

    多层集合嵌套的JSON数据转化为Java对象(src.zip)

    当JSON数据包含嵌套的对象时,我们需要创建对应的Java类来存储数据。例如,对于上面的JSON,我们可以创建两个类:`MainObject`和`SubObject`。 ```java public class MainObject { private String key1; ...

    java开发中嵌套类的详解及实例

    Java开发中嵌套类的详解及实例 嵌套类是Java语言中的一种特殊的类,定义在另一个类或接口内部。嵌套类可以分为三种类型:成员嵌套类、局部嵌套类和匿名嵌套类。 1. 成员嵌套类(Member Nested Class) 成员嵌套类...

    详解Java 中的嵌套类与内部类

    详解Java中的嵌套类与内部类 Java中的嵌套类与内部类是 Java编程语言中的一种重要概念,它们在Java程序设计中扮演着重要角色。下面我们将详细介绍Java中的嵌套类与内部类。 嵌套类(Nested Class)可以在一个类...

    java freemark list嵌套导出word

    在Java应用中,使用FreeMarker导出Word文档时,经常会遇到列表(list)的嵌套问题,这涉及到数据模型构建、模板设计以及Word文档的格式化。下面我们将详细探讨这个主题。 1. **FreeMarker简介** FreeMarker是一个...

Global site tag (gtag.js) - Google Analytics