黑马程序员技术交流社区

标题: 构造函数被私有以后的问题 [打印本页]

作者: HM何伟    时间: 2013-3-31 11:19
标题: 构造函数被私有以后的问题
本帖最后由 HM何伟 于 2013-4-3 00:08 编辑

为什么构造函数被私有以后,不能被创建实例对象,谁能把原理说一下嘛.越详细越好啊.

作者: 邵震    时间: 2013-3-31 11:31
你做好了遥控器(对象),设置好了按键对应的功能(构造函数),但是你没给遥控器安装按钮(因为给你私有了)。我拿遥控控制不了里面的功能(读取不了里面的数据)。


这个是我自己理解的
作者: 邵震    时间: 2013-3-31 11:36
或者就是观光电梯 整个电梯是对象  电梯里都是电机电缆滑道,这些是我不想让你看的  我把上面和下面私有了

你看不到头顶的电缆和脚下的滑道 你只能看到正面的风景

但是你没给我安装轿厢,所以我被关在电梯外面了。
作者: 郭兴业    时间: 2013-3-31 11:41
构造函数被私有以后,只能在本类中使用,其它是不能用的,而其它类要想调用该类的方法,必须实例化该对象,用到,比如new Student();而你的Student已经被私有了,所以在其它类是不能new的
作者: HM何伟    时间: 2013-3-31 11:49
不要说这是java中的规定啊.有些规定也是有理论依据的
作者: 张超    时间: 2013-3-31 11:59
HM何伟 发表于 2013-3-31 11:49
不要说这是java中的规定啊.有些规定也是有理论依据的

任何被私有以后的变量 方法也包括构造方法只能够在本类中被使用,烧震举的就是很好的例子。他就是一个规则,不要过于专牛角尖。:P
作者: 桉树    时间: 2013-3-31 12:07
在Java当中,private 、public 、protected等修饰符,是为了完成封装的.
至于封装的作用,便是保护程序的安全性。
private 修饰过的方法和属性便是将它们封装起来,这些方法和属性只能在类的内部调用。而不能被外部或外部实体调用。
而建立对象则要调用构造器,当使用private 修饰构造器后,该构造器便不能被调用了。这样就不能创建实例对象。


作者: 薛飞    时间: 2013-3-31 15:31
只有构造函数执行完毕后,才算实例化完毕,即对象创建完毕。
构造函数是用来对对象初始化的,当该类被实例化为对象后new ClassDemo();在堆内存中开辟空间,此时即对对象进行初始化,要调用构造函数ClassDemo()。实际上也就是执行this.ClassDemo(),而此时构造函数私有化,只能被该类内部调用,类外部无法调用,创建的对象无法调用,this.ClassDemo()无法执行。也就无法创建对象。
作者: yhnan    时间: 2013-3-31 16:54
楼上讲的太好了
虚拟机向类要构造函数,要给类去堆内存里占地方去了,结果类自私不给。结果堆内存里就没它的地方了
作者: 陈丽莉    时间: 2013-3-31 18:24
若还有问题,继续追问;没有的话,请将帖子分类改成【已解决】~
作者: 夏凡    时间: 2013-3-31 21:56
首先,构造函数是用来对相应类的对象初始化的
其次,被private修饰的变量和方法只对其所在的类可见,该类以外无法访问
         而创造实例对象简单点说其实就是一个类在调用另一个类的方法的过程
因此,构造函数被私有化以后只能在所在类使用,无法被其他类创造实例对象

作者: HM何伟    时间: 2013-3-31 22:57
薛飞 发表于 2013-3-31 15:31
只有构造函数执行完毕后,才算实例化完毕,即对象创建完毕。
构造函数是用来对对象初始化的,当该类被实例 ...

也就是说构造函数初始化,是在创建对象之前必须执行的步骤.前面不能执行,后面也就不能执行.
作者: 薛飞    时间: 2013-4-1 09:09
本帖最后由 薛飞 于 2013-4-1 09:20 编辑
HM何伟 发表于 2013-3-31 22:57
也就是说构造函数初始化,是在创建对象之前必须执行的步骤.前面不能执行,后面也就不能执行. ...

对,对。构造函数是给对象进行初始化的,对象不能初始化,对象也就不能建立。当然,这些运行机制都是属于虚拟机的执行步骤,通过虚拟机的内部执行步骤可以分析出编译器在设计时为什么会出现此种语法报错。也就是说实际中只要构造函数私有后,你再创建该类对象,当你执行javac,编译器就会检测出语法错误而报错,并不是在虚拟机中实际执行时进行错误检测。
作者: 陈丽莉    时间: 2013-4-1 18:52
记得及时处理帖子哦~  追问或者结贴~
作者: 谢冬    时间: 2013-4-1 19:38
类的成员包括:属性 方法 代码块 内部类 构造方法,如果属性和方法被private修饰,你创建对象能够直接访问吗?构造函数的作用就是创建对象用的,如果构造函数被private修饰,和其他类成员是一个道理,你就不能在这个类以外直接访问了,一般构造方法被private修饰,是为了避免创建对象的随意性,在枚举,和单例中很好的体现了,因此就无法创建对象

作者: 邵彩华    时间: 2013-4-1 20:15
class Single {
        private Single() {
               
        };
        static private Single s = new Single();
        public static Single getInstance() {
                return s;
        }
}

class Test1 {
        public static void main(String[] args) {
                Single s1 = Single.getInstance();
        }
}
首先,指出你的一个错误,构造函数被私有化之后,仍然可以用来构造实例对象,但是只能在本类中构造对象。如上面的单例模式的程序。
其次,你要明白权限修饰符的种类和作用。public,protect,default,private,其中public,default还可以修饰类。private修饰的方法,只能在该类中使用,这是java里的规定,非法使用编译器会检查语法并报错。
还有,用private私有化构造函数的目的。这样做往往是为了防止其他类调用该方法创建该类对象。尤其是在单例模式中,如上面例子程序,为了保证外界的多个程序访问的都是同一个对象,就要防止外部程序调用该类的构造方法创建出多个不同的对象,而在本类的内部可以调用该私有化的构造方法在该类内部创建一个对象,并提供一个供其他类访问的接口(如上面的getInstance()),就可以实现多个程序访问同一个对象的目的了。
最后,用private进行私有化来控制访问,更体现了java类的封装性,是一种安全机制。建议不要把重点放在对权限修饰符的理解上。加深下权限修饰符方面的知识。

作者: 张源锋    时间: 2013-4-1 20:57
private 要在同一个类中才可访问,就如比说加了private后就是自己家的了,只有自家人才可以访问,外人无法访问
作者: 王川    时间: 2013-4-2 21:43
单例就是这个原理呀。把构造方法改成私有的,外部不能创建对象,只能通过该类的取方法得到这个对象,而且每次得到的都是同一个对象
作者: HM何伟    时间: 2013-4-3 00:04
邵彩华 发表于 2013-4-1 20:15
class Single {
        private Single() {
               

回答的很好,我明白了
作者: 疯狂程序    时间: 2013-4-3 01:01






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