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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 赵太云 于 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:}

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1 鼓励一下

查看全部评分

40 个回复

倒序浏览
本帖最后由 刘文超 于 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. //                                有参构造...
复制代码

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1

查看全部评分

回复 使用道具 举报
        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;//创建了两个对象!不是说,构造函数是为特定对象初始化的吗???
                                                         //只有一个对象,没有两个
                 }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 肖志锋 于 2013-1-3 21:31 编辑

只有一个对象,就算你有参的调用的无参的,那么就是无参的创建了对象,有参的再去属性赋值而已。
1.而且如果你没有无参的构造函数呢?那一句也就不能写了,eclipse会自动帮你加,那么这时候需要手动去掉才行,会报错的。
2.当你这个是子类的时候,第一句也就不是this了,而是super了,默认也是掉父类无参的,同理如果没有无参的怎么办?手动添加。
3.当然,如果你子类第一句已经自己调用了自己其他的构造函数的话,那也就只能使用调用的那些构造函数去调用父类的的了。

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1

查看全部评分

回复 使用道具 举报
gaoyang525445 发表于 2013-1-3 21:26
public static void main(String[] args) {
                class Test{
                 private int var;

和你的”头像“比起来还不够个性吧!!!!!:lol
回复 使用道具 举报
刘文超 发表于 2013-1-3 21:20

什么东东????????????
回复 使用道具 举报
赵太云 发表于 2013-1-3 21:30
和你的”头像“比起来还不够个性吧!!!!!

哈哈,谢谢夸奖,你也是明年的?
回复 使用道具 举报
gaoyang525445 发表于 2013-1-3 21:32
哈哈,谢谢夸奖,你也是明年的?

没赶上,打算报下一期的。。。。听你那淫荡的笑声莫你已经???????????
回复 使用道具 举报
赵太云 发表于 2013-1-3 21:31
什么东东????????????

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

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


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

搞不懂是怎么实现的!
回复 使用道具 举报
刘文超 发表于 2013-1-3 21:42
刚刚抢个沙发而已,再好好给你解释,
那可是偶一个字一个字、一行一行代码敲出来、
给你举了个例子,也把 ...

恩,会的,看到你的头像我就有努力的动力啦!!!
回复 使用道具 举报
本帖最后由 赵太云 于 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 21:42
刚刚抢个沙发而已,再好好给你解释,
那可是偶一个字一个字、一行一行代码敲出来、
给你举了个例子,也把 ...


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

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

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

真相只有一个!求真相????
回复 使用道具 举报
肖志锋 发表于 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 21:36
没赶上,打算报下一期的。。。。听你那淫荡的笑声莫你已经??????????? ...

我准备报明年的,今年的没戏了
回复 使用道具 举报
gaoyang525445 发表于 2013-1-3 22:07
我准备报明年的,今年的没戏了

加个Q哈  583432975
回复 使用道具 举报
赵太云 发表于 2013-1-3 21:57
仔细看了 刘文超  和  肖志锋 的回答,发现两个人有绝对的出入:

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

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

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

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

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

你的var是私有的,不能直接赋值,只能使用有参构造器赋值或者使用set,
第一种:类 p=new 类;p。setVar(参数);
第二种:类 p=new 类(参数);
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马