创建一个在java中使用的类?

创建一个在java中使用的类?,java,Java,我是Java新手(在python之后)。还有一个关于使用一个类而不创建新实例的问题。这段代码有效,但这样做是好习惯还是坏习惯 class TestStatic { private static String url; private static String user; TestStatic(String _url, String _user) { url = _url; user = _user; } static

我是Java新手(在python之后)。还有一个关于使用一个类而不创建新实例的问题。这段代码有效,但这样做是好习惯还是坏习惯

class TestStatic {
    private static String url;
    private static String user;

    TestStatic(String _url, String _user) {
        url = _url;
        user = _user;
    }

    static void print() {
        System.out.println(url);
        System.out.println(user);
    }
}

public class Main {
    public static void main(String[] args) {
        new TestStatic("HTTP", "USER");
        TestStatic.print();
//        TestStatic test = new TestStatic("HTTP", "USER");
//        test.print();
    }
}
new TestStatic("HTTP", "USER");
或者我需要注释main方法中的前两个字符串,然后取消注释下两个字符串,并在这样的代码中使用它们

class TestStatic {
    private static String url;
    private static String user;

    TestStatic(String _url, String _user) {
        url = _url;
        user = _user;
    }

    static void print() {
        System.out.println(url);
        System.out.println(user);
    }
}

public class Main {
    public static void main(String[] args) {
        new TestStatic("HTTP", "USER");
        TestStatic.print();
//        TestStatic test = new TestStatic("HTTP", "USER");
//        test.print();
    }
}
new TestStatic("HTTP", "USER");
你想用这个做什么

您已经在一个静态类中创建了一个静态方法,可以在不创建TestStatic实例的情况下访问该静态类

TestStatic.print();
上面这一行很好,但是您的变量需要是静态的,请不要在构造函数中设置它们。不需要创建test static的新对象,因为您对它不做任何操作,而且它可能在创建后不久就进入垃圾收集

大多数人将静态类用于实用程序函数。您可以了解何时使用静态类以及何时不使用它们

在澄清您的问题之后,在为整个项目创建一个类以将其连接到SoniqMQ时,您最好使用单例模式

单例模式强制您只创建类的单个对象,您可以在整个项目中使用它

public class MySingleTon {

    private static MySingleTon myObj;

    private MySingleTon(){
    //Empty private constructor    
    }

    public static MySingleTon getInstance(){
        if(myObj == null){
            myObj = new MySingleTon();
        }
        return myObj;
    }

    public void getSomeThing(){
        // do something here
        System.out.println("I am here....");
    }

    public static void main(String a[]){
        MySingleTon st = MySingleTon.getInstance();
        st.getSomeThing();
    }
}

这绝对不是使用类和静态变量的方式。这完全取决于您希望如何使用特定类。如果希望在所有实例中都有相同的变量,或者根本没有实例,则应如下使用:

class TestStatic {
    private static String url;
    private static String user;

    static void print() {
        System.out.println(url);
        System.out.println(user);
    }

    public static setUrl(String url){
        TestStatic.url = url;
    }

    public static setUser(String user){
        TestStatic.user = user;
    }
}

public class Main {
    public static void main(String[] args) {
        TestStatic.setUrl("HTTP");
        TestStatic.setUser("USER");
        TestStatic.print();
    }
}
class TestStatic {
    private String url;
    private String user;

    public TestStatic(String url, String user) {
        this.url = url;
        this.user = user;
    }

    public void print() {
        System.out.println(url);
        System.out.println(user);
    }
}

public class Main {
    public static void main(String[] args) {
        TestStatic test = new TestStatic("HTTP", "USER");
        test.print();
    }
}
因此,您根本不必创建实例。请记住,所有实例的静态变量都会更改,并且不需要任何实例来访问/更改它们

如果希望每个实例的变量不同,则应按如下方式处理:

class TestStatic {
    private static String url;
    private static String user;

    static void print() {
        System.out.println(url);
        System.out.println(user);
    }

    public static setUrl(String url){
        TestStatic.url = url;
    }

    public static setUser(String user){
        TestStatic.user = user;
    }
}

public class Main {
    public static void main(String[] args) {
        TestStatic.setUrl("HTTP");
        TestStatic.setUser("USER");
        TestStatic.print();
    }
}
class TestStatic {
    private String url;
    private String user;

    public TestStatic(String url, String user) {
        this.url = url;
        this.user = user;
    }

    public void print() {
        System.out.println(url);
        System.out.println(user);
    }
}

public class Main {
    public static void main(String[] args) {
        TestStatic test = new TestStatic("HTTP", "USER");
        test.print();
    }
}
请注意,您没有将静态变量用于实例特定的值

有关静态变量和方法的更多信息,请参阅


正如我在您对Farhan Qasim的回答的评论中所读到的,您的用例(正如他所提到的)将需要一个单例模式。只需用谷歌搜索它是什么,它做什么,或者只需点击。

正如每个答案中所说的,并且喜欢所有的评论。不要混合使用静态和实例初始化。如果仍要分配
url
user
,则可以为此创建一个
静态
方法:

final class TestStatic {
    private static String url;
    private static String user;

    private TestStatic(){}

    static void initialize(String _url, String _user) {
        url = _url;
        user = _user;
    }

    static void print() {
        System.out.println(url);
        System.out.println(user);
    }
}

public class Main {
    public static void main(String[] args) {
        TestStatic.initialize("HTTP", "USER");
        TestStatic.print();
    }
}

我还将类设置为final,并将其构造函数设置为私有。防止类的任何实例化
TestStatic
。因为它不使用,只保存静态值。

非常糟糕,每次创建新的
TestStatic
,静态字段都会被覆盖。通过构造函数设置
静态
字段通常是不鼓励的,因为您不实例化静态类。这看起来像是XY问题,你想达到什么目的?没有理由这么做。只需将其创建为常规的非静态对象并传递引用即可。这导致了一个更加灵活的结构。该模式本身被称为Singleton(尽管看起来略有不同)。但正如所说,通常您不需要也不应该需要它。“静态类”->我在这里没有看到任何。。。静态类仅用于内部类。我想创建一个类来连接到SonicMQ,并在我的代码中全局使用它。这只是一个概念的例子。@Tutunak您最好为类创建一个单例模式。通过singleton模式,只会创建一个对象,您可以对所有项目使用相同的对象。