内部类和匿名内部类

一、内部类

内部类的访问规则:

  1.内部类可以直接访问外部类中的成员包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式为     外部类名.this 

  2.外部类要访问内部类必须建立内部类对象。

复制代码
 1 public class Out {
 2     private int num=4;
 3     class inner{
 4 //        int num=5;
 5         public void function(){
 6 //            int num=6;
 7             System.out.println("inner:"+num);//此处省略了   Out.this.num    所以能直接访问外部类中的成员
 8         }
 9     }
10     
11     public void method(){
12         inner in=new inner();
13         in.function();//外部类要访问内部类必须建立内部类对象。
14     }
15 }
复制代码

测试类

public class InnerTest {
    public static void main(String[] args) {
        Out out=new Out();
        out.method();
    }
}

 2.当内部类在成员位置上时,就可以被成员修饰符所修饰。

  比如,private:将内部类在外部类中进行封装。

     static:内部类就具备了static的特性。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限性。

 

注意当内部类中定义了静态成员该内部类必须是静态的。

  当外部类中的静态方法访问内部类时,内部类也必须是静态的。

3.内部类定义在局部时

  1.不可以被成员修饰符所修饰

  2.可以直接访问外部类中的成员,因为还持有外部类中的引用但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量。

 

复制代码
 1 public class Out {
 2     private int num=4;
 3     public void method(){
 4         final int  num=6;//内部类定义在局部时只能访问被final修饰的局部变量。
 5         class inner{
 6             void show(){
 7                 System.out.println("num="+num);
 8             }
 9         }
10         new inner().show();//建立内部类的对象调用内部类的方法。
11     }
12 }
复制代码

 

1 public class InnerTest {
2     public static void main(String[] args) {
3         new Out().method();
4     }
5 }

 二、匿名内部类

   1.匿名内部类其实就是内部类的简写格式。

   2.定义匿名内部类的前提:内部类必须是继承一个类或实现接口。

   3.匿名内部类的格式:   new 父类或者接口(){定义子类内容}

   4.其实匿名内部类就是一个匿名子类对象。

public abstract class InnerDemo {
    abstract void show();
}
复制代码
 1 public class Out {
 2     int num = 5;
 3 
 4     public class Inner extends InnerDemo {
 5 
 6         @Override
 7         void show() {
 8             System.out.println("num=" + num);
 9 
10         }
11 
12     }
13 
14     public void function() {
15         new Out().new Inner().show();
16 
17     }
18 }
复制代码

上面的内部类可以用匿名内部类的进行简写,如下

复制代码
 1 public class Out {
 2     int num = 5;
 3 
 4     public void function() {
 5         new InnerDemo(){
 6             //覆写InnerDemo中的抽象方法
 7             @Override
 8             void show() {
 9                 System.out.println("num="+num);
10                 
11             }
12             
13         }.show();//InnerDemo类的匿名子类对象调用自己的show()方法
14     }
15 }
复制代码

 

posted @   大发  阅读(319)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示