Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从对象调用静态函数和从类本身调用静态函数的区别_Java_Oop_Design Patterns_Static_Singleton - Fatal编程技术网

Java 从对象调用静态函数和从类本身调用静态函数的区别

Java 从对象调用静态函数和从类本身调用静态函数的区别,java,oop,design-patterns,static,singleton,Java,Oop,Design Patterns,Static,Singleton,我在学习singleton设计模式,我确实理解这个概念。但是,我对以下代码有疑问:- class Token { private static int i = 5; private static Token obj = new Token(); //Private Constructor private Token() { } //Returning the singleton object public static Token getObj

我在学习singleton设计模式,我确实理解这个概念。但是,我对以下代码有疑问:-

class Token
{
    private static int i = 5;
    private static Token obj = new Token();

//Private Constructor
    private Token()
    {
    }

//Returning the singleton object
    public static Token getObject()
    {
        return obj;
    }

    public static int getValue()
    {
        return i;
    }
}

public class TestMain
{
    public static void main(String args[])
    {
        Token obj = Token.getObject();

        System.out.println("Without object " + Token.getValue());
        System.out.println("With object " + obj.getValue());
    }
}
在这两种情况下都会打印实例变量i——

Without object 5
With object 5

获取实例变量的两种方法与推荐的方法有什么区别?

事实上,在
obj
中,您引用了您的singleton。因此,调用
Token.getValue()
引用与
obj.getValue()
相同的obj,实际上在
obj
中,您引用了您的单身汉。因此,调用
Token.getValue()
引用与
obj.getValue()
相同的obj没有什么区别,例如,您需要实际实例的实例访问权限,而实际实例并不总是拥有


至于偏好,这取决于你问谁。对我来说,静态字段和方法应该使用类而不是实例来访问-这清楚地表明它是静态的。

没有什么区别,例如,实例访问需要实际的实例,而实际的实例并不总是有的


至于偏好,这取决于你问谁。对于我来说,应该使用类而不是实例来访问静态字段和方法-这清楚地表明它是静态的。

i
是属于类
标记的静态变量,因此它对于
标记类型的所有对象都具有相同的值


出于所有实际目的,
obj.getValue()
Token.getValue()
相同,您可以使用其中任何一种,但为了更好的可读性,请使用
Token.getValue()
,因为它强化了静态变量
i
和静态方法
getValue()
作为一个整体属于该类,而不属于该类的某些对象。

i
是一个静态变量,属于类
Token
,因此它对于
Token
类型的所有对象都具有相同的值


出于所有实际目的,
obj.getValue()
Token.getValue()
相同,您可以使用其中任何一种,但为了更好的可读性,请使用
Token.getValue()
,因为它强化了静态变量
i
和静态方法
getValue()
属于整个类,而不是该类的某些对象。

代码中没有“实例变量
i
”。当字段是静态字段时,它不是实例变量。代码中没有“实例变量
i
”。当一个字段是静态的,它不是一个实例变量。。如果有一个非静态的私有变量“val”,那么要访问它,我们需要对象-obj。否则,对于所有静态变量,两种方法实际上是相同的。对吧?好吧,我明白了。。如果有一个非静态的私有变量“val”,那么要访问它,我们需要对象-obj。否则,对于所有静态变量,两种方法实际上是相同的。对吗?