【小家java】静态类、静态方法、内部类、匿名内部类、非静态类的一些实践

1、概述

如题,其实在实际业务开发中用得较少,但偶尔又会碰到,因此本文针对于此做一些说明

2、栗子

首先介绍静态类和非静态类(普通类) 内部类

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

静态内部类的作用:只是为了降低包的深度,方便类的使用,实现高内聚。静态内部类适用于不依赖于外部类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用。非静态内部类有一个很大的优点:可以自由使用外部类的所有变量和方法,对其外部类有个引用
有了这两个区别,各位看官应该知道什么时候使用什么样的类了吧

下面是静态方法和非静态方法的区别:
静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。静态方法的使用效率比非静态方法的效率高。静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。
非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。是针对确定的一个对象的,所以不会存在线程安全的问题
静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别

  • 适当地使用static方法本身并没有什么,当一个人从来不懂使用多态、接口设计时,很自然地会滥用static方法。
  • 通常通用的类中一些常用的方法可以设计为静态的
  • 只要是没有用到类的状态信息,只从参数获取信息的都可以为静态的
  • 静态方法可以实现某些特殊的设计模式:如Singleton
  • 由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部

那么,匿名内部类有什么好处呢?除了只能使用一次,其实还有其他用处哦~
当你想使用一个类的protected 方法时,但是目前你的类又和他不同包且也不能继承他,这时候匿名类就派上用场了,你可以声明一个匿名类继承该类,并定义一个方法然后调用父类方法即可
其实,这个做法,我是在spring-boot中的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都这么干了,你还有什么理由不这么干吗?

3、使用场景

如上所述

4、最后

说说内部类的好处吧

  • 内部类可以很好的实现隐藏(一般的非内部类,是不允许有 private 与protected权限的,但内部类可以)
  • 内部类拥有外围类的所有元素的访问权限
  • 可以实现多重继承
  • 可以避免修改接口而实现同一个类中两种同名方法的调用

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

按照要求,补齐代码
    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();
    }
}

—-题后语—-

我的微信公众号也会持续推送技术干货,欢迎下方二维码扫码关注获取。
这里写图片描述
更多内容持续更新中,欢迎关注我的博客!
有任何问题,可以跟我留言讨论,欢迎指正,不胜感激。
有任何疑问,亦可扫码向我提我哟~

阅读更多

扫码向博主提问

_YourBatman

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • java
  • 微服务
  • SOA
去开通我的Chat快问
版权声明: https://blog.csdn.net/f641385712/article/details/80351540
个人分类: java基础
上一篇【小家java】类中静态代码块、构造代码块、静态变量执行顺序和继承逻辑
下一篇【小家java】匿名内部类为什么只能使用外部final的变量
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭