学习java没多久,心里有个疑惑,为什么有时需要new一个对象
比如: Student sru =new Student();
而有时候却是像工厂模式那样 ".",通过点的instance来获取.
上网查了下还有克隆方法获取对象的
那么该如何区分什么时候该用哪种方法获取对象呢.还是就像"1+1=2"一样,就是这么规定的,
我们只需要记住就可以了!!
创建对象,有对象的初始化过程(一般伴随着内存分配);
获取对象,即引用已存在的对象,那么对象不会执行初始化过程。
可以理解为这是获取对象的两种方式,前者是自己显式new的方式,后者是调用类的静态方法来获取实例对象,但后者的本质也是new出来的对象。
刚学java还是先不要管设计模式了。其实本质是一样的,工厂模式是将new这一步放在instance方法中了,这样能控制实例化的对象数目。
这里有两个问题,一个是,简单类型,比如 float int (string不是,但是string有简化的语法,看上去好像是简单类型),这些不需要new就可以使用
除此之外所有的类对象都需要new
这是第一个问题。
第二个问题,关于谁来new的问题。
我们可以让调用者自己new,也可以让类的实现者或者第三者来new:
class A
{
static private A a;
A() {} //把默认的构造函数封闭,它是private的,只有内部才能new
static public A getInstance()
{
if (a == null) a = new A(); //内部new
return a;
}
}
这样外部只能通过调用
A a = A.getInstance(); 得到A的对象实例
这个经典的做法也叫“单例模式”
我们也可以由第三方初始化:
class A
{
}
A foo() { return new A(); }
void main()
{
A a = new A(); //直接调用new
A a1 = foo(); //间接调用new
}
再多数几句,为什么有时候调用者创建对象,为什么有时候被调用者创建对象,为什么有时候第三方创建对象。
调用者创建对象这个最简单,不需要多讲。
被调用者创建对象有这么几个好处,一个是限制作用。比如说对于一个tree类型,我们要求所有的node必须在tree中拥有一个合法的位置,即不允许出现一个node的parent为空,或者它的两个子节点指向同一个node
这样的复杂的规定,调用者去实现,那么等于把相同的逻辑分散到了不同的代码中,违背了面向对象的封装性原则。有时候我们需要限制对象的数量。比如典型的单例模式,我们只允许有一个全局的对象,不能有多套,那么拽需要限制。
最后,第三方创建对象,这个也叫“工厂模式”,主要目的是实现依赖关系的反转。调用者创建对象,意味着如果要想让这个对象实现新的功能,编写了一个派生类,那么必须在调用者那里去调用新的类的构造函数。这不仅麻烦,而且更重要的是,有时候我们的实现类根本就是在调用者写好以后才编写的。比如说eclipse的插件,你不可能每写一个新的插件,就把 eclipse 的源代码修改编译一次,加上新的功能调用。那么这种情况下,我们创建对象的代码必须提取出来,放在外面,通常我们用反射实现动态加载。而eclipse的主程序,它是通过一个方法获取的插件,而不是自己创建,也就不需要调用new了。
感谢各位朋友的回答.你们回答很详细^灰常感谢
感谢各位朋友的回答.你们回答很详细^灰常感谢