Java内部类

1.内部类访问规则:

  (1)成员内部类中不可以有静态属性;静态内部类可以有;

  (2)内部类可以直接访问外部类中的成员,包括私有;

  (3)外部类访问内部类,必须实例化内部类;

public class Test01 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        System.out.println(inner.s3);
        System.out.println(inner.s4);
    }
}
class Outer{
    String s1 = "s1";
    private String s2 = "s2";
    class Inner{
        String s3 = "s1";
        String s4 = s2;
    }
}

2.静态内部类:

  (1)静态内部类只能访问外部静态成员;

  (2)可以直接用"外部类名.内部类名.静态成员"调用静态成员;

  (3)可以不依赖外部类实例创建对象;

 

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        System.out.println(Outer.Inner.s3);
        Outer.Inner inner = new Outer.Inner();
        System.out.println(inner.s4);
    }
}
class Outer{
    static String s1 = "s1";
    private static String s2 = "s2";
    static class Inner{
        static String s3 = "s1";
        String s4 = s2;
    }
}

3.局部内部类:

   1.不可以被成员修饰符修饰;

   2.可以直接访问外部类中的成员;

   3.不可访问它所在的局部中的变量,只能访问被final修饰的局部变量;//jdk1.8之后不用finnal修饰也可以

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.test01();
    }
}
class Outer{
    String s1 = "s1...";
    private String s2 = "s2...";
    public void test01(){
        String s3 = "s3...";
        final String s4 = "s4...";
        class Inner{
            public void test02(){
                String s11 = s1;
                String S12 = s2;
                String S13 = s3;
                String S14 = s4;

                System.out.println(s1);
                System.out.println(s2);
                System.out.println(s3);
                System.out.println(s4);
            }
        }
        Inner inner = new Inner();
        inner.test02();
    }
}

4.匿名内部类:

  1.匿名内部类前提:必须继承一个类或者实现接口;两者取其一;

  2.匿名内部类格式: new 父类或者接口() {子类内容}

  3.匿名注意点:

    (1)不能有构造方法;

    (2)不能有静态成员;

    (3)所有抽象方法都要实现;

1)匿名内部类理解:

 

//接口
interface Demo{
    public abstract void sayHi();
}
//外部类
class Outer{
    class Inner implements Demo{
        @Override
        public void sayHi() {
            System.out.println("hi");
        }
    }
    void run(){
        new Inner().sayHi();
    }
}
//测试
public class Test {
    public static void main(String[] args) {
        new Outer().run();
    }
}

 

2)匿名内部类:

//接口
interface Demo{
    public abstract void sayHi();
}
//外部类
class Outer{
    void run(){
        new Demo(){
            @Override
            public void sayHi() {
                System.out.println("hi");
            }
        };
    }
}
//测试
public class Test {
    public static void main(String[] args) {
        new Outer().run();
    }
}

 

posted @ 2019-07-23 10:40  开拖拉机的拉风少年  阅读(113)  评论(0编辑  收藏  举报