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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张迁 中级黑马   /  2013-4-27 21:53  /  2967 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张迁 于 2013-4-28 00:20 编辑

为什么this调用构造函数必须也只能放在构造函数的首行呢??
  1. class WenTi {
  2.         public static void main(String[] args) {
  3.                 new Person("张三",20).speak();
  4.         }
  5. }
  6. class Person{
  7.         private String name;
  8.         private int age;
  9.         public Person(){
  10.                 System.out.println("创建一个对象");
  11.         }
  12.         public Person(String name,int age){
  13.                 this.name = name;
  14.                 this.age = age;
  15.                 this(); // 编译出错??
  16.         }
  17.         public void speak(){
  18.                 System.out.println(name+"----"+age);
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

8 个回复

倒序浏览
构造方法被调用,它将执行通常的super() 过程以及后续的操作。然后在执行本构造函数中的构造语句,这个时候的顺序是这样的:
                  this(....)     //当前类的其他构造函数
                  ...         //当前构造函数的其他语句

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

回复 使用道具 举报
错误信息:{Constructor call must be the first statement in a constructor}
具体我说不清,应该是规定吧。我是这样理解的:如果放在第一行,调用的是无参数的构造函数,对相应的变量进行初始化,int类型的初始化为0,string类型初始化null;初始化
完成后,再继续执行接下来的代码;如果放在最后,则this.name=name;this.age=age;执行完后,又调用this();又对相应变量进行初始化,这样前面的赋值将不起作用。所以,我认为在构造函数里面不能讲this()放在最后。
回复 使用道具 举报
你好,
this() 作用:执行被类对象的构造方法,所以只能出现在构造方法中.
class WenTi {

        public static void main(String[] args) {

                new Person("张三",20).speak();

        }

}

class Person{

        private String name;

        private int age;

        public Person(){
                super()------同样有默认的Object无参构造;

                System.out.println("创建一个对象");

        }

        public Person(String name,int age){
                 super();----这是默认的,代表Object的无参构造;

                this.name = name;

                this.age = age;

                this(); // 编译出错??----这里加了this(),它会再执行无参构造,

        }

        public void speak(){

                System.out.println(name+"----"+age);

        }

}
你这样写,java jvm不被允许,为什么不被允许?
请看:在你的程序中,你用了有参构造创建了对象,底层执行是:
1.先执行super()
2.再调用属性实例化对象
3.接着你的--this();这里继续调用无参构造
4.就会执行上面的无参
5.执行这个无参同样会先执行super()
在这个过程中super()被执行了了两次,就可能出错,不被jvm允许.
this()和super()都必须放在第一行,只存在于构造函数,并且不能共存....
回复 使用道具 举报
smile_joe 发表于 2013-4-27 22:50
你好,
this() 作用:执行被类对象的构造方法,所以只能出现在构造方法中.
class WenTi {

super()函数什么功能,现在还没学到
回复 使用道具 举报
张迁 发表于 2013-4-27 22:54
super()函数什么功能,现在还没学到

继承就到了
回复 使用道具 举报
先吐槽一下,尼玛,手机就是不给力,我说我的,刚刚打了一大堆,结婚没登录,哭了。this()语句是用于构造函数间调用的,构造函数是用来给对象初始化的,当对象建立的时候,它就会先找对应的构造函数进行初始化,所以this就要放在第一行,比如说name,你先把name赋值为张三了,然后再执行this进行初始化的话,那你的name就没有意义了,所以this语句要放在最第一句
回复 使用道具 举报
张迁 中级黑马 2013-4-28 00:19:58
8#
江大海 发表于 2013-4-27 23:49
先吐槽一下,尼玛,手机就是不给力,我说我的,刚刚打了一大堆,结婚没登录,哭了。this()语句是用于构造函 ...

谢谢辛苦回复,我明白了!
回复 使用道具 举报
这个在java基础视频里有详细的讲解
毕向东老师的,应该是第6天的第六节左右,误差前后2节以内...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马