Java内部类

前言

内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。

普通内部类

/**
 * Function:普通内部类测试
 *
 * @author 一毛钱的魅力
 * created on 2021/11/14
 **/
public class OuterClazz {
    public int outField_1=1;
    protected int outField_2=2;
    int outField_3=3;
    private int outField_4=4;

    public class CommonInnerClazz{
        public int innerField_1=11;
        protected int innerField_2=22;
        int innerField_3=33;
        private int innerField_4=44;

        void printOuterAndInnerFields(){
            //内部类对象依赖外部类的实例对象,内部类可以访问外部类对象中的所有权限字段。
            System.out.println(String.format("访问外部类对象全部权限字段:%s;%s;%s;%s",outField_1,outField_2,outField_3,outField_4));
            System.out.println(String.format("内部类对象字段:%s;%s;%s;%s",innerField_1,innerField_2,innerField_3,innerField_4));
        }
    }
     public static void main(String[] args) {
        CommonInnerClazz commonInnerClazz = new OuterClazz().new CommonInnerClazz();
        commonInnerClazz.printOuterAndInnerFields();
        System.out.println(commonInnerClazz.innerField_4);
    }

执行结果
在这里插入图片描述

结论:普通内部类对象可以访问外部类对象中所有访问权限字段,同时,外部类对象也可以通过内部类的对象引用访问内部类中定义的所有访问权限字段。
注意:普通内部类中不可以定义静态属性

静态内部类

在这里插入图片描述

结论:静态内部类就像外部类的一个静态成员一样,创建其对象无需依赖外部类对象。同时,静态内部类非静态方法也无法访问外部的非静态成员,外部类依然可以利用静态对象访问静态内部类对象的所有访问权限的成员。
注意:静态内部类可以定义静态成员变量。

匿名内部类

匿名内部类有多种形式,其中最常见的一种形式莫过于在方法参数中新建一个接口对象/类对象,并实现这个接口申明/类中原有的方法。

/**
 * Function:功能描述
 *
 * @author 一毛钱的魅力
 * created on 2021/11/14
 **/
public class AnonymousInnerClazzTest {
    public int outField_1=1;
    protected int outField_2=2;
    int outField_3=3;
    private int outField_4=4;

    interface IPrinter{
        void print(Object obj);
    }

    void test(){
        IPrinter iPrinter = new IPrinter() {
            int a=11;
            @Override
            public void print(Object obj) {
                System.out.println(obj);
                System.out.println("匿名内部类成员属性:"+a);
                System.out.println("外部类对象成员属性:"+outField_4);
            }

        };

        iPrinter.print(new Object(){
            @Override
            public String toString() {
                return super.toString();
            }
        });
    }

    public static void main(String[] args) {
        new AnonymousInnerClazzTest().test();
    }
}

在这里插入图片描述
结论:在匿名内部类中可以使用外部类的属性,但外部类却不能使用匿名内部类中定义的属性。

局部内部类

/**
 * Function:功能描述
 *
 * @author 一毛钱的魅力
 * created on 2021/11/14
 **/
public class LocalInnerClazzTest {
    public int outField_1=1;
    protected int outField_2=2;
    int outField_3=3;
    private int outField_4=4;

    void test(){
         class LocalInnerClazz{
            private int field=11;

            void print(){
                System.out.println(outField_4);
            }
        }
        new LocalInnerClazz().print();
    }

    public static void main(String[] args) {
        new LocalInnerClazzTest().test();
    }
}

在这里插入图片描述
结论:局部内部类里可以访问外部类对象所有权限的字段,而外部类却不能访问局部内部类中定义的字段,因为局部内部类的定义只在其特定的方法体/代码块中有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值