Java中的静态类? 推荐 | Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看活动链接

“Java中的静态类

有什么像static class在Java中吗?

这样的课是什么意思。静态类的所有方法都需要static吗?

是否需要反过来,如果一个类包含所有静态方法,那么该类也应该是静态的吗?

静态类有什么用处?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

Java具有静态嵌套类,但听起来您正在寻找顶级静态类。Java无法将顶级类设为静态,但您可以像这样模拟静态类:

声明您的class final-阻止扩展class,因为扩展静态class没有意义

创建构造函数private-防止通过客户端代码实例化,因为实例化静态类没有任何意义

创建类的所有成员和函数static-由于无法实例化该类,因此无法调用任何实例方法或无法访问实例字段

请注意,编译器不会阻止您声明实例(非静态)成员。仅当您尝试调用实例成员时才会显示该问题

每个建议的简单示例如下:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}
复制代码

静态类有什么用?静态类的一个好用法是定义一次性的,实用程序和/或库类,在这些类中,实例化是没有意义的。一个很好的例子是Math类,它包含一些数学常数,例如PI和E,并且仅提供数学计算。在这种情况下,需要实例化将是不必要且令人困惑的。请参阅Math类和源代码。请注意,它是final并且其所有成员均为static。如果Java允许声明顶级类,static则Math类确实是静态的。

高分回答:

好吧,Java有“静态嵌套类”,但是如果您来自哪里,它们与C#的静态类根本不一样。静态嵌套类只是一个没有隐式引用外部类实例的类。

静态嵌套类可以具有实例方法和静态方法。

Java中没有顶级静态类。

文章翻译自 yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/7…

*作者建议:的确大多数的静态类都是一些工具类,当然之前也写过静态内部类实现线程安全的单例模式,附带jdk源码中url模板类实现的单例模式–> Java内部类和静态嵌套类?

除了上面讲到的静态内部类,再讲一个大家都熟悉的ThreadPoolExecutor

public class ThreadPoolExecutor extends AbstractExecutorService 
复制代码

它里面有这样一个内部类Worker继承了AQS

    // 主要的属性就是任务firstTask和线程thread
    private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable
复制代码

它里面还有静态内部类 – 拒绝策略

public static class CallerRunsPolicy implements RejectedExecutionHandler 给调用者
public static class AbortPolicy implements RejectedExecutionHandler  异常
public static class DiscardPolicy implements RejectedExecutionHandler 丢弃
public static class DiscardOldestPolicy implements RejectedExecutionHandler 丢弃最旧的
复制代码

ThreadPoolExecutor本身就继承了一个抽象执行器(主要方法:添加任务和提交任务),如果想要避免线程的争抢需要用到AQS,例如在执行任务时:

final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // 以独占的方式释放资源
        
        
复制代码

unlock

public void unlock()      { release(1); }
复制代码

这个AQS类的公共方法release

   public final boolean release(int arg) {
        if (tryRelease(arg)) {
            Node h = head;
            if (h != null && h.waitStatus != 0)
                unparkSuccessor(h);
            return true;
        }
        return false;
    }
复制代码

用到线程池才会去加载,设置自动回收,关于线程池的调优和原理,请看我的这篇文章:

zhuanlan.zhihu.com/p/147583619

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞? 求关注❤️ 求分享? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享