内部类与嵌套类

本文详细介绍了Java中嵌套类的概念、特点及应用场景,并通过示例代码解释了嵌套类如何仅能访问外部类的静态成员,以及其在实际开发中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:从头认识java嵌套类

1.概念

内部类使用static的时候就是嵌套类。

[java]  view plain  copy
  1. package com.ray.ch07;  
  2.   
  3. public class Test {  
  4.     private static class MyTest3{}  
  5.       
  6. }  

MyTest3就是嵌套类


2.注意点

(1)只能跟外部类的static部分进行通信

(2)不在持有外部类对象的引用,可以直接使用static特性

[java]  view plain  copy
  1. package com.ray.ch07;  
  2.   
  3. public class Test {  
  4.     private int id = 1;  
  5.     private static String name = "aaa";  
  6.   
  7.     private static class MyTest1 {  
  8.         public void say() {  
  9.             // System.out.println(id);//error  
  10.             System.out.println(name);  
  11.         }  
  12.     }  
  13.   
  14.     private class MyTest2 {  
  15.         public void say() {  
  16.             System.out.println(id);  
  17.             System.out.println(name);  
  18.         }  
  19.     }  
  20.   
  21.     public static void main(String[] args) {  
  22.         // new Test().new MyTest1();//error.  
  23.         new Test.MyTest1().say();  
  24.         new Test().new MyTest2();  
  25.     }  
  26. }  

从上面的代码可以看见,MyTest1是不能够访问id,而MyTest2可以。

还有,在new的时候,我们可以看见,MyTest1具备了static的特性,不需要new,但是还是需要多加一个括号,而MyTest2则需要new才能调用里面的方法。


(3)嵌套类没有this这引用

因为嵌套类使用了static,因此不能使用this来引用外部类。


(4)使用场景

一个比较常见的使用场景就是跟main函数结合。

因为在发布项目的时候通过只是发布有用的代码,像测试等代码都不发布的,那么现在这个就比较有用了。

我们来对比一下下面的这两组代码:

[java]  view plain  copy
  1. package com.ray.ch08;  
  2.   
  3. public class Test {  
  4.       
  5.     public static void main(String[] args) {  
  6.           
  7.     }  
  8.   
  9. }  


[java]  view plain  copy
  1. package com.ray.ch08;  
  2.   
  3. public class Test {  
  4.     private void say() {  
  5.         System.out.println("abc");  
  6.     }  
  7.   
  8.     public static class Tester {  
  9.         public static void main(String[] args) {  
  10.             Test test = new Test();  
  11.             test.say();  
  12.         }  
  13.     }  
  14.   
  15. }  


上面两组代码的功能是一样的,但是生成的文件却有区别。

第一个代码只会生成一个Test.class

但是第二个会生成两个文件Test.class和Test$Tester.class,我们只需要在发布到时候把第二个文件删除,那么这些测试的代码就删掉了,这样比较方便。

个人补充:

内部类中不能定义静态成员(静态成员类似于C语言的全局变量,而内部类通常是用于创建内部对象的。所以,把“全局变量”放在内部类是不正确的)

比如,下面的代码:

class Persion1
{
	class Persion2
	{
		private static String string="";
		public static void Set() {
			
		}
	}
}
Persion2类中的string变量,Set()方法的定义都是不允许有static修饰的,都必须把static去掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值