关于匿名内部类的浅薄理解

发布时间:2024年01月08日

一直以来都有个疑问:明明在方法里写匿名内部类时都是new 一个外部类的,那为何叫匿名内部类呢?


public class Test{
	public void testSomeThing() {
			// 如此处,假设LoginUser类与Test类不在同一包下        
	        LoginUser loginUser1 = new LoginUser() {
	            @Override
	            public void setId(String id) {
	                super.setId(id);
	            }
	        };
	    }
}

查阅了相关资料,发现此时是创建了一个基于此类的子类

public class Test{
	// 一个子类继承了LoginUser
	class LoginUserTest extends LoginUser{
	}

	public void testSomeThing() {
			// 如此处,假设LoginUser类与Test类不在同一包下        
	        LoginUser loginUser1 = new LoginUser() {
	            @Override
	            public void setId(String id) {
	                super.setId(id);
	            }
	        };
			
			// 实际上loginUser1 等价于loginUserTest ,此时会自动创建一个类似LoginUserTest 的匿名类
			LoginUserTest loginUserTest = new LoginUserTest();
	    }
}

这个类由于是匿名的,所以通常在idea下是看不到的,但是如果使用javac编译可以看到,
假如编译了Test文件,会发现一个叫
$Test
的java文件,这个文件就是匿名内部类,一个等价于LoginUserTest 的类(不是LoginUserTest ,这个会直接编译成LoginUserTest的)
如图

部署项目的时候,如果是单个java文件而不是那种.jar的形式的话,对应的java类里尽量不要写匿名内部类的写法,否则可能会报找不到$XXX类的错误。这个就是因为没有吧对应内部类的java文件也给部署上去的缘故

如果是接口形式的话,内部类会变成接口的实现类

public class Test{
	// 一个子类继承了LoginUser
	class LoginUserTest extends LoginUser{
	}

	class MyServiceImpl implements UserService{
		@Override
		public void test(){
		}
	}

	public void testSomeThing() {
			// 如此处,假设LoginUser类与Test类不在同一包下        
	        LoginUser loginUser1 = new LoginUser() {
	            @Override
	            public void setId(String id) {
	                super.setId(id);
	            }
	        };
			
			// 实际上loginUser1 等价于loginUserTest ,此时会自动创建一个类似LoginUserTest 的匿名类
			LoginUserTest loginUserTest = new LoginUserTest();
			
			// 此时等价于MyServiceImpl 
			UserService service = new UserService(){
				@Override
				public void test(){
				}
			}
	    }
}
文章来源:https://blog.csdn.net/cjy1575944940/article/details/135453452
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。