java 内部类

内部类分类

静态内部类
1、静态内部类可以包含静态成员,非静态成员
2、静态内部类可以直接调用外部类的静态属性,静态方法。但不能调用外部类的普通属性,普通方法
3、在不相关的类中,可以直接创建静态内部类的对象

/**
 * 静态内部类
 * @author L J
 */
public class StaticClassTest {
    public static void main(String[] args) {
        //Outer.InnerClass oic = new Outer.InnerClass();
        //在不相关的类中,可以直接创建静态内部类的对象
        InnerClass inner = new InnerClass();
    }
}

class Outer {
    //静态内部类可以包含静态成员,非静态成员
    int a = 5;
    static int b = 10;

    InnerClass inner = new InnerClass();

    //静态内部类
    static class InnerClass {
        int c = 15;
        static int d = 20;

        //静态内部类可以直接调用外部类的静态属性,静态方法
        public void test() {
            System.out.println(d);
        }
    }
}

非静态内部类
1、普通内部类(也称成员内部类)

  • 成员内部类就像一个成员变量一样存在于外部类中
  • 成员内部类可以访问外部类的所有成员(包含:private的)
  • 成员内部类的this指向内部类对象本身。要拿到外部类对象可以使用:外部类名+.this
  • 成员内部类不能有静态成员,除非声明为final的常量
/**
 * 普通内部类
 * @author L J
 */
public class PlainInnerClassTest {
    public static void main(String[] args) {
        Outer02.InnerClass02 oic = new Outer02().new InnerClass02();
        oic.test();
    }
}

class Outer02 {
    private int a = 3;
    int b = 5;
    InnerClass02 inner = new InnerClass02();

    //成员内部类
    class InnerClass02 {

        final static int x = 6;

        void test() {
            System.out.println(a);
            System.out.println("内部类对象:" + this);
            System.out.println("外部类对象:" + Outer02.this);
        }
    }
}

2、匿名内部类

  • 继承式
  • 接口式
  • 参数式
/**
 * 匿名内部类
 * @author L J
 */
public class EncryptInnerClassTest {
    public static void main(String[] args) {
        Outer04 out = new Outer04();
        out.test();
    }
}

class Outer04 {
    public void test() {
        //1、接口式匿名内部类,同时也是方法内部类
        Runnable runnable = new Runnable() {
            @Override
            public void run() {

            }
        };

        //2、继承式匿名内部类
        Car car = new Car() {
            @Override
            public void run() {
                System.out.println("快上车");
            }
        };
        car.run();

        //3、参数式匿名内部类
        test02(new Car() {
            @Override
            public void run() {
                System.out.println("参数式匿名内部类");
            }
        });
    }

    public void test02(Car c) {
        c.run();
    }
}

//汽车类
class Car {
    public void run() {
        System.out.println("老司机开车");
    }
}

3、方法内部类(在一个外部类的方法或代码块中定义的内部类)

  • 方法内部类的地位和方法内的局部变量的位置类似,所以不能用private、public、protected、static、transient等修饰
  • 方法内部类只能是在声明的方法中可见
  • 方法内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为final。因为局部变量和方法内部类生命周期不一致
  • 方法内部类只能包含非静态成员
/**
 * 方法内部类(局部内部类)
 * @author L J
 */
public class Outer03 {
    public void test() {
        int a = 1;

        //不能用private、public、protected、static、transient等修饰
        class Inner {
            //方法内部类只能包含非静态成员
            int b = 10;
            void test() {
                //方法内部类不能访问定义它的方法内的局部变量
                //System.out.println(a);
            }
        }

        //方法内部类只能是在声明的方法中可见
        Inner i = new Inner();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值