黑马程序员技术交流社区

标题: 关于this和构造函数的疑惑!!!??? [打印本页]

作者: 赵太云    时间: 2013-1-3 21:12
标题: 关于this和构造函数的疑惑!!!???
本帖最后由 赵太云 于 2013-1-6 23:25 编辑

class Test{
        private int var;
        
        public Test(){
               
        }
        
        public Test (int var){
                this();//这个是构造函数,但是new Test(88)时,调用了两次构造函数,是不是
                this.var = var;//创建了两个对象!不是说,构造函数是为特定对象初始化的吗???
        }
}
{:soso_e163:}
作者: 刘文超    时间: 2013-1-3 21:20
本帖最后由 刘文超 于 2013-1-3 21:38 编辑

lz你好,
你的理解稍微有点不对啦,待我一点点给你分析哈:
构造方法里的this()只是调用本类另一个构造函数,进行其他的一些初始化而已,但都是针对这一个对象的、、
比如一个类中有两个构造方法:一个初始化 学号,一个初始化 学号和姓名。
当我要创建一个既有“学号” , 又有“姓名” 属性的学生对象就可以这样:
在构造2中,完全可以先先调用构造1初始化id,再对name初始化-----完成了1个对象的初始化功能!
  1. class Stud{
  2.         private String id;
  3.         private String name;
  4.         
  5.         //构造1
  6.         public Stud(String id){
  7.                 this.id=id;
  8.         }
  9.         
  10.         //构造2
  11.         public Stud(String id,String name){
  12.                 this(id);//调用构造2,相当于this.id=id;
  13.                 this.name=name;
  14.         }
  15.         
  16.         public static void main(String []args){
  17.                 Stud s1=new Stud("01");
  18.                 Stud s2=new Stud("01","张三");
  19.         }
  20. }
复制代码
下边是对你的代码的解释:【按照1.2.3.4的顺序执行的哦】
  1. package org.qyx.online;

  2. public class TestConstructor {

  3.         public static void main(String []args){
  4.                 Test t=new Test(88);//1.java虚拟机自动匹配找到有参数的构造函数
  5.         }
  6. }

  7. class Test{
  8.     private int var;
  9.    
  10.     public Test(){
  11.             System.out.println("无参构造...");//3.执行,打印出来
  12.     }
  13.    
  14.     public Test (int var){
  15.             this();  //2.用this关键字调用类中其他构造函数
  16.             this.var = var;//4.从无参数构造函数回来,接着下下执行。
  17.             System.out.println("有参构造...");//打印
  18.     }
  19. }

  20. //最后打印为:        无参构造...
  21. //                                有参构造...
复制代码

作者: 高阳    时间: 2013-1-3 21:26
        public static void main(String[] args) {
                class Test{
                 private int var;
                
                 public Test(){
                         
                }
                
                 public Test (int var){
                         this();//这个是构造函数,但是new Test(88)时,调用了两次构造函数,
                                         //因为你传递了参数,调用了有参构造,而this()又调用了本地无参构造,所以调用了两次
                         this.var = var;//创建了两个对象!不是说,构造函数是为特定对象初始化的吗???
                                                         //只有一个对象,没有两个
                 }
                }
        }
作者: 肖志锋    时间: 2013-1-3 21:28
本帖最后由 肖志锋 于 2013-1-3 21:31 编辑

只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。
1.而且如果你没有无参的构造函数呢?那一句也就不能写了,eclipse会自动帮你加,那么这时候需要手动去掉才行,会报错的。
2.当你这个是子类的时候,第一句也就不是this了,而是super了,默认也是掉父类无参的,同理如果没有无参的怎么办?手动添加。
3.当然,如果你子类第一句已经自己调用了自己其他的构造函数的话,那也就只能使用调用的那些构造函数去调用父类的的了。
作者: 赵太云    时间: 2013-1-3 21:30
gaoyang525445 发表于 2013-1-3 21:26
public static void main(String[] args) {
                class Test{
                 private int var;

和你的”头像“比起来还不够个性吧!!!!!:lol
作者: 赵太云    时间: 2013-1-3 21:31
刘文超 发表于 2013-1-3 21:20

什么东东????????????
作者: 高阳    时间: 2013-1-3 21:32
赵太云 发表于 2013-1-3 21:30
和你的”头像“比起来还不够个性吧!!!!!

哈哈,谢谢夸奖,你也是明年的?
作者: 赵太云    时间: 2013-1-3 21:36
gaoyang525445 发表于 2013-1-3 21:32
哈哈,谢谢夸奖,你也是明年的?

没赶上,打算报下一期的。。。。听你那淫荡的笑声莫你已经???????????
作者: 刘文超    时间: 2013-1-3 21:42
赵太云 发表于 2013-1-3 21:31
什么东东????????????

刚刚抢个沙发而已,再好好给你解释,
那可是偶一个字一个字、一行一行代码敲出来、
给你举了个例子,也把你的代码解释了一下.
一定要好好学,才对得起我的劳动成果。。。
作者: 赵太云    时间: 2013-1-3 21:44
肖志锋 发表于 2013-1-3 21:28
只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。
1.而且如 ...

”只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。


谢了!!那构造函数的this是代表类名还是代表什么东东??????????????
作者: 赵太云    时间: 2013-1-3 21:47
刘文超 发表于 2013-1-3 21:20
lz你好,
你的理解稍微有点不对啦,待我一点点给你分析哈:
构造方法里的this()只是调用本类另一个构造函数 ...

搞不懂是怎么实现的!
作者: 赵太云    时间: 2013-1-3 21:50
刘文超 发表于 2013-1-3 21:42
刚刚抢个沙发而已,再好好给你解释,
那可是偶一个字一个字、一行一行代码敲出来、
给你举了个例子,也把 ...

恩,会的,看到你的头像我就有努力的动力啦!!!
作者: 赵太云    时间: 2013-1-3 21:57
本帖最后由 赵太云 于 2013-1-3 22:05 编辑

仔细看了 刘文超  和  肖志锋 的回答,发现两个人有绝对的出入:

刘同学:完全可以先先调用构造1初始化id,再对name初始化-----完成了1个对象的初始化功能! 是说全部初始化完再创建对象!相当于 1, this.var = var   2, new Test(88);

肖同学: 只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。是说先创建对象后赋值!!!  相当于1, new Test()      2, this.var =  88 ;

真相只有一个!求真相????
作者: 赵太云    时间: 2013-1-3 22:06
刘文超 发表于 2013-1-3 21:42
刚刚抢个沙发而已,再好好给你解释,
那可是偶一个字一个字、一行一行代码敲出来、
给你举了个例子,也把 ...


仔细看了 刘文超  和  肖志锋 的回答,发现两个人有绝对的出入:

刘同学:完全可以先先调用构造1初始化id,再对name初始化-----完成了1个对象的初始化功能! 是说全部初始化完再创建对象!相当于 1, this.var = var   2, new Test(88);

肖同学: 只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。是说先创建对象后赋值!!!  相当于1, new Test()      2, this.var =  88 ;

真相只有一个!求真相????
作者: 赵太云    时间: 2013-1-3 22:07
肖志锋 发表于 2013-1-3 21:28
只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。
1.而且如 ...


仔细看了 刘文超  和  肖志锋 的回答,发现两个人有绝对的出入:

刘同学:完全可以先先调用构造1初始化id,再对name初始化-----完成了1个对象的初始化功能! 是说全部初始化完再创建对象!相当于 1, this.var = var   2, new Test(88);

肖同学: 只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。是说先创建对象后赋值!!!  相当于1, new Test()      2, this.var =  88 ;

真相只有一个!求真相????
作者: 高阳    时间: 2013-1-3 22:07
赵太云 发表于 2013-1-3 21:36
没赶上,打算报下一期的。。。。听你那淫荡的笑声莫你已经??????????? ...

我准备报明年的,今年的没戏了
作者: 赵太云    时间: 2013-1-3 22:08
gaoyang525445 发表于 2013-1-3 22:07
我准备报明年的,今年的没戏了

加个Q哈  583432975
作者: 高阳    时间: 2013-1-3 22:11
赵太云 发表于 2013-1-3 21:57
仔细看了 刘文超  和  肖志锋 的回答,发现两个人有绝对的出入:

刘同学:完全可以先先调用构造1初始化id ...

两个是一个意思,事实都是先有对象,才能赋值
作者: 刘文超    时间: 2013-1-3 22:11
赵太云 发表于 2013-1-3 22:06
仔细看了 刘文超  和  肖志锋 的回答,发现两个人有绝对的出入:

刘同学:完全可以先先调用构造1初始化 ...

我认为2调用了1构造初始化了id,自己再初始化了name、构造函数结束了,才叫”完成“创建对象。。。
我认为lz,你不应该把创建对象和构造函数中初始化的过程分开来、、
作者: 高阳    时间: 2013-1-3 22:17
赵太云 发表于 2013-1-3 22:07
仔细看了 刘文超  和  肖志锋 的回答,发现两个人有绝对的出入:

刘同学:完全可以先先调用构造1初始化 ...

你的var是私有的,不能直接赋值,只能使用有参构造器赋值或者使用set,
第一种:类 p=new 类;p。setVar(参数);
第二种:类 p=new 类(参数);
作者: 赵太云    时间: 2013-1-3 22:20
gaoyang525445 发表于 2013-1-3 22:17
你的var是私有的,不能直接赋值,只能使用有参构造器赋值或者使用set,
第一种:类 p=new 类;p。setVar ...

Thank you !:victory:
作者: 赵太云    时间: 2013-1-3 22:20
刘文超 发表于 2013-1-3 22:11
我认为2调用了1构造初始化了id,自己再初始化了name、构造函数结束了,才叫”完成“创建对象。。。
我认 ...

恩,谢了!!!!1:kiss:
作者: 心弦上的景致    时间: 2013-1-3 23:12
默认初始化。
显示初始化。
调用构造代码块
调用构造函数进行初始化。

理解了这些 你的问题就解决了   我感觉你和我一样 都是新人  问都没问明白
作者: 心弦上的景致    时间: 2013-1-3 23:33
默认初始化。
显示初始化。
调用构造代码块
调用构造函数进行初始化。

理解了这些 你的问题就解决了   我感觉你和我一样 都是新人  问都没问明白
作者: 陈丽莉    时间: 2013-1-4 15:33
本帖最后由 陈丽莉 于 2013-1-5 15:35 编辑

构造函数,是和类名同名的函数,可重载,用于给对应的对象进行初始化。比如你的程序里有public Test(){}和 public Test (int var){this();this.var=var;}这两个构造函数,当执行new Test(88)时,调用的是第二个有且只有一个int参数的构造函数;

this()用于构造函数间互相调用,并不代表它本身是构造函数,因为参数为空,所以调用的是public Test(){},因为是在第二个构造函数中调用的第一个构造函数,所以作用的都是同一个对象。

this.var=var的意思是new Test(88)这个匿名对象的var值为88.关于用this赋值,老师视频中的原话是:哪个对象在调用this所在函数,this就代表哪个对象。

也就是说,虽然一共调用了两个构造函数,但都是作用于同一个对象。

作者: 赵太云    时间: 2013-1-6 17:23
恩。。。。

作者: 赵太云    时间: 2013-1-6 17:24
陈丽莉 发表于 2013-1-4 15:33
构造函数,是和类名同名的函数,可重载,用于给对应的对象进行初始化。比如你的程序里有public Test(){}和  ...

谢了。。。。。。。。
作者: 赵太云    时间: 2013-1-6 17:26
陈丽莉 发表于 2013-1-4 15:33
构造函数,是和类名同名的函数,可重载,用于给对应的对象进行初始化。比如你的程序里有public Test(){}和  ...

问个题外的。。。。。。。。。如何将【未解决】标识为【已解决】?????????
作者: 赵太云    时间: 2013-1-6 17:28
呵呵,,,,需要的就是技术分。。。。。。。。。。。。。。。。。。。。。。。:victory:
作者: 何竹冬    时间: 2013-1-6 18:18
你好
不是创建了两个对象
调用有参数的构造函数初始化的时候又调用了无参构造函数,你的无参构造函数什么都没做,你的初始化动作是在有参数的构造函数中进行的。
作者: 赵太云    时间: 2013-1-6 18:33
何竹冬 发表于 2013-1-6 18:18
你好
不是创建了两个对象
调用有参数的构造函数初始化的时候又调用了无参构造函数,你的无参构造函数什么都 ...

问个题外的。。。。。。。。。如何将【未解决】标识为【已解决】?????????
作者: 打工人    时间: 2013-1-6 18:35
赵太云 发表于 2013-1-6 17:26
问个题外的。。。。。。。。。如何将【未解决】标识为【已解决】????????? ...

点击编辑,左上角方向的下拉菜单中有已解决
作者: 赵太云    时间: 2013-1-6 18:45
冯海霞 发表于 2013-1-6 18:35
点击编辑,左上角方向的下拉菜单中有已解决

找不到啊。。。。。。。。。。。。。。。。。。。。。
作者: 打工人    时间: 2013-1-6 18:50
赵太云 发表于 2013-1-6 18:45
找不到啊。。。。。。。。。。。。。。。。。。。。。



作者: 打工人    时间: 2013-1-6 18:51
赵太云 发表于 2013-1-6 18:45
找不到啊。。。。。。。。。。。。。。。。。。。。。

我这图做的不好。。。你应该能看懂
作者: 陈丽莉    时间: 2013-1-6 19:10
赵太云 发表于 2013-1-6 17:26
问个题外的。。。。。。。。。如何将【未解决】标识为【已解决】????????? ...

编辑帖子,右上角有选项。我听说大概是这样,自己也没试过。
作者: 熊永标    时间: 2013-1-6 22:44
这跟调用构告函数有什么系呢,构造函数只是用来在创建对像时,对对像进行数据的初始化而已,对于创建几个对象,那是虚拟机的事,在这里只有一个new,所以虚拟机只会在内存中创建一个对像。并通过构告函数给对象初始化值。
作者: 打工人    时间: 2013-1-6 22:57
陈丽莉 发表于 2013-1-6 19:10
编辑帖子,右上角有选项。我听说大概是这样,自己也没试过。

“右上角有选项 ”这个是不是我之前说的。。。我可能说错方向了,是左边
作者: 赵太云    时间: 2013-1-6 23:27
冯海霞 发表于 2013-1-6 18:50

很感谢,也很感动!!!版主能这么细心!!!!爱你哦!!!
作者: VOIDMAIN    时间: 2013-1-14 21:39
我支持肖同学的解释。一个类就是一个对象,也只能new一个对象,默认一个类会有一个系统自动添加的无参隐式构造方法,但是为了利用构造函数的特性,通常会显示的写出构造方法,并添加初始化代码。
作者: VOIDMAIN    时间: 2013-1-14 21:39
我支持肖同学的解释。一个类就是一个对象,也只能new一个对象,默认一个类会有一个系统自动添加的无参隐式构造方法,但是为了利用构造函数的特性,通常会显示的写出构造方法,并添加初始化代码。




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