1-15内部类

内部类的分类

内部类,顾名思义就是在一个类的内部声明一个类。内部类主要分为:

静态内部类
匿名内部类
成员内部类
局部内部类

内部类的特点:

内部类可以直接访问外部类的成员,包括private修饰的变量和方法

在编写swing程序时内部类出现的频率比较高,不过目前大部分软件公司基本都不会使用swing,所以本节内容简单了解即可。

静态内部类

1.静态内部类可以等同看做静态变量
2.静态内部类可以直接访问外部类的静态数据

public class OuterClass{

    //静态变量
    private static String s1 = "A";

    //成员变量
    private String s2 = "B";

    //静态方法
    private static void m1(){
        System.out.println("静态方法m1");
    }

    //成员方法
    private void m2(){
        System.out.println("m2方法");
    }

    //静态内部类
    //可以用访问控制权限的修饰符修饰。
    //public,protected,private,缺省
    static class InnerClass{

        //静态方法
        public static void m3(){
            System.out.println(s1);
            m1();
        }

        //成员方法
        public void m4(){
            System.out.println(s1);
            m1();
        }
    }


    public static void main(String[] args){

        //执行m3
        OuterClass.InnerClass.m3();

        //执行m4
        InnerClass inner = new OuterClass.InnerClass();
        inner.m4();

    }

}

成员内部类

1.成员内部类可以等同看做成员变量
2.成员内部类中不能有静态声明
3.成员内部类可以访问外部类所有的数据

public class OuterClass{

    //静态变量
    private static String s1 = "A";

    //成员变量
    private String s2 = "B";

    //静态方法
    private static void m1(){
        System.out.println("静态方法m1");
    }

    //成员方法
    private void m2(){
        System.out.println("m2方法");
    }

    //成员内部类
    //可以用访问控制权限的修饰符修饰。
    //public,protected,private,缺省
    class InnerClass{

        //静态方法
        //public static void m3(){}

        //成员方法
        public void m4(){
            System.out.println(s1);
            m1();

            System.out.println(s2);
            m2();
        }
    }

    public static void main(String[] args){

        //创建外部类对象
        OuterClass oc = new OuterClass();

        InnerClass inner = oc.new InnerClass();

        inner.m4();

    }

}

匿名内部类

一个没有名字的类就叫做匿名内部类

public class Test{

    //静态方法
    public static void m1(Animal a){
        a.eat();
    }

    //入口
    public static void main(String[] args){


        //使用匿名内部类的方式执行m1方法
        //整个这个"new Animal(){}"就是个匿名内部类
        m1(new Animal(){
            public void eat(){
                System.out.println("吃猫粮");
            }
        });

        //匿名内部类的优点:少定义一个类.
        //缺点:无法重复使用!
    }

}


//接口
interface Animal{


    void eat();

}

局部内部类

局部内部类在访问局部变量的时候,局部变量必须使用final修饰,在JDK8之后,这个限制被取消了

public class OuterClass{

    //方法
    public void m1(){

        //局部变量
        final int i = 10;

        //局部内部类
        //局部内部类不能用访问控制权限修饰符修饰。
        class InnerClass{

            //内部类不能有静态声明
            //public static void m1(){}

            //成员方法
            public void m2(){
                System.out.println(i); // 10
            }

        }

        //调用m2
        InnerClass inner = new InnerClass();
        inner.m2();

    }


    public static void main(String[] args){
        OuterClass oc = new OuterClass();
        oc.m1();

    }

}

猜你喜欢

转载自www.cnblogs.com/superfly123/p/10444193.html