静态类、静态方法、内部类、匿名内部类、非静态类的一些实践

简介: 静态类、静态方法、内部类、匿名内部类、非静态类的一些实践

前言


各位小伙伴大家好,我是A哥。如题,在实际开发中,关于静态类、静态方法、内部类、匿名内部类、非静态类一般都会遇到,特别是你在研究开源框架源码的时候很是常见,它是内聚性的体现。本文针对这些“概念”的实战,做些总结。


正文


首先介绍静态类和非静态类内部类。先普及一个常识:一个文件里可以有多个类,但public的类只能有一个且必须和文件名一样。public final class可以这样写,但不能这样写:public static class A。但如果这个类是内部类,是可以这样写的:public static class A

静态内部类 vs 内部类


静态内部类:只是为了降低包的深度,方便类的使用,实现高内聚。静态内部类适用于不依赖于外部类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用。


非静态内部类:它有一个很大的优点:可以自由使用外部类的所有变量和方法,对其外部类有个引用

有了这两个区别,各位看官应该知道什么时候使用什么样的类了吧


静态方法 vs 非静态方法


静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。静态方法的使用效率比非静态方法的效率高。静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。


非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。是针对确定的一个对象的,所以不会存在线程安全的问题


静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。针对静态方法有一些最佳实践给你参考:


      适当地使用static方法本身并没有什么,当一个人从来不懂使用多态、接口设计时,很自然地会滥用static方法。

      通常通用的类中一些常用的方法可以设计为静态的

      只要是没有用到类的状态信息,只从参数获取信息的都可以为静态的

      静态方法可以实现某些特殊的设计模式:如Singleton

      由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部


匿名内部类


那么,匿名内部类有什么好处呢?除了只能使用一次,其实还有其他用处哦~


当你想使用一个类的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都这么干了,你还有什么理由不学习麽?


内部类和静态内部类的区别


静态类


1.只能在内部类中定义静态类


2.静态内部类不依赖于外部类,即使外部类没有创建对象,静态类也可以new对象


3.静态类的方法可以是静态的方法也可以是非静态的方法,静态的方法可以在外层通过静态类调用,而非静态的方法必须要创建类的对象之后才能调用。


4.静态类只能引用外部类的static成员变量(变量或者方法)(也就是类变量)。


5.如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态的。(静态成员只能定义在静态内部类里)


和普通内部类的区别


1.是否能拥有静态成员

静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。


2访问外部类的成员

静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。


3.静态内部类和非静态内部类在创建时有区别


//假设类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();
  }
}


总结


说说内部类的好处吧


内部类可以很好的实现隐藏(一般的非内部类,是不允许有 private 与protected权限的,但内部类可以)


内部类拥有外围类的所有元素的访问权限


可以实现多重继承


可以避免修改接口而实现同一个类中***两种同名方法***的调用


java的设计旨在简单,所以初学者十分好入门并且上手工作,但作为一门火了这么多年的语言,肯定还是有些硬骨头的,而这些,算是一些脆骨了。我们会发现java的设计者在设计内部类的时候用心良苦,学会使用内部类,是掌握java高级编程的一部分,它可以让你更优雅的设计你的程序结构。

相关文章
|
2月前
|
存储 C# 开发者
C#一分钟浅谈:静态成员与静态类介绍
在C#编程中,`static`关键字用于创建静态字段、方法、属性和构造函数等,这些成员属于类本身而非实例。本文从基本概念入手,详细探讨了静态成员与静态类的特点、应用场景及常见误区。通过示例代码展示了如何使用静态字段和方法,并讨论了静态类的定义及其在工具箱和常量集合中的应用。最后总结了正确使用这些特性的策略,以帮助开发者编写高效、可维护的代码。
70 11
|
5月前
|
存储 Java Kotlin
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象
|
5月前
|
Java
【Java基础】 内部类 (成员内部类、局部内部类、静态内部类、匿名内部类)
Java内部类 (成员内部类、局部内部类、静态内部类、匿名内部类)
35 0
|
Java
内部类(下)匿名内部类,静态内部类的使用
内部类(下)匿名内部类,静态内部类的使用
77 0
成员内部类、静态内部类、局部内部类、匿名内部类的精髓与应用
成员内部类、静态内部类、局部内部类、匿名内部类的精髓与应用
112 0
|
存储 Kotlin
Kotlin中嵌套类、数据类、枚举类和密封类的详解
Kotlin中嵌套类、数据类、枚举类和密封类的详解
104 1
|
Java C++
Java面向对象之内部类的详解
Java面向对象之内部类的详解
38 0
|
Java
3.4 内部类的类型:匿名内部类
3.4 内部类的类型:匿名内部类
66 0
|
Java 数据安全/隐私保护
1.2 什么是Java内部类:内部类的特点
1.2 什么是Java内部类:内部类的特点
89 0
|
Java
java中的四种内部类详解(成员类内部类,静态内部类,局部内部类,匿名内部类)
java中的四种内部类详解(成员类内部类,静态内部类,局部内部类,匿名内部类)
141 0