敬的世界

常用链接

统计

最新评论

嵌套类和内部类

 来自: http://www.blogjava.net/lincode/archive/2008/08/13/221594.html

一 概念:

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 2009-10-14 23:26 picture talk 阅读(264) 评论(0)  编辑  收藏 所属分类: Java


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


网站导航: