A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 付鑫鑫 于 2013-5-13 17:38 编辑

为什么有些类没有构造方法,而要用静态方法去获取对象?原理?

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 新人鼓励

查看全部评分

15 个回复

倒序浏览
每个类都会有构造函数,不会没有构造函数的,只不过别人把构造函数私有化了,然后提供一个方法给你使用,那个是单例设计模式,单例设计模式是保证对象的唯一性!
看例子: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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 再给他说说工具类

查看全部评分

回复 使用道具 举报
楼上的同学已经解释得很清楚了。
另外:api中有个很恰当的例子,Runtime类。它的Runtime.getRuntime()即返回本类的一个唯一实例对象。

评分

参与人数 1黑马币 +3 收起 理由
王怀亮 + 3

查看全部评分

回复 使用道具 举报
类都是有构造方法的。平时我们引入类库API,用类的静态方法获取对象。那是因为该类在类库文件中,已经创建对象,我们直接调用对象就可以了。
这一点有点象单例模式,但区别很大的。

评分

参与人数 1黑马币 +6 收起 理由
王怀亮 + 6

查看全部评分

回复 使用道具 举报
为什么要把构造函数私有化
回复 使用道具 举报
梁耀今 发表于 2013-4-27 08:20
每个类都会有构造函数,不会没有构造函数的,只不过别人把构造函数私有化了,然后提供一个方法给你使用,那 ...

为什么要把构造函数私有化
回复 使用道具 举报
付鑫鑫 发表于 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(){}


}
回复 使用道具 举报
版主强烈要求我给你讲工具类,那我就举个例子把:
import java.util.*;

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

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

                System.out.println(i);
        }
}
回复 使用道具 举报
不是没有构造方法,而是由你看不见,我身上有没有钱,你看的见吗?看不见,因为我隐藏了;
在类中就是被private或者protected修饰了,如果一个类的所有构造函数都被private修饰那么这个类就是一个final型的类,不能被继承;
因此我们设计单例时,如果要考虑程序的扩展性(可以被继承),建议将构造函数protected,而不是private;
回复 使用道具 举报
梁耀今 发表于 2013-4-27 11:29
因为要保证对象的唯一性,如果在其他类中,不断的new该类对象,那就不能保证对象的唯一性了!
例如:clas ...

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

脱了裤子放屁一样,多此一举!
回复 使用道具 举报
额,通过静态方法获取对象?没看懂,为什么要定义静态方法,就是因为不需要建立对象就可以直接调用啦,至于有些类没有构造函数的话,那就要看你需不需要了,就好像person(一样,因为人都是具有名称和和年龄这些共性,所以就要吧它们抽取出来,而有些类没有共性,或者不是你需要的就不用定义啦。其实也可以说每个类都有构造函数,你不定义的话,系统会帮你默认一个空参数的构造函数,你不定义的话也
回复 使用道具 举报
构造方法被私有化,而是用一个静态方法返回这个类的对象。
回复 使用道具 举报
breeze 来自手机 中级黑马 2013-4-29 13:27:10
14#
所以类都要构造方法,包括抽象类,但是接口没有构造方法,如果接口中定义了成员属性,那么可以通过 接口名.属性 来调用,接口中的属性都有默认修饰符public static final
回复 使用道具 举报
breeze 来自手机 中级黑马 2013-4-29 13:27:41
15#
所以类都要构造方法,包括抽象类,但是接口没有构造方法,如果接口中定义了成员属性,那么可以通过 接口名.属性 来调用,接口中的属性都有默认修饰符public static final
回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马