Java:类与类;变量

Java:类与类;变量,java,variables,instance,Java,Variables,Instance,我从两个月开始学习时就知道如何用java创建变量/类成员,但是在下面的代码片段中,第一个私有变量(实例)的创建如下: 私有静态StaticBlockSingleton实例 代码段: 这里创建私有静态变量(实例)时为什么使用类名(StaticBlockSingleton),这是什么概念?它是如何工作的 感谢您在这方面的指导 附加点: 另外一点:这里我不是问'static'关键字,而是问用作变量或方法类型的类名 使用类名作为成员(变量/方法)的类型是非常特殊的目的吗 假设我们使用字符串类型作为实例变

我从两个月开始学习时就知道如何用java创建变量/类成员,但是在下面的代码片段中,第一个私有变量(实例)的创建如下:

私有静态StaticBlockSingleton实例

代码段: 这里创建私有静态变量(实例)时为什么使用类名(StaticBlockSingleton),这是什么概念?它是如何工作的

感谢您在这方面的指导

附加点:

另外一点:这里我不是问'static'关键字,而是问用作变量或方法类型的类名

使用类名作为成员(变量/方法)的类型是非常特殊的目的吗

假设我们使用字符串类型作为实例变量或getInstance()方法,我们仍然不能实现单例功能,因为我们将调用getInstance()


不确定这里是否缺少任何概念…

因为变量的给定名称意味着:

private static StaticBlockSingleton instance;
您看到的是sigleton模式,它保证您只有一个特定类的实例。这就是构造函数是私有的原因:

private StaticBlockSingleton(){}
这将强制在静态初始值设定项中创建该类的唯一实例:

    static{
        try{
            instance = new StaticBlockSingleton();
        }catch(Exception e){
            throw new RuntimeException("Exception occured in creating singleton instance");
        }
    }
因此,所有其他类将仅使用
getInstance()
方法获取现有实例,如下所示:

StaticBlockSingleton.getInstance().someMethod();
你可以在

这是使用类型为
StaticBlockSingleton

private StaticBlockSingleton(){}
这是声明一个空构造函数,并将其标记为private,以便只有类本身可以创建一个新实例

//static block initialization for exception handling
static{
    try{
        instance = new StaticBlockSingleton();
    }catch(Exception e){
        throw new RuntimeException("Exception occured in creating singleton instance");
    }
}
这是一个静态初始值设定项块,在加载类时将运行一次,并创建一个实例并将其分配给
instance
变量

这里的异常处理很糟糕,因为您丢失了有关异常发生原因的任何信息,这些信息将存储在
exception e
中,一般来说,即使是异常类型也最好尽量具体(例如
FileNotFoundException
而不是
IOException

静态初始值设定项块是不必要的,因为空构造函数不会引发异常,所以第一行应该改为

private static StaticBlockSingleton instance=new StaticBlockSingleton();
并删除静态初始值设定项块

最后

public static StaticBlockSingleton getInstance(){
    return instance;
}

这是一个公开的公共方法,用于返回
实例
变量。因为类的构造函数是私有的,而实例是静态的,所以整个代码库只有一个实例

请阅读关于单例设计模式的内容。即使是在。或者你需要阅读Java中的关键字static和构造函数,我想。@GiladGreen,谢谢你的文章,是的,它是singleton,但是为什么我们需要在方法或变量之前使用类名(StaticBlockSingleton),比如StaticBlockSingleton getInstance()和private StaticBlockSingleton instance;分别是“为什么使用类名(StaticBlockSingleton)”有趣。。。。为什么您认为创建StaticBlockSingleton实例会引发RuntimeException???谢谢您的解释。此外,由于构造函数是私有的,我们不能从外部创建对象。因此,我们需要为相应的类成员使用与类型相同的类名。我现在的理解是正确的?当您使用
static
关键字时,它与类本身一起存储,而不是与类的特定实例一起存储,因此您有
StaticBlockSingleton.{static methods and members}
vs
{someInstance}.{non static methods and members}
private static StaticBlockSingleton instance=new StaticBlockSingleton();
public static StaticBlockSingleton getInstance(){
    return instance;
}