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

内部类

阅读更多
内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:

成员内部类、局部内部类、静态内部类、匿名内部类
                                                                                   
为什么需要内部类?
     典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:
每 个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多 个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实 现了“多重继承”。

A:成员内部类
作为外部类的一个成员存在,与外部类的属性、方法并列。
publicclass Outer {
       privatestaticinti = 1;
       privateintj = 10;
       privateintk = 20;
       publicstaticvoidouter_f1() {
       }
       publicvoidouter_f2() {
       }
       // 成员内部类中,不能定义静态成员
       // 成员内部类中,可以访问外部类的所有成员
       class Inner {
              // static int inner_i = 100;//内部类中不允许定义静态变量
              intj = 100; // 内部类和外部类的实例变量可以共存
              intinner_i = 1;
              void inner_f1() {
                     System.out.println(i);
                         //在内部类中访问内部类自己的变量直接用变量名
                     System.out.println(j);
                         //在内部类中访问内部类自己的变量也可以用this.变量名
                     System.out.println(this.j);
                         //在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名
                     System.out.println(Outer.this.j);
                         //如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量
                     System.out.println(k);
                                          outer_f1();
                                          outer_f2();
              }
       }
       //外部类的非静态方法访问成员内部类
       publicvoidouter_f3() {
              Inner inner = new Inner();
              inner.inner_f1();
       }
       // 外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样
       publicstaticvoidouter_f4() {
              //step1 建立外部类对象
              Outer out = new Outer();
              //step2 根据外部类对象建立内部类对象
              Inner inner = out.new Inner();
              //step3 访问内部类的方法
              inner.inner_f1();
       }
       publicstaticvoid main(String[] args) {
              //outer_f4();//该语句的输出结果和下面三条语句的输出结果一样
              //如果要直接创建内部类的对象,不能想当然地认为只需加上外围类Outer的名字,
              //就可以按照通常的样子生成内部类的对象,而是必须使用此外围类的一个对象来
              //创建其内部类的一个对象:
              //Outer.Inner outin = out.new Inner()
              //因此,除非你已经有了外围类的一个对象,否则不可能生成内部类的对象。因为此
              //内部类的对象会悄悄地链接到创建它的外围类的对象。如果你用的是静态的内部类,
              //那就不需要对其外围类对象的引用。
              Outer out = new Outer();
              Outer.Inner outin = out.new Inner();
              outin.inner_f1();
       }
}

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完 成后出现outer.class和outer$inner.class两类。
B:局部内部类
在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。
publicclass Outer {
       privateints = 100;
       privateintout_i = 1;
       publicvoid f(finalint k) {
              finalint s = 200;
              int i = 1;
              finalint j = 10;
            
                 //定义在方法内部
              class Inner {
                     ints = 300;// 可以定义与外部类同名的变量
                     // static int m = 20;//不可以定义静态变量
                     Inner(int k) {
                            inner_f(k);
                     }
                     intinner_i = 100;
                     voidinner_f(int k) {
                         //如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
                            System.out.println(out_i);
                         //可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的
                            System.out.println(j);
                            //System.out.println(i);
                         //如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
                            System.out.println(s);
                         //用this.变量名访问的也是内部类变量
                            System.out.println(this.s);
                         //用外部类名.this.内部类变量名访问的是外部类变量
                            System.out.println(Outer.this.s);
                     }
              }
              new Inner(k);
       }
       publicstaticvoid main(String[] args) {
              // 访问局部内部类必须先有外部类对象
              Outer out = new Outer();
              out.f(3);
       }
}

 
java内部类总结[转二]
2008-07-08 12:25
C:静态内部类(嵌套类):(注意:前两种内部类与变量类似,所以可以对照参考变量)
如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部 类是static的时,就不是这样了。嵌套类意味着:
1. 要创建嵌套类的对象,并不需要其外围类的对象。
2. 不能从嵌套类的对象中访问非静态的外围类对象。
publicclass Outer {
       privatestaticinti = 1;
       privateintj = 10;
       publicstaticvoidouter_f1() {
       }
分享到:
评论

相关推荐

    内部类分类及应用

    在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...

    内部类 匿名内部类 内部接口 对比说明

    内部类是Java编程语言中的一种特性,它允许我们在一个类的内部定义另一个类。这种设计模式在Android开发中尤其常见,因为它可以有效地管理代码和实现特定的功能。本文将详细探讨内部类、匿名内部类以及内部接口的...

    Java4Android 35_内部类和匿名内部类

    在Java编程语言中,内部类和匿名内部类是两种特殊类型的类,它们为代码的组织和功能实现提供了独特的灵活性。本教程"Java4Android 35_内部类和匿名内部类"深入探讨了这两个概念,旨在帮助开发者更好地理解和运用它们...

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

    内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...

    java 匿名内部类的使用规范

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...

    Java语法总结 - 内部类

    内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。 成员内部类 成员内部类是定义在外部类的成员变量中的一种内部类。它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。成员内部...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

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

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

    java内部类的讲解

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

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    内部类的分类及各自用法

    根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...

    反射私有内部类的例子

    ### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...

    JAVA 内部类 PPT

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

    内部类的使用

    首先,内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像其他成员变量一样,可以直接访问外部类的所有成员,包括私有成员。局部内部类只存在于某个方法内,它的作用范围更小,...

    java内部类详解

    内部类主要分为四种类型:静态内部类、成员内部类、局部内部类和匿名内部类。 1. 静态内部类(Static Inner Class) 静态内部类与普通的类类似,只是它们定义在外部类中,并且前面带有 `static` 关键字。它们不会...

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

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

    Java内部类总结

    Java内部类主要包括以下几种类型:成员内部类(非静态内部类)、静态内部类(也称为静态嵌套类)、局部内部类和匿名内部类。 - **成员内部类**:这种类型的内部类是定义在外部类的一个成员位置上,它可以访问外部类...

    浅谈内部类与静态内部类的应用

    内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态内部类。 成员内部类,就像它的名字一样,是类的一个成员,与字段和方法处于同一级别。它可以访问外部...

    Java内部类(DOC)

    ### Java内部类(DOC)详解 #### 一、概述 Java内部类是Java语言中一个重要的概念,它指的是那些类定义被嵌套在其他类定义中的类。与之相对应的是顶层类,即那些类定义没有被嵌套在其他类中的类。内部类又可以...

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

    内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...

Global site tag (gtag.js) - Google Analytics