随笔 - 35  文章 - 21  trackbacks - 0
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

一 概念:

Java将嵌套类分成两个主要的分类:静态嵌套类(static nested classes)和内部类(inner classes)。

1 嵌套类(nested classes),在一个类内部定义的另一个类,称为嵌套类。
  嵌套类分为两种, static 修饰的 静态嵌套类, 和无 static 修饰的 非静态嵌套类,也叫作 内部类。

2 内部类(inner classes), 无 static 修饰的 非静态嵌套类。

Java还进一步将内部类分为:

实例内部类(instance inner class) ,假设在声明嵌套类时,没有在前面加上static关键字。这样得到的是个实例内部类。静态嵌套类只能够访问外部类的static成员,而实例内部类能够同时访问static和实例成员。

本地内部类(local inner class),Java允许在任意的代码段中放入一个类,该类的代码放在一对大括号中{  }。这意味着类能够出现在一个方法中,甚至是在if语句的一对括号中。这样的类就称为本地内部类。相对于实例内部类来说,本地内部类和有一个好处。他除了能够访问外部类的实例和类字段外(称为实例和类方法),还能够访问本地变量和方法的参数。

匿名内部类(and anonymous inner class),没有给出类名的内部类为匿名内部类。

二 使用:

1. 访问内部类:

我们可以在嵌套类(包括静态的和非静态的 )前加上 private,protected 或 public 关键字,以指示该类在外部类以外的访问级别。

具体访问方法如下:
(1).内部类,要以如下形式访问, outclass 是 OutClass 的一个实例,它放在 new 前指示内部类的实例是属于一个特定的外部类的实例的。 这是因为,只有外部类的实例存在,他的实例内部类( 也就是非静态内部类)才能存在。

   //
innerclass
  OutClass outclass = new OutClass();
 

  OutClass.InnerClass innerclass = outclass.new InnerClass();
  innerclass.normalMethod();


(2).静态嵌套类, 可以用 OutClass.StaticInnerClass 来指示。
静态嵌套类,可以有实例成员(实例方法 和 实例变量)
访问静态嵌套类的实例域,需要先实例化静态嵌套类。
这个类是静态的,它不依赖于它外部类的某个实例,所以无须先实例化外部类。这和内部类是不一样的。

  OutClass.StaticInnerClass staticinnerclass = new OutClass.StaticInnerClass();
  staticinnerclass.normalMethod();


(3).静态嵌套类的静态方法,可以用 OutClass.StaticInnerClass.staticMethod() 来访问。

实例代码:
// OutClass.java
public class OutClass {

    
// non static inner classes
    class InnerClass{
    
        
public void normalMethod(){
            System.out.println(
" success: non-static innerclass");
        }
    }
    
    
// static inner classes
    static class StaticInnerClass
    {
        
//non static method of static inner classes
        public void normalMethod()
        {
            System.out.println(
" success: non static method of static innerclas");
        }
        
        
// static methode of static inner classes
        static public void staticMethod()
        {
            System.out.println(
" success: static method of static innerclass");
        }
    }
}
// end of InnerClass

// Test.java
public class Test {

public static void main(String[] args){

  OutClass outclass 
= new OutClass();
  
  
// innerclass
  OutClass.InnerClass innerclass = outclass.new InnerClass();
  innerclass.normalMethod();
  
  
// non static method of static innerclas
  OutClass.StaticInnerClass staticinnerclass = new OutClass.StaticInnerClass();
  staticinnerclass.normalMethod();

  
// static method of static innerclass
  OutClass.StaticInnerClass.staticMethod(); 
  }
}
// end of Test

2. 嵌套类 访问 外部类的成员:

(1). 外部类对于内部类(非静态嵌套类)是透明的。包括外部类的private成员,其内部类都可以自由访问。

(2). 一个静态嵌套类只能访问外部类的静态方法,它是不能访问任何外部类的实例成员(包括变量和方法)。

(3). 内部类中的 this 是指内部类本身。内部类的成员和外部类的成员名冲突,内部类内,冲突的成员名是指内部类成员。
要调用外部类的冲突的成员,要以 外部类的类名 指示:对于冲突的变量 OutClass.conflitName  对于冲突的方法 OutClass.conflitName()。

posted on 2008-08-13 04:49 lincode 阅读(857) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: