java内部类自我总结

内部类即是在一个类中定义的一个类。外边的类成为外部类,里面的类成为内部类。外部类前面的修饰符必须是public,内部类的修饰符可以private, public, protected,编译会产生两个类,外部类名.class, 外部类名$内部类名.class

一 java内部类的分类和特点

java内部类分成四种: 成员内部类, 静态内部类,局部内部类,匿名内部类。

成员内部类

与外部类的关系,作为外部类的一个成员存在。

访问原则,内部类可以访问外部类的任何成员,但是外部类不能访问内部类的成员,可以通过新建内部类的对象来访问内部类的成员,包款private成员,所以,一个内部类的对象对生成它的外部类对象是完全可见的,包括private内部类、private成员与private方法,同时,内部类对象可以访问外部类对象的任何成员,因为非静态内部类对象有着指向其外部类对象的引用,创建非静态内部类对象时,一定要先创建起相应的外部类对象。

要获得内部类实例,可以使用外部类的对象.new 内部类的方式获得内部类的实例。

OuterClassName.InnerClassName inner=new Ouer().new Inner();

在外部类的非static方法中,如果不是static方法,也可以通过如下方式来获得内部类的实例,但是在非外部类的其他类中,必须以上面的方式来获得内部类实例。

InnerClassName inner=new Ouer.Inner();
或者
InnerClassName inner=new Inner();

静态内部类

静态内部类和成员内部类相比,第一,静态内部类和外部类之间只是嵌套关系,没有其指向外部的引用; 第二,静态内部类不仅可以有非static成员,也可以有static成员; 第三,在获得内部类实例的时候,只能用后面一种方式,但是在非外部类的其他类中,则只能使用如下的一种,即:

InnerClassName inner=new Ouer.Inner();

局部内部类

写在一个方法中,或者一个语句块中的内部类,它的作用域仅限于该方法或者语句块。

01.public class Goods2 {  
02.    private void internalTracking(boolean b) {  
03.        if (b) {  
04.            class TrackingSlip {  
05.                private String id;  
06.                TrackingSlip(String s) {  
07.                    id = s;  
08.                }  
09.                String getSlip() {  
10.                    return id;  
11.                }  
12.            }  
13.            TrackingSlip ts = new TrackingSlip("slip");  
14.            String s = ts.getSlip();  
15.        }  
16.    }  
17.    public void track() {  
18.        internalTracking(true);  
19.    }  
20.    public static void main(String[] args) {  
21.        Goods2 g = new Goods2();  
22.        g.track();  
23.    }  
24.} 

匿名内部类

对于那些只适用一次,不需要对象名的场景,在swing的事件侦听中使用的比较多,比如,以下例子,只返回一个对象。

01.public class Goods3 {  
02.    public Contents cont() {  
03.        return new Contents() {  
04.            private int i = 11;  
05.            public int value() {  
06.                return i;  
07.            }  
08.        };  
09.    }  
10.} 

二 java内部类的访问原则

java内部类作为java的一个成员,和其他的成员的权限一样。

1 外部类对内部类的访问如上文所示;

2 和外部类同包的类,private的内部类不可见,其他类型的内部类中的private成员不可见,其他的均可以见;

3 和外部类不同包的类,只能访问public内部类的public成员;

4 继承外部类的类的访问,protected的内部类不可见。

如果让不可见的成员可见,可以通过添加接口方法,比如:

public class Out {    
public PrivateIn getPrivateIn(){       
return new PrivateIn();    
}        

private class PrivateIn implements InMethod{      
 private int private_arg;       
  int default_arg;      
  protected int protected_arg;       
  public int public_arg;

详细见: http://zhangjunhd.blog.51cto.com/113473/65624

三 java内部类的作用

1.内部类可以很好的实现隐藏

一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

2.内部类拥有外围类的所有元素的访问权限

3.可是实现多重继承

4.可以避免修改接口而实现同一个类中两种同名方法的调用。

引文:

http://zhangjunhd.blog.51cto.com/113473/65624

http://blog.csdn.net/ilibaba/article/details/3866537

http://andy136566.iteye.com/blog/1061951