`
cleanboxer
  • 浏览: 35510 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java 内部类 - 2

阅读更多
---------转载 builder.com.cn
2          Member class(成员类)
一个静态成员类,若去掉“static”关键字,就成为成员类。如下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个成员类
 

 

<!---->public class Outer {
    
//just like instance method, member class has public/private/default access privilege levels
    private int data;
    
    
//access privilege level: public 
    public class Inner1 {
        
private int data;
        
private int data1;
        
public Inner1() {
            
//member class can access its outer class' instance field directly
            data1 = 1;
            
//itself data field
            data = 1;
            
//its outer class instance field
            Outer.this.data = 1;
        }
    }
    
    
//access privilege level: default
    class Inner2 {
        
//can not define static filed, method, class in member class
        
//static int j = 1;
        
        
//but, "static final" compound is allowed 
        static final int CONSTANT = 1;
    }
    
    
//access privilege level: private 
    private class Inner3 {
        
public class Inner4 
    }
    
    
//in fact, Inner5 is not a member class but a static member class
    interface Inner5 
    
    
private static void staticMethod() {
        
//can not create a member class instance directly in outer class' static method
        
//Inner1 inner1 = new Inner1();
    }
    
    
private void instanceMethod() {
        
//can create a member class instance in outer class' instance method
        Inner1 inner1 = new Inner1();
    }
}

class Test {
    
public Test() {
        
//cannot create member class instance directly in class other than outer class
        
//Outer.Inner2 inner2 = new Outer.Inner2();
        
        
//create a member class instance outside it's outer class
        Outer outer = new Outer();
        Outer.Inner1 inner1 
= outer.new Inner1();
    }
}
 
 
2.1      成员类特性
·        类似于外部类的实例函数,成员类有public/private/default权限修饰符
·        一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。
2.2      成员类约束

成员类不能与外部类重名

不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去

成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static关键字对inner interface是内含(implicit)的。

2.3      新增语法
    一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用“OuterClass.this”的形式。
2.4      指定内部类实例所属的外部类实例
内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外
部类实例自然就是创建它的外部类实例方法对应的外部类实例。
          另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:
OuterClass.InnerClass innerClass = outerClass.new InnerClass();

2.5      什么时候使用成员类
     成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。
       以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:
<!---->public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    
private class Itr implements Iterator<E> {
         ………;
    }

     
public Iterator<E> iterator() {
        
return new Itr();
     }
}
 

 

    因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
    试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。
分享到:
评论

相关推荐

    Java语法总结 - 内部类

    Java内部类详解 Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法...

    Java ---- 局部内部类 静态内部类 普通内部类

    Java ---- 局部内部类 静态内部类 普通内部类

    java接口与内部类教学PPT

    1.接口-简介 2....内部类-简介 8.内部类-作用 9.内部类-特殊语法规则 10.内部类-安全性 11.内部类-局部内部类 12.内部类-匿名内部类 13.内部类-静态内部类 14.综述

    java-1.8.0-openjdk.linux.x86_64

    OpenJDK 1.8.0 版本包含了Java语言的关键特性,如泛型、枚举、匿名内部类、动态代理、增强的for循环、可变参数、注解等。此外,它还提供了Lambda表达式、函数式接口、Stream API、Optional类等Java 8的新特性,这些...

    taobao-java-sdk-1.0.0_taoбao_ddsdk_钉钉收_dingtalk_

    2. **使用场景** - **访问钉钉小程序**:SDK使得开发者可以轻松地创建和管理钉钉小程序,实现自定义的业务逻辑和界面展示。 - **数据拉取**:通过SDK,开发者能够从钉钉平台获取员工信息、考勤记录、审批流数据等...

    java语言--内部类总结

    《Java语言——内部类详解》 内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以提供更复杂的封装,使得代码结构更加清晰,同时还能访问外部类的私有成员,提供了更高级别...

    Java内部类总结

    ### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...

    java内部类详解

    2. 成员内部类(Member Inner Class) 成员内部类不带 `static` 关键字,它们像普通成员变量一样,与外部类实例关联。每个成员内部类的实例都与外部类的一个实例绑定。成员内部类可以访问外部类的所有成员,包括...

    java内部类的讲解

    ### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...

    JAVA语法总结 - 内部类

    ### JAVA语法总结 - 内部类 #### 一、内部类概述 内部类(Inner Class)自Java 1.1版本引入以来,一直是Java编程语言中的一个重要特性。它允许开发者在一个类的内部定义另一个类,这有助于更好地组织代码并实现更...

    JAVA 内部类 PPT

    Java内部类是Java语言的一个独特特性,它允许我们在一个类的内部定义另一个类。这种设计提供了更高级别的封装和组织代码的方式。以下是关于内部类及其相关知识点的详细说明: 1. **内部类基本语法** - **实例内部...

    Java-WebSocket-1.3.0.jar,Java-WebSocket-1.3.0-sources.jar

    `Java-WebSocket-1.3.0-sources.jar` 包含了库的源代码,这对于开发人员来说非常有用,因为它允许他们查看和理解库内部的工作机制,方便调试、学习和定制。如果遇到问题或需要对库进行扩展,可以直接查看源代码,...

    javabase64-1.2.jar

    通常,一个.jar文件是Java的归档文件,它封装了多个编译后的Java类文件以及相关的元数据,方便Java应用程序或应用服务器引用。这个库的命名方式表明它专注于Base64操作,可能提供了比Java标准库更丰富的API或者优化...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态...

    12.java内部类.zip

    12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...

    java 内部类应用

    Java内部类是Java语言的一个特色特性,它允许我们在一个类的内部定义另一个类。这种设计模式在处理一些特定情况时非常有用,例如实现匿名回调、封装特定逻辑或创建与外部类有紧密关系的类。本篇文章将深入探讨Java...

    java 内部类使用(内部匿名类)

    Java内部类是Java语言提供的一种独特机制,它允许在一个类的内部定义另一个类。这种设计模式使得代码结构更紧凑,可以更好地封装和隐藏实现细节,同时也增强了代码的复用性。内部类分为几种类型,包括成员内部类、...

    java基础第七章内部类与异常类.doc

    Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...

Global site tag (gtag.js) - Google Analytics