java 内部类

发布于:2022-10-29 ⋅ 阅读:(300) ⋅ 点赞:(0)

小镇做题家

前段时间很火的一个话题“小镇做题家”,我没有具体了解,我以为是在鼓励一些努力拼搏的人。

某一天,禁不住好奇,我打开了百度百科,看了看小镇做题家的解释

在这里插入图片描述

就是指一些村里或者小镇的人,通过学习,高考,突破自我,进入一流高校,但是由于生长环境不同,在视野和社会资源上略显不足的。

这个词儿其实也没有什么特殊的,我也经常自嘲到:我村里出来的,不懂这些,但我尽可能去学习,弥补不足。

但为什么“小镇做题家”就突然火了呢?

起因是《中国新闻周刊》公众号,一个很权威的新闻周刊公众号,发布了一篇文章,文章里有一些话:

考编的普通人大有人在,这些小镇做题家每天上班培训,做真题卷,也仍然考不中那个能为他们带来安全感的编制内职务。所以当看见能从市场上赚大钱的明星,还要分走几个编制内身份时,总觉得抢了自己的坑。但是这是一种幻觉,似乎认为自己的低收入,是因为明星从既定的盘子里抢走了自己的那一份。

这句话仔细分析也就仅仅是抱怨一下那些在网络上抨击易烊千玺等考编的网友。也没什么大错,他错就错在

第一:用了“小镇做题家”这个词儿,小镇做题家,本是一个中意词,顶多带点儿自嘲。但是自嘲与被嘲笑性质可不一样。

第二:他说这些小镇做题家,他把所有人都包含了进去。

第三:他根本没懂什么是小镇做题家,小镇做题家描述很清楚:高考进入一流高校,他没有去调研,进入一流高校的人,有多少人会有空闲时间在网络上发表评论。

第四:这是一个权威的平台,却似一个怨妇一样,在这里进行抱怨。实则不该

当然了,人家文章说的是小镇做题家 ,我顶多算是小镇错题家 ,普通二本毕业的人,已经配不上《中国新闻周刊》来讽刺了。

我个人理解,那些明星,诸如易烊千玺等,不管是通过人脉还是通过本事,去考编,没有什么问题,非常的正常。我要有那么多人脉,我肯定已经躺平了,谁还在这跪着赚钱。

当然了,作为没有人脉的我们,只能通过所谓的“真题卷”,来提升自己在社会的价值。

作为程序员,我们的“真题卷”,就是新知识,新认知,不断地学习知识,不断地提升认知。

下边我们就来做一个真题:内部类

一、什么是内部类

内部类就是在类里边再定义另一个类。

内部类可以让Java支持多重继承(甚至有的面试官,拿这个来面试,问你,Java只支持单继承吗?我想多继承怎么办,甚是无聊…)

二、常见内部类?

2.1 静态内部类

静态内部类就是用static修饰的内部类。

静态内部类不需要依赖外部类,不能使用外部类的非static成员或者方法。

静态内部类能声明静态成员和非静态成员。

我们最熟悉的就是单例模式的一种实现方式了:

/**
 * @author 木子的昼夜编程
 */
public class SingleCase {
    public static void main(String[] args) {
        System.out.println(SingleCase.getInstance());
    }

    private SingleCase(){}

    // 静态内部类
    private static class SingleTolHoler{
        private static SingleCase INSTANCE = new SingleCase();
    }

    // 使用
    public static SingleCase getInstance(){
        return SingleTolHoler.INSTANCE;
    }
}

2.2 成员内部类

在类的内部方法的外部编写的类就是成员内部类(非static修饰)

成员内部类可以无条件访问外部类的所有成员属性和方法(包括private和static成员)。

同名属性和方法访问外部类的方式:外部类.this.成员名

成员内部类不允许定义static的成员和方法。

演示走起:

package test;

/**
 * @author 木子的昼夜编程
 */
public class InnserClassTest {
    public static void main(String[] args) {
        // 外部类初始化
        InnserClassTest outer = new InnserClassTest();
        outer.age = 18;
        outer.name = "诸葛十三";
        InnserClassTest.salary = 100;
        // 内部类初始化 这个写法很不一样
        Inner inner = outer.new Inner();
        inner.age = 13;
        inner.name = "欧阳小明";
        inner.show();
    }
    // 外部类属性
    String name;
    private int age;
    static float salary;
    String other;
    // 外部类方法
    private void showAge(){
        System.out.println("外部类:"+age);
    }
    public void showName(){
        System.out.println("外部类:"+name);
    }
    static void showSalary(){
        System.out.println("外部类:"+salary);
    }
    public void showOtherInfo(){
        System.out.println("外部类:"+other);
    }

    // 内部类
    public class Inner{
        // 内部类属性
        String name;
        private int age;
        //static float salary; 会报错
        // 内部类方法
        private void showAge(){
            System.out.println("内部类:"+age);
        }
        public void showName(){
            System.out.println("内部类:"+name);
        }
        // 非同名属性
        public void showOther(){
            System.out.println("内部类使用外部类成员:"+other);
        }
        // 会报错
        /*static void showSalary(){
            System.out.println(salary);
        }*/
        public void  show(){
            // 调用内部类自己方法
            showAge();
            showName();
            showOther();
            // 调用外部类普通方法(同名)
            InnserClassTest.this.showAge();
            InnserClassTest.this.showName();
            // 调用外部类普通方法(非同名)
            showOtherInfo();
            // 调用外部类静态方法
            InnserClassTest.showSalary();
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X085BzJs-1667052158878)(18.内部类-旧版.assets/image-20220827110130110.png)]

2.3 局部内部类

编写在方法内的类称之为局部内部类

局部内部类定义在一个方法或者作用域里边,他的被访问权限仅仅限于方法或作用域。

局部内部类不能使用权限修饰符、静态修饰符进行修饰。

局部内部类可以直接访问方法或作用域内属性。

局部内部类可以直接访问外部类中属性和方法。

局部内部类创建对象需要在方法内部,局部内部类外部声明。

演示走起:

package test;

/**
 * @author 木子的昼夜编程
 */
public class InnerClassTest02 {
    public static void main(String[] args) {
        new InnerClassTest02().hello();
    }
    // 外部类属性
    String name ="诸葛十三";
    private int age = 13;
    static float salary = 4000000;
    String other = "其他属性";
    // 外部类方法
    private void showAge(){
        System.out.println("外部类:"+age);
    }
    public void showName(){
        System.out.println("外部类:"+name);
    }
    static void showSalary(){
        System.out.println("外部类:"+salary);
    }
    public void showOtherInfo(){
        System.out.println("外部类:"+other);
    }

    public void hello(){
        String name = "欧阳小明"; // jdk1.8后会自动添加finaly
        int age = 13;
        class Inner{
            String name = "轱辘娜扎";
            public void showInfo(){
                String name ="内部类方法变量";
                // 使用外部类属性
                System.out.println("外部类属性同名name:"+InnerClassTest02.this.name);
                System.out.println("外部类属性同名age:"+InnerClassTest02.this.age);
                System.out.println("外部类属性static修饰salary:"+InnerClassTest02.salary);
                System.out.println("外部类属性,非同名other:"+other);
                // 使用作用域(方法变量)
                System.out.println("方法变量:"+age);
                // 使用类自己属性
                System.out.println("内部类自己属性:"+this.name);
                // 内部类方法变量
                System.out.println("内部类方法变量:"+name);
                // 调用外部类方法
                showName();
                showAge();
                showOtherInfo();
                showSalary();
            }
        }
        // 只能在方法内使用局部内部类  而且是在类定义后边
        Inner inner = new Inner();
        inner.showInfo();
    }
}

我们发现欧阳小明没法访问了,我们这里描述的情况是很特殊的,真正写代码的时候,是不会允许这么多重名的。

所以不用担心~~~

2.4 匿名内部类

匿名内部类顾名思义,就是一个没有名字的内部类。

我们在学习Java之初就用到过,创建线程,在直接使用Runnable的时候,我们做接口实现

package test;

/**
 * @author 木子的昼夜编程
 */
public class InnserClassTest03 {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("run");
            }
        }).start();
    }
}

我们自定义一个类似的例子:

package test;

/**
 * @author 木子的昼夜编程
 */
public class InnserClassTest03 {
    public static void main(String[] args) {
        // 方法参数直接new 接口
        InnserClassTest03.showMsg(new Person() {
            @Override
            public String showMsg() {
                return "匿名内部类";
            }
        });
        // 可以这样写
        InnserClassTest03.showMsg(() -> {
            return "匿名内部类";
        });
        // 这样写
        InnserClassTest03.showMsg(() -> "匿名内部类");
        // 也可以直接创建对象
        Person p = new Person() {
            @Override
            public String showMsg() {
                return "匿名内部类";
            }
        };
        System.out.println(p.showMsg());
    }
    //
    public static void showMsg(Person p) {
        System.out.println(p.showMsg());
    }
}

interface Person{
    public abstract String showMsg();
}

亲爱的《中国新闻周刊》村里出来的人,没有你们想象的那么的脆弱,那么的埋怨世界,他们或许有些自卑,或许有些不甘,或许有些抱怨,但他们都在努力的生活着,努力的为这个社会做着一点点贡献,请不要磨灭这群人的热情。

不明白你为什么删除了这一文章之后,又发布了一条“攻击型人格”。

看到一个网友说的话,禁不住笑了:

网友:我发现某些明星考编违规!

某媒体:别眼红人家,你这小镇做题家思维。

网友:我有证据!

某媒体:有这功夫你还不如好好反省自己,你的性格是攻击型人格,你知道吗?

网友:对对对,你说什么都对。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到