java新手为啥java类中要有static静态方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java新手为啥java类中要有static静态方法?相关的知识,希望对你有一定的参考价值。

参考技术A 1。静态方法的特点: 直接调用类名+方法名,不需要实例化类对象。\\x0d\\x0a如: Hello.P();\\x0d\\x0a非静态方法则必须实例化一个对象出来,再通过对象调用该方法如: Hello hello=new Hello(参数1~n); hello.P();\\x0d\\x0a\\x0d\\x0a2。程序被打包成.jar文件后(相当于.exe文件),给外界唯一的接口就是main方法。使用者双击.jar文件,其实就是让虚拟机执行main方法。\\x0d\\x0a\\x0d\\x0a3。main方法不是提供给程序员的,而是提供给虚拟机和使用客户的。 一个软件你没法让客户知道你内部的详情,当然客户也就没办法知道怎么去实例化对象,更不知道实例化对象时需要输入什么参数了。所以只能采用静态方法。

Java多线程4:Thread中的静态方法

一、Thread类中的静态方法

  Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可以知道,Thread类中的静态方法所操作的线程是“正在执行该静态方法的线程”,不一定是其所在位置的线程。为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法:

  1、currentThread()

  currentThread()方法返回的是对当前正在执行的线程对象的引用。(Returns a reference to the currently executing thread object.)

  举例:

public class Thread01 extends Thread{

    static{
        System.out.println("静态代码块的打印:" + Thread.currentThread().getName());
    }

    public Thread01(){
        System.out.println("构造函数的打印:" +Thread.currentThread().getName());
    }

    @Override
    public void run() {
        System.out.println("run方法的打印:" + Thread.currentThread().getName());
    }
}
public class Test {
    public static void main(String[] args){
        Thread01 thread01 = new Thread01();
        thread01.start();
    }
}

  结果:

静态代码块的打印:main
构造函数的打印:main
run方法的打印:Thread-0

  可以看到,Thread01类中的三个相同的静态方法Thread.currentThread()所操作的不是同一个线程,虽然写在了Thread01内,但是静态代码块和构造函数中的静态方法是随着main线程而被调用的,run方法中的静态方法则是thread01线程调用的。把thread01.start()注释掉

public class Test {
    public static void main(String[] args){
        Thread01 thread01 = new Thread01();
//        thread01.start();
    }
}

  结果:

静态代码块的打印:main
构造函数的打印:main

  因为Thread01中的静态代码块和构造方法都是在main线程中被调用的,而run方法是thread01这个线程调用的,所以不一样。

  举例说明上篇说的"this.XXX()"和"Thread.currentThread().XXX()"的区别,this表示的线程是线程实例本身,后一种表示的线程是正在执行"Thread.currentThread.XXX()这块代码的线程"

public class Thread01 extends Thread{

    public Thread01(){
        System.out.println("构造函数中通过this调用:" + this.getName());
        System.out.println("构造函数中通过静态方法调用:" + Thread.currentThread().getName());
    }

    @Override
    public void run() {
        System.out.println("run方法中通过this调用:" + this.getName());
        System.out.println("run方法中通过静态方法调用:" + Thread.currentThread().getName());
    }
}
public class Test {
    public static void main(String[] args){
        Thread01 thread01 = new Thread01();
        thread01.start();
    }
}

  结果:

构造函数中通过this调用:Thread-0
构造函数中通过静态方法调用:main
run方法中通过this调用:Thread-0
run方法中通过静态方法调用:Thread-0

  同样的,把thread01.start()这一行注释掉以后

public class Test {
    public static void main(String[] args){
        Thread01 thread01 = new Thread01();
//        thread01.start();
    }
}

  结果:

构造函数中通过this调用:Thread-0
构造函数中通过静态方法调用:main

  所以,在Thread01里面通过Thread.currentThread得到的线程对象的引用不一定就是Thread01。

  2、

以上是关于java新手为啥java类中要有static静态方法?的主要内容,如果未能解决你的问题,请参考以下文章

java 内部类为啥不能static

java 类中函数前加和不加static有啥不同

java中为啥要把main方法定义为一个static方法

Java多线程3:Thread中的静态方法

Java多线程4:Thread中的静态方法

Java之静态代理模式