使用“创建java对象”的区别是什么;新";而那些不使用;新";

使用“创建java对象”的区别是什么;新";而那些不使用;新";,java,Java,创建对象时使用“新建”和不使用“新建”有什么区别 例如: Thing someThing = new Thing(); vs 在第一个示例中,我理解在实例化对象时,“new”是为someThing对象分配内存,并且内存位置由someThing引用 我的教科书使用第二个示例说明“创建路径对象”。区别在于对象的存储方式还是内存的分配方式?我不知道为什么要这样创建对象。没有区别。第二个例子是工厂方法 您传入一些参数,该方法将在路径的实际实例类上的某个点调用new。在第二种情况下,您使用的是静态方法,

创建对象时使用“新建”和不使用“新建”有什么区别

例如:

Thing someThing = new Thing();
vs

在第一个示例中,我理解在实例化对象时,“new”是为someThing对象分配内存,并且内存位置由someThing引用


我的教科书使用第二个示例说明“创建路径对象”。区别在于对象的存储方式还是内存的分配方式?我不知道为什么要这样创建对象。

没有区别。第二个例子是工厂方法


您传入一些参数,该方法将在
路径的实际实例类上的某个点调用
new
。在第二种情况下,您使用的是静态方法,该方法在内部创建对象或传递对现有对象的引用。这是一种常见的模式,尤其是当API希望隐藏内部实现时(这里就是这种情况)。

当您使用new关键字时,将创建特定类的对象

这里
Thing southing=new Thing()
某物是物类的对象

Path是一个具有静态方法
get()
的类,该方法接受字符串参数,并返回类似Path的路径

public static Path get(String arg)
{
return path;
}

内存由第二个实例中对Path.get的方法调用分配。这允许库对Path变量执行其自己的初始化例程,并可执行其他检查。New只分配内存。内存也可以在内部以某种结构进行排序和存储,这样它就不会通过缓存不断地重新加载同一个对象。一、 就个人而言,总是调用工厂方法,而不是自己创建一个新对象,但是这可以被认为是一种风格,因为工厂方法可以完成的几乎所有事情都可以通过构造函数来实现。

虽然它的行为类似于构造函数,还有一些差异需要指出:静态工厂方法不必返回当前类型,但也可以返回子类型,而构造函数创建当前类的实例。(假设)示例:

从实现的角度来看,这为以后的扩展提供了很大的灵活性。例如,您可以实现一些逻辑,这些逻辑决定在方法中创建哪个具体类型。您可以缓存实例并返回它们。每次都可以返回相同的实例(Singleton)。等等

进一步的方面:您实际上可以为静态工厂方法指定有意义的名称,因此代码更易于阅读:

public static Path createAbsolute(String name) { ... }
public static Path createRelative(String name) { ... }

使用第一个选项,您可以确定您正在创建一个新对象(或多或少,
java.lang.*
classe有点特殊) 让我们选择第二个选项:

Path filePath = Path.get("C:\\......)
没有任何东西可以向您保证存储在filePath中的实例是Path one,它可以是Path的子类的实例。Calendar也有类似的情况:Calendar是一个抽象类,所以

Calendar c=Calendar.getInstance();
变量
c
实际上是一个
gregorianalendar

另一个区别是:

class Singleton {

    private Singleton s=null;

    private Singleton(){};

    public static Singleton getSingleton() {
        if (s==null) {
            s=new Singleton();
        }
        return s;
    }
}

无论调用多少次
getSingleton
,您都只会创建一个对象。

在您的示例中,您假设创建的对象没有“new”。这是一个错误的假设。在第二个示例中,对象也是用“new”创建的


仅仅因为你看不到“new”并不意味着它没有在函数中被调用。

更清楚地说,
Path.get
方法几乎肯定是在其实现的某个地方调用
new
。静态方法不一定是在创建对象,它可能被存储,而你只是在检索它的引用。所提供的示例中并非如此。@DSquare,true。我更新了答案以包含该细节。谢谢你有没有试着看一下这个路径的源代码?
Path filePath = Path.get("C:\\......)
Calendar c=Calendar.getInstance();
class Singleton {

    private Singleton s=null;

    private Singleton(){};

    public static Singleton getSingleton() {
        if (s==null) {
            s=new Singleton();
        }
        return s;
    }
}