2 qq 33935278 qq_33935278 于 2016.02.05 17:56 提问

创建对象和获取对象的方法区分

学习java没多久,心里有个疑惑,为什么有时需要new一个对象
比如: Student sru =new Student();
而有时候却是像工厂模式那样 ".",通过点的instance来获取.
上网查了下还有克隆方法获取对象的
那么该如何区分什么时候该用哪种方法获取对象呢.还是就像"1+1=2"一样,就是这么规定的,
我们只需要记住就可以了!!

7个回答

caozhy
caozhy   Ds   Rxr 2016.02.05 22:07
 这里有两个问题,一个是,简单类型,比如 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
}
caozhy
caozhy 我解释了直接调用和间接调用new的两种形式。至于 xxx.xxx,其实不过就是调用一个函数,间接调用new。好比你知道了这一点,你就可以知道,A a1 = foo(); 其实也就是A a1 = this.foo(); 反过来,不知道点是干嘛的,还会发现A a1 = foo(); 这个表述,既没有new又没有点。那么下次还有问题。我希望一次性把问题解释清楚。
接近 2 年之前 回复
caozhy
caozhy 回复c1132032434: 首先,我反对用什么“.的形式”这种描述方式。应该先搞清楚语法。"点"不过是调用对象的成员和方法,本身和对象初始化没有一毛钱的关系。学习的目的就是用尽可能少的概念去解释尽可能多的现象,达到举一反三地目的。
接近 2 年之前 回复
u013465878
u013465878 1楼的说的是对的,但是感觉没有回答到楼主的点子上。楼主只是想知道,什么时候用new关键字来直接创建对象,什么时候直接用“.”的形式来用。
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.06 00:32

再多数几句,为什么有时候调用者创建对象,为什么有时候被调用者创建对象,为什么有时候第三方创建对象。
调用者创建对象这个最简单,不需要多讲。
被调用者创建对象有这么几个好处,一个是限制作用。比如说对于一个tree类型,我们要求所有的node必须在tree中拥有一个合法的位置,即不允许出现一个node的parent为空,或者它的两个子节点指向同一个node
这样的复杂的规定,调用者去实现,那么等于把相同的逻辑分散到了不同的代码中,违背了面向对象的封装性原则。有时候我们需要限制对象的数量。比如典型的单例模式,我们只允许有一个全局的对象,不能有多套,那么拽需要限制。
最后,第三方创建对象,这个也叫“工厂模式”,主要目的是实现依赖关系的反转。调用者创建对象,意味着如果要想让这个对象实现新的功能,编写了一个派生类,那么必须在调用者那里去调用新的类的构造函数。这不仅麻烦,而且更重要的是,有时候我们的实现类根本就是在调用者写好以后才编写的。比如说eclipse的插件,你不可能每写一个新的插件,就把 eclipse 的源代码修改编译一次,加上新的功能调用。那么这种情况下,我们创建对象的代码必须提取出来,放在外面,通常我们用反射实现动态加载。而eclipse的主程序,它是通过一个方法获取的插件,而不是自己创建,也就不需要调用new了。

qq_33935278
qq_33935278   2016.02.09 16:36

感谢各位朋友的回答.你们回答很详细^灰常感谢

qq_33935278
qq_33935278   2016.02.09 16:36

感谢各位朋友的回答.你们回答很详细^灰常感谢

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.05 18:15

可以理解为这是获取对象的两种方式,前者是自己显式new的方式,后者是调用类的静态方法来获取实例对象,但后者的本质也是new出来的对象。

RaspberryMonster
RaspberryMonster   2016.02.05 19:25

刚学java还是先不要管设计模式了。其实本质是一样的,工厂模式是将new这一步放在instance方法中了,这样能控制实例化的对象数目。

91program
91program   Ds   Rxr 2016.02.05 19:37

创建对象,有对象的初始化过程(一般伴随着内存分配);
获取对象,即引用已存在的对象,那么对象不会执行初始化过程。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!