黑马Java学习笔记之-----内部类

---------------------- android培训java培训期待与您交流! ----------------------

 

内部类:

  把一个类定义在某个类中的,这个类就被称为内部类,内置类,嵌套类。

访问特点:

  A:内部类可以直接访问外部类中的成员,因为内部类持有外部类的引用,

    格式为:外部类名.this

    B:外部类要想访问内部类的成员,必须创建对象访问。

 

内部类的访问:

 

  A:当内部类定义在外部类的成员位置,而且非私有,则可以在其他外部类中直接建立内部类对象

 

      格式:外部类名.内部类名  变量名 = new 外部类对象.内部类对象

 

      如:Outer.Inner in = new Outer().new Inner()

 

  B:当内部类在外部类成员位置,且被static修饰

 

      **外部其他类可直接访问静态内部类的非静态成员

 

        格式:new 外部类名.内部类名().内部类成员

 

        如:new Outer.Inner().function();

 

     **外部其他类可直接访问静态内部类的静态成员

 

        格式:new 外部类名.内部类名.内部类成员

 

        如:new Outer.Inner.function();

 

内部类的分类

  成员内部类、静态内部类、方法内部类、匿名内部类。

 

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量,仍然是只能访问外部类的静态成员变量。

class Outer {
  class Inner{}
} 

编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。

  方法内部类

class Outer {
    public void doSomething(){
        class Inner{
            public void seeOuter(){
            }
        } 
    }
}

(1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。

注:因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。

  静态内部类:该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。

    静态内部类只能访问外部类的静态属性和方法。

class Outer{
    static class Inner{}
}

class Test {
    public static void main(String[] args){
        Outer.Inner n = new Outer.Inner();
}
}

  匿名内部类:没有名字的内部类。

    什么情况下需要使用匿名内部类:

      ·只用到类的一个实例。

      ·类在定义后马上用到。

      ·类非常小(SUN推荐是在4行代码以下)

      ·给类命名并不会导致你的代码更容易被理解。

    使用匿名内部类的几个原则:

      ·匿名内部类不能有构造方法。

      ·匿名内部类不能定义任何静态成员、静态方法。

      ·匿名内部类不能是public,protected,private,static。

      ·只能创建匿名内部类的一个实例。

      ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

      ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

 1 interface Inter{
 2     public abstract void method();
 3 }
 4 
 5 class Test{
 6     
 7     public static Inter function(){
 8         return new Inter(){
 9             public void method(){
10                 System.out.println("method invoked!");
11             }
12         };
13     }
14 }
15 public class InnerTest {
16 
17     /**
18      * @param args
19      */
20     public static void main(String[] args) {
21         Test.function().method();
22 
23     }
24 
25 }

 

 为什么需要内部类?

  典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:

  每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。

 


 

 

---------------------- android培训java培训期待与您交流! ----------------------

posted @ 2013-04-29 02:05  Mercy_K  阅读(132)  评论(0编辑  收藏  举报