黑马程序员技术交流社区

标题: 为什么有些类没有构造方法,而要用静态方法去获取对象? [打印本页]

作者: 付鑫鑫    时间: 2013-4-27 07:40
标题: 为什么有些类没有构造方法,而要用静态方法去获取对象?
本帖最后由 付鑫鑫 于 2013-5-13 17:38 编辑

为什么有些类没有构造方法,而要用静态方法去获取对象?原理?
作者: 梁耀今    时间: 2013-4-27 08:20
每个类都会有构造函数,不会没有构造函数的,只不过别人把构造函数私有化了,然后提供一个方法给你使用,那个是单例设计模式,单例设计模式是保证对象的唯一性!
看例子:class SingleDemo
{
        public static void main(String[] args)
        {
                Single s = Single.getInstance();   //获取构造函数
        }
}

class Single
{
        private Single(){} //私有化构造函数

        private static Single s = new Single();        //自己new构造函数

        public static Single getInstance()    //提供返回的方法
        {
                return s;
        }
}

作者: 刘渝灵    时间: 2013-4-27 08:38
楼上的同学已经解释得很清楚了。
另外:api中有个很恰当的例子,Runtime类。它的Runtime.getRuntime()即返回本类的一个唯一实例对象。
作者: 奋斗2013    时间: 2013-4-27 08:41
类都是有构造方法的。平时我们引入类库API,用类的静态方法获取对象。那是因为该类在类库文件中,已经创建对象,我们直接调用对象就可以了。
这一点有点象单例模式,但区别很大的。
作者: 付鑫鑫    时间: 2013-4-27 09:02
为什么要把构造函数私有化
作者: 付鑫鑫    时间: 2013-4-27 09:03
梁耀今 发表于 2013-4-27 08:20
每个类都会有构造函数,不会没有构造函数的,只不过别人把构造函数私有化了,然后提供一个方法给你使用,那 ...

为什么要把构造函数私有化
作者: 梁耀今    时间: 2013-4-27 11:29
付鑫鑫 发表于 2013-4-27 09:03
为什么要把构造函数私有化

因为要保证对象的唯一性,如果在其他类中,不断的new该类对象,那就不能保证对象的唯一性了!
例如:class SingleDemo
{
        public static void main(String[] args)
        {
                //为什么要把构造函数私有化,因为要保证对象的唯一性;
               
                Single s1 = new Single();
                Single s2 = new Single();  //这样不断new对象,保证不了对象的唯一性。
       
                Single2 s = new Single2();   //如果类的构造函数私有化了,这样就不能new函数了。这样保证了唯一性。
        }
}

class Single
{
       
}

class Single2
{
        private Single2(){}


}
作者: 梁耀今    时间: 2013-4-27 11:55
版主强烈要求我给你讲工具类,那我就举个例子把:
import java.util.*;

class MathDemo
{
        public static void main(String[] args)
        {
                //例子:比如数学计算数值把

                double i = Math.sqrt(10);
                //Math类当中,别人就写好了构造方法,等你想要做什么运算的时候就直接拿来用就可以了。
                //这样不仅方便,而且还减少很多错误的机会。

                System.out.println(i);
        }
}

作者: Miss小强    时间: 2013-4-27 17:59
不是没有构造方法,而是由你看不见,我身上有没有钱,你看的见吗?看不见,因为我隐藏了;
在类中就是被private或者protected修饰了,如果一个类的所有构造函数都被private修饰那么这个类就是一个final型的类,不能被继承;
因此我们设计单例时,如果要考虑程序的扩展性(可以被继承),建议将构造函数protected,而不是private;

作者: Miss小强    时间: 2013-4-27 18:02
梁耀今 发表于 2013-4-27 11:29
因为要保证对象的唯一性,如果在其他类中,不断的new该类对象,那就不能保证对象的唯一性了!
例如:clas ...

准确的来说应该是protected或者private,因为构造函数被这两个权限修饰符修饰了,
外部就不能直接new了,只能通过静态方法获取;
protected,是为了保证能让子类继承,如果都private,一旦有继承需要,就不行了,就相当于成了一个final类
作者: 梁耀今    时间: 2013-4-28 07:56
Miss小强 发表于 2013-4-27 18:02
准确的来说应该是protected或者private,因为构造函数被这两个权限修饰符修饰了,
外部就不能直接new了, ...

脱了裤子放屁一样,多此一举!
作者: 江大海    时间: 2013-4-28 10:06
额,通过静态方法获取对象?没看懂,为什么要定义静态方法,就是因为不需要建立对象就可以直接调用啦,至于有些类没有构造函数的话,那就要看你需不需要了,就好像person(一样,因为人都是具有名称和和年龄这些共性,所以就要吧它们抽取出来,而有些类没有共性,或者不是你需要的就不用定义啦。其实也可以说每个类都有构造函数,你不定义的话,系统会帮你默认一个空参数的构造函数,你不定义的话也
作者: xiewen    时间: 2013-4-29 10:52
构造方法被私有化,而是用一个静态方法返回这个类的对象。
作者: breeze    时间: 2013-4-29 13:27
所以类都要构造方法,包括抽象类,但是接口没有构造方法,如果接口中定义了成员属性,那么可以通过 接口名.属性 来调用,接口中的属性都有默认修饰符public static final
作者: breeze    时间: 2013-4-29 13:27
所以类都要构造方法,包括抽象类,但是接口没有构造方法,如果接口中定义了成员属性,那么可以通过 接口名.属性 来调用,接口中的属性都有默认修饰符public static final
作者: 曹睿翔    时间: 2013-5-1 07:41
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2