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

网友投稿 273 2022-12-07

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() {jIRpH

}

}

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();

jIRpH}

public static void main(String[] args) {

}

}

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

public class Test1 {

int a;

int b;

public void methhttp://od1(){

}

//普通内部类

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;

}

总结:

普通内部类对象必须在先有外部类对象前提下才能创建

外部类中,不能直接访问内部类中的成员,如果要访问必须先要创建内部类的对象

外部类中的任何成员都可以被在普通内部类方法中直接访问

在内部类方法中访问同名的成员时,优先访问自己的(就近原则),如果要访问外部类同名的成员,必须:外部类名称.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.InnerClasjIRpHs();

//静态内部类对象可以直接创建,不需要依赖外部类对象

}

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

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

注意事项:

在内部类中只能访问外部类中的静态成员

在同一文件中创建内部类对象时,可以直接创建,不需要借助外部类对象

在不同文件中创建内部类对象时,也可直接创建:所在文件名称.内部类名称.对象名

成员内部类,经过编译之后会生成独立的字节码文件,命名格式为:外部类名称$内部类名称

局部内部类

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

//外部类

public class OutClass {

public void method(){

//局部内部类

class InnerClass3{

}

}

{ //局部内部类

class InnerClass4{

}

}

}

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

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

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

注意事项:

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

总结

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot整合Swagger2的完整过程记录
下一篇:全面探究 Java 内部类
相关文章

 发表评论

暂时没有评论,来抢沙发吧~