Java中内部类的概念与分类详解

 更新时间:2021年09月20日 10:34:10   作者:一朵花花  
一个类的定义放在另一个类的内部,这个类就叫做内部类,下面这篇文章主要给大家介绍了关于Java中内部类的概念与分类的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

只能使用修饰限定符:public 和 默认 来修饰类

内部类概念

在 Java 中,将一个类定义在另一个类的内部,称为内部类

就是在一个类内部进行其他类结构的嵌套操作

内部类也是封装的一种体现

举例:

//外部类
public class OutClass {

    //内部类
    class InnerClass{
        
    }
}

注意:内部类和外部类共享一个 java源文件,但是经过编译之后,会形成各自单独的字节码文件

在这里插入图片描述

内部类的分类:

成员内部类

在外部类中,内部类定义位置与外部类成员所处的位置相同,因此称为成员内部类

成员内部类有:普通内部类和静态内部类

普通内部类

未被 static 修饰的成员内部类

//外部类
public class OutClass {
    public void method(){

    }
    //普通内部类
    class InnerClass1{

    }
}

如何使用普通内部类??

先看普通类的使用:

package Date20210917;

public class Test1 {
    int a;
    public void method1(){

    }
    //普通内部类
    class InnerClass{
        int b;
        void method2() {

        }
    }
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        test1.method1();
}

普通类:先构造对象—通过对象访问类内部的成员

那么,我们可以试着 new 一个 InnerClass 的对象:

在这里插入图片描述

我们发现并不可行,因为 InnerClass 也是 外部类的成员,所以我们在使用内部类时,需借助外部类的对象来创建内部类的对象

则正确操作:

public static void main(String[] args) {
    //普通类:先构造对象—通过对象访问类 内部的成员
    Test1 test1 = new Test1();
    test1.method1();

    //普通内部类
    InnerClass innerClass = test1.new InnerClass();
    innerClass.method2();
}

不同文件下 普通内部类的使用:

package Date20210917;

//外部类
public class OutClass {
    //测试Test1 中的内部类的使用:
    void test(){
        Test1 test1 = new Test1();
        //要实例化 Test1 中内部类的对象
        //InnerClass;   编译器不能识别,因为该类没在此文件中
        Test1.InnerClass t = test1.new InnerClass();
    }
    public static void main(String[] args) {

    }
}

当内外部类出现同名变量时,使用就近原则~ 即:优先访问内部类的

public class Test1 {
    int a;
    int b;
    public void method1(){

    }
    //普通内部类
    class InnerClass{
        int b;
        void method2() {
            a = 10;
            method1();
            b = 66; //给内部类自己的 成员变量 b 赋值
        }
    }
}

内部类中给同名外部类成员变量赋值:

Test1.this.b = 88;

调试验证:

在这里插入图片描述

即:编译后,对 method2 进行以下修改

修改前:

void method2() {
    a = 10;
    method1();
    b = 66; //给内部类自己的 成员变量 b 赋值
    Test1.this.b = 88;
}

修改后:

void method2(InnerClass this){
	this$0.a = 10;
	method1(this$0);
	this.b = 66;
	Test1.this.b = 88;
}

总结:

  1. 普通内部类对象必须在先有外部类对象前提下才能创建
  2. 外部类中,不能直接访问内部类中的成员,如果要访问必须先要创建内部类的对象
  3. 外部类中的任何成员都可以被在普通内部类方法中直接访问
  4. 在内部类方法中访问同名的成员时,优先访问自己的(就近原则),如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问

静态内部类

被 static 修饰的内部成员类称为静态内部类

public class Test2 {
    int a;
    int b;
    static int c;
    static void method1(){
        System.out.println("我是method()");
    }
    static class InnerClass{
        int d;
        static int e;
        void method2(){

        }
    }
}

静态内部类对象的创建

1.同文件中创建:

//静态成员变量的访问
System.out.println(Test2.c);

//不需要借助外部类对象来创建
InnerClass innerClass = new InnerClass();

2.不同文件里 创建:

void test2(){
    //静态成员变量的访问:
    System.out.println(Test2.c);

    //静态内部类对象 (类比静态成员变量的访问)
    Test2.InnerClass t = new Test2.InnerClass();
    //静态内部类对象可以直接创建,不需要依赖外部类对象

}

静态内部类方法里能否访问外部类的对象?

在这里插入图片描述

由上图可得到:在静态内部类中,只能访问外部类中的静态成员变量和静态成员方法

注意事项:

  • 在内部类中只能访问外部类中的静态成员
  • 在同一文件中创建内部类对象时,可以直接创建,不需要借助外部类对象
  • 在不同文件中创建内部类对象时,也可直接创建:所在文件名称.内部类名称.对象名
  • 成员内部类,经过编译之后会生成独立的字节码文件,命名格式为:外部类名称$内部类名称

在这里插入图片描述

局部内部类

定义在外部类的方法体或者 { } 中,该种内部类只能在其定义的位置使用,一般很少使用

//外部类
public class OutClass {

    public void method(){
        //局部内部类
        class InnerClass3{

        }
    }
	{   //局部内部类
		class InnerClass4{

		}
    }
}

不能被访问修饰限定符修饰:

在这里插入图片描述

不能再局部内部类中定义静态成员

在这里插入图片描述

不能再局部内部类中定义静态方法

在这里插入图片描述

注意事项:

局部内部类只能在所定义的方法体内部使用不能被public、static等修饰符修饰编译器也有自己独立的字节码文件,命名格式:外部类名字$x内部类名字.class,x是一个整数 匿名内部类(这里不做讲解)

总结

到此这篇关于Java中内部类的概念与分类的文章就介绍到这了,更多相关Java内部类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaMail邮件简介及API概述第一篇

    JavaMail邮件简介及API概述第一篇

    这篇文章主要为大家详细介绍了JavaMail邮件简介及API概述第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Java基础第三篇 构造器与方法重载

    Java基础第三篇 构造器与方法重载

    显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。下面文字将对该内容做详细介绍,需要的小伙伴请参考
    2021-09-09
  • Java中的Set集合简单汇总解析

    Java中的Set集合简单汇总解析

    这篇文章主要介绍了Java中的Set集合简单汇总解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 基于SpringBoot2.0版本与老版本的区别

    基于SpringBoot2.0版本与老版本的区别

    这篇文章主要介绍了SpringBoot2.0版本与老版本的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java中在时间戳计算的过程中遇到的数据溢出问题解决

    Java中在时间戳计算的过程中遇到的数据溢出问题解决

    这篇文章主要介绍了Java中在时间戳计算的过程中遇到的数据溢出问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Spring Boot发送邮件详解

    Spring Boot发送邮件详解

    这篇文章主要为大家详细介绍了Spring Boot发送邮件的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • mybatis动态sql之新增与更新方式

    mybatis动态sql之新增与更新方式

    这篇文章主要介绍了mybatis动态sql之新增与更新方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring Boot项目搭建的两种方式

    Spring Boot项目搭建的两种方式

    springboot简单快捷方便的优点深受用户喜爱,springboot开发环境搭建过程是每个开发者必须要做的工作,今天小编写的一篇教程关于Spring Boot项目搭建方法,通过两种方式给大家介绍的非常详细,需要的朋友参考下吧
    2021-06-06
  • SpringAop @Around执行两次的原因及解决

    SpringAop @Around执行两次的原因及解决

    这篇文章主要介绍了SpringAop @Around执行两次的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java组件commons-fileupload文件上传示例

    java组件commons-fileupload文件上传示例

    这篇文章主要为大家详细介绍了java组件commons-fileupload实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10

最新评论