内部类学习

内部类学习

一、内部类

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)
上一篇 2021年11月12日 下午2:00
下一篇 2021年11月12日 下午2:00


相关推荐

  • VB学习之路 ——基本语句

    VB学习之路 ——基本语句一:选择结构问题总结1.一个很简单的If(表达式)……..Then的问题,在VB的程序编写时候,如果在if….Then后面只有一条需要执行的语句,并且将执行的一条语句直接放在了Then的后面,则不需要后面加上EndIf,加上就报错。即使要执行的语句有多条如果非要放在Then后面不加EndIf就必须每条语句之间用冒号间隔。如果将执行的语句放在了Then的后面,即…

    2022年6月21日
    32
  • spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护「建议收藏」

    在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖。但是如果有一些服务出现问题了会怎么样?比如说有三个服务(ABC),A调用B,B调用C。由于网络延迟或C

    2022年2月16日
    46
  • Android 极简反射教程及应用示例

    Android 极简反射教程及应用示例

    2021年9月16日
    53
  • c++string截取字符串

    c++string截取字符串C++的string类提供了大量的字符串操作函数,提取字符串的一部分,可采用substr函数实现:头文件:#include<string>//注意没有.hstring.h是C的标准字符串函数数,c++中一般起名为ctring.而string头文件是C++的字符串头文件。函数原型:stringsubstr(intpos=0,intn)const;函数说明:参数1:pos是必填参数参数2:n是可参数,表示取多少个字符,不填表示截取到末尾该函数功能为:返回从

    2022年5月12日
    53
  • WinRAR怎么去广告

    WinRAR怎么去广告每次使用WinRAR都弹出一个广告,实在是烦人,遂破之。我使用的版本是:5.60(64位)目前最新版本是5.61第一种方法(本人亲测不可用):既然不可用,为什么还要说呢,可能是之前的老版本可用,现在的新版本就算注册了也会弹广告,如果你用的是老版本,不妨试一下这个方法,毕竟此方法最简单新建一个文本名字为rarreg.key,内容如下:RARregistrationdataFede…

    2022年6月7日
    26
  • 计算机视觉中的曲率尺度空间技术[通俗易懂]

    计算机视觉中的曲率尺度空间技术[通俗易懂]看到一篇文章《计算机视觉中的曲率尺度空间技术:基本概念与理论进展》——钟宝江,对于尺度空间的理解很有帮助,遂贴部分内容在此,如果涉及侵权,请告知,我会马上删除。1引言尺度是计算机视觉与图象处理领域的一个重要概念。国际上有关尺度空间技术的研究大致分为如下两个分支:线性尺度空间技术

    2022年10月14日
    4

发表回复

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

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