为了账号安全,请及时绑定邮箱和手机立即绑定

java——内部类的那些事儿

标签:
Java
package innerClass;

public class InnerClassTester {

    public static void main(String[] args) {

        //1 创建内部类对象
        Outer.Inner obj1 = new Outer().new Inner(); 
        obj1.func();

        //2 内部类私有:外部类提供public方法访问内部类方法
        Outer obj2 = new Outer();
        obj2.providePublicFunc();

        //3 静态内部类
        //3.1 访问静态内部类的非静态方法
        Outer.StaInner obj3 = new Outer.StaInner();
        obj3.func();
        //3.2 访问静态内部类的静态方法(通过类名访问)
        Outer.StaInner.staFunc();

        //4 局部内部类访问局部变量
        Outer obj4 = new Outer();
        obj4.local();

        //5 匿名内部类
        Outer obj5 = new Outer();
        obj5.anonymous();

        //6 匿名内部类作为参数
        asPara(new AbstractClass() {
            public void func() {
                System.out.println("匿名内部类作为参数");
            }
        });

    }

    public static void asPara(AbstractClass ac) {
        ac.func();
    }

}

//抽象类:作为匿名内部类存在的前提(前提:存在一个类(具体类或者抽象类)或者接口)
abstract class AbstractClass{
    public abstract void func();
}

//外部类
class Outer{
    private String hello = "内部类可以访问外部类数据成员(包括私有成员)";

    //内部类------------------------------
    class Inner{
        public void func() {
            //内部类获取了外部类的引用Outer.this
            System.out.println(Outer.this.hello);
            System.out.println(hello);
        }
    }

    //内部类私有---------------------------
    private class PriInner{ 
        public void func() {
            System.out.println("内部类私有,外部类提供public方法访问");
        }
    }
    //外部类提供public方法访问
    public void providePublicFunc() {
        PriInner pi = new PriInner();
        pi.func();
    }

    //静态内部类--------------------------
    static class StaInner{
        //非静态方法
        public void func() {
            System.out.println("静态内部类的非静态方法");
        }
        //静态方法
        public static void staFunc() {
            System.out.println("静态内部类的静态方法");
        }
    }

    //局部内部类---------------------------
    //外部类中的成员方法local()
    public void local() {
        final String str = "局部内部类访问局部变量";
        class LocInner{
            public void func() {
                //访问的局部变量要用final修饰,但jdk1.8不用
                System.out.println(str);
            }
        }
        //局部内部类只能在方法中访问
        LocInner li = new LocInner();
        li.func();
    }

    /*匿名内部类(是一个内部类)  前提:存在一个类(具体类或者抽象类)或者接口
     *                        本质:继承了该类或者实现该接口的一个子类匿名对象
     * */
    //外部类中的成员方法anonymous()
    public void anonymous(){

        new AbstractClass() {
            public void func() {
                System.out.println("重写抽象类中func()抽象方法");
            }
        }.func();
        /*
        相当于一个继承了AbstractClass的子类的一个对象obj,然后,obj.func();

        思考1:若AbstractClass中还有一个抽象方法func1(),怎么调用?
        方法:
            AbstractClass ac = new AbstractClass() {
                public void func() {
                    System.out.println("重写抽象类中func()抽象方法");
                }
                public void func1(){
                    System.out.println("重写抽象类中func1()抽象方法");
                }
            }
            ac.func();
            ac.func();

        思考2:若匿名内部类中有自己定义的方法myFunc(),how?
        思路:向下强转?but子类的类名是什么?

        所以,匿名内部类针对一个方法比较好
         * */
    }
}

运行结果:
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消