内部类学习

内部类学习

一、内部类

1.1简介

在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。

广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

1.2目的

采用内部类这种技术,可以隐藏细节和内部结构,封装性更好,让程序的结构更加合理。

为什么在Java中需要内部类?总结一下主要有以下四点:

  1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变 得完整,(内部类的存在使得Java的多继承机制变得更加完善。)

  2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3.方便编写事件驱动程序

  4.方便编写线程代码

1.3种类

1.成员内部类

内部类像是外部类的一个成员,并且成员内部类可以访问外部类的所有成员变量和成员方法(包括private成员和静态成员)

当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

/**
 * @Author: 郜宇博
 * @Date: 2021/8/28 21:50
 */
public class InnerClass {
    private String outerName;
    public InnerClass(){
        outerName = "outerName";
    }
    /**
     * 成员内部类
     */
    public class InnerClassCreate{
        private String innerName;

        public InnerClassCreate() {
            innerName = "innerClass";
        }
        public void display(){
            System.out.println("InnerClass create");
            System.out.println(innerName);
            System.out.println(outerName);
        }
    }

    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass();
        //使用外部类的对象创建内部类
        InnerClass.InnerClassCreate innerClassCreate = innerClass.new InnerClassCreate();
        innerClassCreate.display();

    }
}

2.局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

/**
 * @Author: 郜宇博
 * @Date: 2021/8/28 21:50
 */
public class InnerClass {
    private String outerName;
    public InnerClass(){
        outerName = "outerName";
    }
    public void display(){
        class InnerClassCreate {
            private String innerName;

            public InnerClassCreate() {
                innerName = "innerName";
            }
            public void display(){
                System.out.println(innerName);
            }
        }
        InnerClassCreate innerClassCreate = new InnerClassCreate();
        innerClassCreate.display();
    }
    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass();
        innerClass.display();

    }
}

3.匿名内部类

匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。

实现接口时,可以在使用其他文件编写实现类,也可以在同一文件编写内部类,还可以使用匿名内部类

/**
 * MyInterfece接口
 */
public interface MyInterfece {
    public void test();
}

方法一:

public class MyImplementOne implements MyInterfece{
    @Override
    public void test() {
        System.out.println("在另外文件编写实现类--》实现接口");
    }

    public static void main(String[] args) {
        //方法一:使用外部文件编写实现类
        MyInterfece myImplementOne = new MyImplementOne();
        myImplementOne.test();
        
    }
}

方法二:

/**
 * MyInterfece接口
 *	内部类实现接口
 */
public interface MyInterfece {
    public void test();
    public class MyImplementTwo implements MyInterfece{
        @Override
        public void test() {
            System.out.println("采用内部类实现接口");
        }
    }

    public static void main(String[] args) {
        MyInterfece myImplementTwo = new MyImplementTwo();
        myImplementTwo.test();

    }
}

方法三:

/**
 *匿名内部类实现接口
*/
public static void main(String[] args) {
    //方法三:匿名内部类
    MyInterfece myImplementThird = new MyInterfece() {
        @Override
        public void test() {
            System.out.println("匿名内部类实现接口");
        }
    };
    myImplementThird.test();

}

4.静态内部类

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。

静态内部类是不需要依赖于外部类的(可以直接new),这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。

/**
 * @Author: 郜宇博
 * @Date: 2021/8/28 21:50
 */
public class InnerClass {
    private static String outerName;
    public InnerClass(){
        outerName = "outerName";
    }
    //静态内部类
    public static class StaticInnerClass{
        private String innerName;
        public StaticInnerClass(){
            innerName = "innerName";
        }
        public void display(){
            System.out.println(innerName);
            System.out.println(outerName);
        }

    }

    public static void main(String[] args) {
        InnerClass.StaticInnerClass staticInnerClass = new StaticInnerClass();
        staticInnerClass.display();

    }
}
//输出:innerName
//		null
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115177.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国外网页设计网站推荐_十大国外设计网站

    国外网页设计网站推荐_十大国外设计网站  国内的大学网站都设计得千篇一律,古老的表格式框架布局,直来直去的排版,还有悲剧的是好多大学的网址只能在IE中浏览,其它浏览器里就错乱了。今天这篇文章和大家分享20个国外大学网站设计欣赏,其实大学网站一样可以设计得很艺术,很精美。BiolaUndergradBatesCollegeMiddleburyCollegeWarnerPacificColleg…

    2025年5月26日
    2
  • MBUS协议_ofdm调制原理框图

    MBUS协议_ofdm调制原理框图4.4slave设计传输特性:slaves被设计为具有两种不同恒定sink电流,因此在总线上电压有1V的变化的时候,sink电流的变化一定不能超过0.2%。为了传输一个Mark,一个单位负载被指定,一个单位负载由最大为1.5mA的恒定电流组成。如果slave需要更多的电流,就必须增加适当数量的单位负载。当发送一个space的时候,slave需要多增加11~20mA的电流消耗。Slave在接收…

    2022年10月15日
    3
  • linux修改用户名命令6,linux用命令改用户名

    linux修改用户名命令6,linux用命令改用户名怎样更改linux的用户名Linux中可以使用usermod命令更改用户名,具体的操作方法如下:首先打开linux的终端,输入指令修改用户名,简单的用户名修改是usermod加参数l,后面跟新用户名,最后是旧用户名。此时用cd命令来到home目录,会发现存在一点小问题。linux下命令怎么修改用户名先用终端进入到根目录下的root文件夹然后su权限不用我说了吧然后用下面这个命令:usermo…

    2022年9月17日
    3
  • golan激活码【在线破解激活】

    golan激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    46
  • SpringBoot和Spring到底有没有本质的不同?

    SpringBoot和Spring到底有没有本质的不同?现在的Spring相关开发都是基于SpringBoot的。最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图:使用java-jar命令就可以运行这个独…

    2022年5月10日
    32
  • matlab画折线图

    matlab画折线图p=‘plot_scale.xlsx’;a=xlsread§;x=a(1,:);%x轴上的数据,第一个值代表数据开始,第二个值代表间隔,第三个值代表终止susan=a(2,:);%a数据y值HarrisLaplace=a(3,:);MSCP=a(4,:);CPDA=a(5,:);HeYung=a(6,:);FastCPDA=a(7,:);DOG=a(8,:);GCM=a(9,:);ANDD=a(10,:);MSRJ=a(11,:);ZhangSun=a(12,:);WEAE=a(

    2022年6月12日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号