作者:A哥(YourBatman)
各位小伙伴大家好,我是A哥。如题,在实际开发中,关于静态类、静态方法、内部类、匿名内部类、非静态类一般都会遇到,特别是你在研究开源框架源码的时候很是常见,它是内聚性的体现。本文针对这些“概念”的实战,做些总结。
首先介绍静态类和非静态类内部类。先普及一个常识:一个文件里可以有多个类,但public的类只能有一个且必须和文件名一样。public final class可以这样写,但不能这样写:public static class A。但如果这个类是内部类,是可以这样写的:public static class A
静态内部类:只是为了降低包的深度,方便类的使用,实现高内聚。静态内部类适用于不依赖于外部类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用。
非静态内部类:它有一个很大的优点:可以自由使用外部类的所有变量和方法,对其外部类有个引用 有了这两个区别,各位看官应该知道什么时候使用什么样的类了吧
静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。静态方法的使用效率比非静态方法的效率高。静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。
非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。是针对确定的一个对象的,所以不会存在线程安全的问题
静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。针对静态方法有一些最佳实践给你参考:
那么,匿名内部类有什么好处呢?除了只能使用一次,其实还有其他用处哦~
当你想使用一个类的protected 方法时,但是目前你的类又和他不同包且也不能继承他,这时候匿名类就派上用场了,你可以声明一个匿名类继承该类,并定义一个方法然后调用父类方法即可
其实,这个做法,我是在spring-boot
中的HttpMessageConverters
类中看到的:
HttpMessageConverters:
private List<HttpMessageConverter<?>> getDefaultConverters() {
List<HttpMessageConverter<?>> converters = new ArrayList<>();
if (ClassUtils.isPresent("org.springframework.web.servlet.config.annotation." + "WebMvcConfigurationSupport", null)) {
// 匿名内部类的实现
converters.addAll(new WebMvcConfigurationSupport() {
public List<HttpMessageConverter<?>> defaultMessageConverters() {
return super.getMessageConverters();
}
}.defaultMessageConverters());
} else {
converters.addAll(new RestTemplate().getMessageConverters());
}
reorderXmlConvertersToEnd(converters);
return converters;
}
所以,spring都这么干了,你还有什么理由不学习麽?
//假设类A有静态内部类B和非静态内部类C,创建B和C的区别为:
A a=new A();
//创建B
A.B b=new A.B();
//创建C
A.C c=a.new C();
送一道匿名内部类的面试题:
按照要求,补齐代码
interface Inter {
void show();
}
class Outer {
//补齐代码
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”。
答案如下:
interface Inter{
void show();
}
class Outer{
public static Inter method(){
return new Inter(){
public void show(){
System.out.println("Hello World");
};
};
}
}
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
}
}
说说内部类的好处吧
java的设计旨在简单,所以初学者十分好入门并且上手工作,但作为一门火了这么多年的语言,肯定还是有些硬骨头的,而这些,算是一些脆骨了。我们会发现java的设计者在设计内部类的时候用心良苦,学会使用内部类,是掌握java高级编程的一部分,它可以让你更优雅的设计你的程序结构。