内部类

1)如果在一个类的内部再定义一个类,就是内部类,而外面的类叫外部类。

2)内部类可声明为public或private访问权限,对内部类的用法和限制与对成员变量和成员方法是相同的。

例子:

class Outer{        // 定义外部类
    private String info = "hello world" ;    // 定义外部类的私有属性
    class Inner{    // 定义内部类
        public void print(){                // 定义内部类的方法
            System.out.println(info) ;        // 直接访问外部类的私有属性
        }
    };
    public void fun(){                        // 定义外部类的方法
        new Inner().print() ;                // 通过内部类的实例化对象(匿名对象)调用方法
    }
};
public class InnerClassDemo01{
    public static void main(String args[]){
        new Outer().fun() ;                    // 调用外部类的fun()方法
    }
};

以上程序中,Inner作为内部类,并且在外部类的fun()方法中直接实例化内部类对象,并调用print()方法。

内部类存在的特点:

缺点:正常的类操作时,在类中最好只定义属性和方法。如果定义一个类的话,则肯定破坏了程序的结构。

优点:要想发现优点,通过代码拆分了解,将以上内部类和外部类变成两个类,再变成同样效果。

class Outer{        // 定义外部类
    private String info = "hello world" ;    // 定义外部类的私有属性
    public void fun(){                        // 定义外部类的方法
        new Inner(this).print() ;     // 通过内部类的实例化对象调用方法,
   //这里的this表示调用当前方法的对象,也就是主方法中的new Outer()匿名对象。
} public String getInfo(){ // 增加了一个getter方法取得info内容 return this.info ; } }; class Inner{ // 定义内部类 private Outer out = null ; // 声明Outer对象,用来接收传送过来的主方法中的new Outer()对象。 public Inner(Outer out){         //Outer类中new Inner(this),把主方法中的new Outer()匿名对象传递过来了, this.out = out ; } public void print(){ // 定义内部类的方法 System.out.println(this.out.getInfo()) ; // 直接访问外部类的私有属性 } }; public class InnerClassDemo02{ public static void main(String args[]){ new Outer().fun() ; // 调用外部类的fun()方法 } };

如果把内部类拿出去,会发现代码量增加,而且复杂度大大增加。

使用内部类最大优点:

可以方便的访问外部类中的私有属性。

但是,以上内部类是无法在外部直接调用的,是无法按照外部类形式使用的。

如:

class Outer{        // 定义外部类
    private static String info = "hello world" ;    // 定义外部类的私有属性
     class Inner{    
        public void print(){                // 定义内部类的方法
            System.out.println(info) ;        // 直接访问外部类的私有属性
        }
    };
    public void fun(){                        // 定义外部类的方法
        new Inner().print() ;                // 通过内部类的实例化对象调用方法
    }
};
public class InnerClassDemo03{
    public static void main(String args[]){
        new Outer.Inner().print() ;                    //无法直接调用外部类的fun()方法
    }
};

以上在外部是无法直接调用的。

解决方法就是:利用static声明内部类。

利用static声明内部类

如果一个内部类使用static声明,则此内部类就称为外部类,可以直接通过”外部类.内部类“进行访问

class Outer{        // 定义外部类
    private static String info = "hello world" ;    // 定义外部类的私有属性,必须是static修饰的才能被内部类使用,
  //因为内部类被static修饰了。
static class Inner{ // 使用static定义内部类为外部类 public void print(){ // 定义内部类的方法 System.out.println(info) ; // 直接访问外部类的私有属性 } }; public void fun(){ // 定义外部类的方法 new Inner().print() ; // 通过内部类的实例化对象调用方法 } }; public class InnerClassDemo03{ public static void main(String args[]){ new Outer.Inner().print() ; // 调用外部类的fun()方法,注意,这里Outer.Inner是一个整体,相当于一个类名。
    //这里是实现一个内部类的实例化对象,看清楚是new Outer.Inner(),而不是new Outer().new Inner(),这里Outer.Inner相当于一个类名使用。

    }
};

1)使用static可以声明一个内部类,可以在类的外部调用。

2)但是,如果要想访问的外部类中的属性,则此属性必须是static访问权限的。

在外部访问内部类

一个内部类出来可以通过外部类访问,也可以在其他类中调用,

但是调用的格式:外部类.内部类  对象名=外部类实例.new  内部类();

class Outer{        // 定义外部类
    private String info = "hello world" ;    // 定义外部类的私有属性
    class Inner{    // 定义内部类
        public void print(){                // 定义内部类的方法
            System.out.println(info) ;        // 直接访问外部类的私有属性
        }
    };
    public void fun(){                        // 定义外部类的方法
        new Inner().print() ;                // 通过内部类的实例化对象调用方法
    }
};
public class InnerClassDemo04{
    public static void main(String args[]){
        Outer out = new Outer()    ;            // 外部类实例化对象
        Outer.Inner in = out.new Inner() ;    // 实例化内部类对象
        in.print() ;                        // 调用内部类的方法
    }
};

在方法中定义内部类

一个内部类可以在任何地方定义。下面看一下在方法中定义内部类。

class Outer{        // 定义外部类
    private String info = "hello world" ;    // 定义外部类的私有属性
    public void fun(final int temp){        // 定义外部类的方法,内部类要想使用方法中的参数,参数必须是final类型。
        class Inner{                        // 在方法中定义的内部类
            public void print(){                // 定义内部类的方法
                System.out.println("类中的属性:" + info) ;        // 直接访问外部类的私有属性
                System.out.println("方法中的参数:" + temp) ;
            }
        };
        new Inner().print() ;                // 通过内部类的实例化对象调用方法
    }
};
public class InnerClassDemo05{
    public static void main(String args[]){
        new Outer().fun(30) ;    // 调用外部类的方法
    }
};

总结

内部类在开发中非常有用处,而且是经常使用的,所以一定要熟悉其语法和优点。

在java开发中,会到处看到static修饰内部类的情况,一定要记住,使用static声明的内部类是外部类,

操作的时候要使用“内部类.外部类”的形式。

posted @ 2016-05-23 00:49  美好的明天  阅读(245)  评论(0编辑  收藏  举报