Java学习笔记五(内部类 )

1 内部类的优缺点

  在一个类的内部还存在另外一个类,则成为内部类。内部类可以是public 或者private,对其访问的控制与类的成员变量和 成员方法相同。

  内部类的缺点:内部类其实严重破坏了良好的代码结构

  内部类的优点:方便的访问外部类中的私有属性;将内部类拿到外部之后,代码会增加,复杂度也会增加;

2 基本的内部类结构

class Outer{
    
    private String info = "Hello outer inner class";
    
    class Inner{
        public void print(){
            System.out.println(info);
        }
    }
    
    public void fun(){
        System.out.println("Outer class fun");
        new Inner().print();
    }
}


public class InnerDemo {
    
    public static void main(String [] args){
        
        //定义内部类
        Outer.Inner in = null;
        in =new Outer().new Inner();
        in.print();
        new Outer().fun();
        new Outer().new Inner().print();
    }

}

特点分析:定义内部类的时候必须指定所属的外部类;必须先实例化外部类,才能实例化内部类;

3 static 声明的内部类

class Outer{

    private static String info = "Hello outer class";
    static class Inner{
        public void print(){
            System.out.println(info);
        }
    };
    
    public void fun(){
        new Inner().print();
    }
    
}

public class InnerDemo{

    public static void main(String []args){
        
        //定义方式
        Outer.Inner in = null;
    //    in = new Outer().new Inner();// 错误的方式
        
        in = new Outer.Inner();
        
        in.print();
        new Outer.Inner().print();
}
}

特点分析:可以直接通过外部类.内部类直接访问,具有一定的局限性,内部类只能访问外部类的静态数据成员。

4私有内部类 

class Outer{

    private  String info = "Hello outer class";
    private class Inner{
        public void print(){
            System.out.println(info);
        }
    };
    
    public void fun(){
        new Inner().print();
    }
    
}

public class InnerDemo{

    public static void main(String []args){
        
        /*定义方式错误
        Outer.Inner in = null;
        
        in = new Outer().Inner();
        in.print();
        */
        
        new Outer().fun();
}
}

特点分析:如果一个内部类只希望被外部类进行访问,可以使用private来声明内部类;必须在外部类中生成内部类进行操作,不能使用new Outer().new Inner()进行定义。

5 在类的方法中定义的内部类

class Outer{
    private String info = "Hello outer class";
    
    //无参数的方法
    public void fun(){
        class Inner1{
            public void print(){
                System.out.println(info);
            }
        }
        
        new Inner1().print();
    }
    
    //有参数的方法
    public void fun(final String str){
        class Inner2{
            public void print(){
                System.out.println(info);
                System.out.println(str);
            }
        }
        
        new Inner2().print();
    }
    
};

public class InnerDemo{
    
    public static void main(String []args){
        new Outer().fun();
        new Outer().fun("zhang");
    }
}

特点分析:在外部类的方法中生成一个内部类去调用内部类中的方法;如果外部类的方法中需要传递参数,参数的类型必须为final。

posted @ 2014-11-26 21:15  zxjay  阅读(1067)  评论(0编辑  收藏  举报