使用“创建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;
}
}