Java内部类,看这一篇就够了!

Java内部类,看这一篇就够了!在 Java 中 我们通常将不同的类组织到一个包下 对于一个包中的类来说 它们是同一个层次 可以说在没有使用继承等条件下 类与类之间是没有联系的

大家好,欢迎来到IT知识分享网。

闻道梅花坼晓风

雪堆遍满四山中

Java内部类,看这一篇就够了!


目录

 内部类的概念

成员内部类

内部类访问外部类

外部类访问内部类

内部类中同名变量的优先级

小结:

静态内部类

内部类访问外部类

 小结:

局部内部类

小结:

匿名内部类

Java内部类,看这一篇就够了!

 

 内部类的概念

Java 中,我们通常将不同的类组织到一个包下,对于一个包中的类来说,它们是同一个层次,可以说在没有使用继承等条件下,类与类之间是没有联系的。还有一种类,它是定义在另一个类或者一个方法的内部,这样的类叫做内部类。内部类也是封装的一种体现 ~ 

//A是外部类 class A{ //B是内部类 class B{ } }

Java内部类,看这一篇就够了!

注意: 

内部类和外部类共用同一个 java 源文件,但是经过编译之后,内部类会形成单独的字节码文件

一般来说,内部类分为成员内部类、局部内部类、匿名内部类和静态内部类

成员内部类

成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:

//外部类 class A{ public int a = 10; private int b = 20; static int c = 30; //内部类 class B{ public int d = 10; } }

看起来 内部类 B 就好像 A 的一个成员,成员内部类可以无限制访问外部类的所有成员属性

 

内部类访问外部类

//外部类 class A{ public int a = 10; private int b = 20; static int c = 30; public void PrintA(){ System.out.println("PrintA()"); } //内部类 class B{ public int d = 10; void PrintB(){ System.out.println("a = "+a); System.out.println("b = "+b); System.out.println("c = "+c); PrintA(); } } } class Test{ public static void main(String[] args) { A a = new A(); A.B b= a.new B(); b.PrintB(); } }

Java内部类,看这一篇就够了!

注意:我们要初始化内部类的对象时,必须先初始化外部类的对象,因为内部类是依附于外部类的

不然编译器就会报错
Java内部类,看这一篇就够了!

下面这段代码的意思是:先创建 外部类A 的对象a ,再 [.] 符号引用外部类中 内部类B 的成员,最后在初始化内部类 B

 A a = new A(); A.B b= a.new B();

 

外部类访问内部类

虽然内部类访问可以随意的访问外部类,但是外部类想要访问内部类可就没那么容易了

Java内部类,看这一篇就够了!

我们发现外部类想要访问内部类是不能直接访问的,那该怎么访问呢?—  可以先创建一个成员内部类的对象,再通过这个对象来访问:

//外部类 class A{ public int a = 10; private int b = 20; static int c = 30; public void PrintA(){ System.out.println("PrintA()"); } public void PrintA_B(){ B b = new B(); System.out.println(b.d); System.out.println("-------------"); b.PrintB(); } //内部类 class B{ public int d = 10; void PrintB(){ System.out.println("a = "+a); System.out.println("b = "+b); System.out.println("c = "+c); PrintA(); } } } class Test{ public static void main(String[] args) { A a = new A(); A.B b= a.new B(); a.PrintA_B(); } }

Java内部类,看这一篇就够了!

 

内部类中同名变量的优先级

如果外部类与内部类相同的属性,如下图中的 a,那么我们调用 PrintB 时访问的是哪个 a 呢?

class A{ public int a = 10; class B{ public int a = 40; void PrintB(){ System.out.println("a = "+a); } } } class Test{ public static void main(String[] args) { A a = new A(); A.B b= a.new B(); b.PrintB(); } } 

Java内部类,看这一篇就够了!

所以:如果是同名变量,优先访问内部类中的

问:要是这种情况,该怎么访问外部类中的 a 呢?
 

System.out.println("a = "+ A.this.a);

Java内部类,看这一篇就够了!

PrintB 在内部类B中 ,所以 this.a = 当前 内部类B 对象的 this 引用,A.this.a = 外部类A 的 this 引用

这种创建内部类的方式在实际开发中并不常用,因为内部类和外部类紧紧地绑定在一起,使用起来非常不便

小结:

外部类中的任何成员都可以在实例内部类方法中直接访问
实例内部类对象必须在先有外部类对象前提下才能创建
实例内部类的非静态方法中包含了一个指向外部类对象的引用
外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象

 

静态内部类

静态内部类其实就是在原来的内部类的基础上用 “static” 修饰,你看不要小看这个 static,加上后还是有不小的改变的

内部类访问外部类

Java内部类,看这一篇就够了!

以上面的代码为例,我们直接给内部类加上 static 修饰后:就不能只能访问外部类非静态成员,原因是静态的 内部类B 没有 外部类A 的 this 引用,那么有没有什么访问的方法呢?

— 还是与之前一样,创建一个外部类对象,再进行调用

class A{ public int a = 10; private int b = 20; static int c = 30; public void PrintA(){ System.out.println("PrintA()"); } static class B{ public int d = 40; void PrintB(){ A a1 = new A(); System.out.println("a = "+a1.a); System.out.println("b = "+a1.b); System.out.println("c = "+c); System.out.println("d = "+d); a1.PrintA(); } } } class Test{ public static void main(String[] args) { A.B b = new A.B(); b.PrintB(); } } 

Java内部类,看这一篇就够了!

 A.B b = new A.B();

生成静态的内部类的时候,不需要外部类的引用,也就是说:我们可以不用先初始化外部类

 小结:

在静态内部类中只能访问外部类中的静态成员
创建静态内部类对象时,不需要先创建外部类对象

局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类,所以局部内部类的生命周期仅限于作用域内

class A { public int a = 0; public void PrintA(){ class B { public int b; } } }

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

Java内部类,看这一篇就够了!

Java内部类,看这一篇就够了!

class A { public int a = 10; public void PrintA(){ class B { public int b = 20; public void PrintB(){ System.out.println("a = "+a); System.out.println("b = "+b); } } B b = new B(); b.PrintB(); } } class Test { public static void main(String[] args) { A a = new A(); a.PrintA(); } }

Java内部类,看这一篇就够了!

切记 ~ 局部内部类只能在当前方法内部使用,出了该方法则不能被使用

小结:

局部内部类只能在所定义的方法体内部使用
不能被 public、protected、private 以及 static 修饰符修饰
编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字 .class

匿名内部类

匿名内部类应该是平时我们编写代码时用得最多的,尤其是启动多线程的时候,会经常用到,并且 IDEA 也会帮我们自动生成。

 匿名对象一般运用于接口中,请看下面这段代码:

interface A{ void Test(); } class Test{ public static void main(String[] args) { new A(){ @Override public void Test(){ System.out.println("Test()"); } }.Test(); } }

Java内部类,看这一篇就够了! Java内部类,看这一篇就够了!

这里相当于一个类实现了这个 A接口 同时重写了 Test() 方法,但是你不知道这个类叫什么,所以这就是匿名对象

Java内部类,看这一篇就够了!

[.Test()] 是一种调用方式

匿名内部类的作用主要是用来继承其他类或者实现接口,并不需要增加额外的方法,方便对继承的方法进行实现或者重写

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117378.html

(0)
上一篇 2025-11-21 16:00
下一篇 2025-11-21 16:15

相关推荐

发表回复

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

关注微信