風行草偃

陪伴,是最长情的告白。

Java 内部类

Saoirse:

店铺:https://shop58616120.taobao.com


一、内部类 Nested Class 嵌套类


静态内部类静态内部类可以包含静态成员、非静态成员;



  • 静态内部类可以包含静态成员、非静态成员;


  • 静态内部类可以直接调用外部类的静态属性、静态方法。但不能调用外部类的普通属性、普通方法;


  • 在不相关类中,可以直接创建静态内部类的对象,不需要通过外部类;


  • 静态内部类与外部类联系很少,仅有命名空间上的联系。



非静态内部类



  • 普通内部类/成员内部类:在一个类(外部类)中直接定义的内部类


  • 匿名内部类


  • 方法内部类:在一个方法(外部类方法)或者代码块中定义的内部类



注释1:内部类仍然是一个独立的类,在编译之后内部类会编译成独立的class文件,但是前面冠以外部类的名与$符号。


注释2:内部类可以使用public、protected、default、private修饰符。


注释3:成员内部类不能有静态的成员变量或方法。


代码清单1


public class JLang {
    // 静态内部类
    static class StaticNestedClass {
        }

    // 普通内部类
    private class InnnerClass {
        }

    public void func() {
        // 方法内部类
        class FuncNestedClass{
                }

        // 匿名内部类
        Runnable runnable = new Runnable() {
            public void run() {
                        }
                };

        };

    // 匿名内部类
    Runnable run2 = new Runnable() {
        public void run() {
                }
        };
}


二、方法内部类 final修饰


与方法内部声明的变量类似,不能用修饰符;


只在定义的方法内部可见;


方法内部类里只能定义非静态的成员或方法;


方法内部类中不能引用所在方法变量,除非是final;


注释4:方法的生命周期与方法内部类的生命周期不一致。方法执行完,内部类对象可能仍然存在。


三、匿名内部类


继承式


public class JLang {

    public static void main(String[] args) {
                    Car car = new Car(){
            @Override
            public void run(){
                                System.out.println("子类的方法");
                        };
                };   
        }
}

class Car{
    public void run(){
                System.out.println("父类的方法");
        }


接口式


    Runnable runnable = new Runnable() {
        public void run() {
            }
    };


参数式


public class JLang {

    public void test(Car car){
        }

    public static void main(String[] args) {
                JLang obj = new JLang();
                obj.test(new Car(){
                @Override
                public void run(){
                               System.out.println("参数式匿名内部类");
                           }
                });
        }
}

class Car{
    public void run(){
            System.out.println("父类的方法");
        }
}

评论
热度 ( 2 )
  1. 風行草偃Saoirse 转载了此文字

© 風行草偃 | Powered by LOFTER