黑马程序员技术交流社区

标题: this 使用问题 毕老师视频 第5天11 [打印本页]

作者: 丁一    时间: 2013-3-12 20:40
标题: this 使用问题 毕老师视频 第5天11
本帖最后由 丁一 于 2013-3-12 21:03 编辑

class Person
{
        private String name;
        private int age;
        Person()
        {
        }
        Person(String name)
        {
                this.name="haha";
        }
                /*        Person(int age)        需要做一个这个地方的构造函数
                       {
                               this.age=30;
                         }   */
        Person(String name,int age)
        {
                this(name);          //这里的this只能放在第一行
                this.age=age;                                  //   this(age);   这里我也想搞一个Person(String name) 这样的构造函数,应该怎样做
                System.out.println(name+"……"+age);
        }
}
class demo
{
        public static void main(String[] args)
        {
                        Person p=new Person("lisi",30);
                }
}


作者: 丁一    时间: 2013-3-12 20:50
本帖最后由 丁一 于 2013-3-12 21:03 编辑

{:soso_e126:}{:soso_e135:}
作者: 文密    时间: 2013-3-12 21:14
有点不明白你,到底是要做什么样的事情
Person(String name,int age)
         {
                 this.name=name   
                 this.age=age;         
                 System.out.println(name+"……"+age);
         }

就可以进行初始化赋值 。
用在构造方法中调用本类的其他构造方法:
  this(参数...);
this可以调用本类的成员
  this.成员方法()
  this.成员变量
作者: 樊玲    时间: 2013-3-12 21:19
构造函数是用来初始化对象的。。  里面默认第一行为this() ,用来指代对象,是必须放在构造函数里的,且必须为第一行。
作者: 伍淑江    时间: 2013-3-12 21:19
构造函数的特点就是,函数名与类名相同,不用定义返回值类型,没有具体返回值
   Person(String name,int age)
        {
                this(name);         
                this.age=age;                                
                System.out.println(name+"……"+age);
        }

this(name)已经调用了上面的Person(String name) 构造函数 ,况且构造函数里面也不能嵌套构造函数呀
作者: 樊玲    时间: 2013-3-12 21:20
你是想要做什么呢?
作者: 丁一    时间: 2013-3-12 21:29
伍淑江 发表于 2013-3-12 21:19
构造函数的特点就是,函数名与类名相同,不用定义返回值类型,没有具体返回值
   Person(String name,int a ...

Person(String name) 是一个构造函数了  name是参数,那现在我能不能在创建一个 Person(int age) 这样的函数, 如果能该怎样在  Person(String name,int age) 中调用,就像 调用  this(name)这样
作者: 我自信我很牛    时间: 2013-3-12 21:48
this只有俩个用法,一是当成员函数(包括构造函数)的参数和类属性命名相同时予以区分,在属性前加this.
二是在子类构造函数的第一行,必须是第一行,出现this则执行子类的构造函数,如果是super,则执行父类的构造函数。

作者: HM李超    时间: 2013-3-12 22:01
你到底想问什么?
作者: 曹睿翔    时间: 2013-3-12 22:25
楼主想法奇特!
本类中的构造函数调用类中的构造方法,只听说过调用一次,调用两个不同的本类构造函数,可以吗?求高人回答!
不过又返回来说,这个问题貌似跟super()和this()不能同时出现在一个构造器中的道理一样,
作者: 伍淑江    时间: 2013-3-12 22:58
本帖最后由 伍淑江 于 2013-3-12 23:03 编辑
丁一 发表于 2013-3-12 21:29
Person(String name) 是一个构造函数了  name是参数,那现在我能不能在创建一个 Person(int age) 这样的 ...

1,可以创建Person(int age)这样的函数
2,不能再调用了,//这里的this    只能   放在第一行。。你第一行已经放了this(name)了,怎么再放this(age)呢?

这个程序只是让你知道this的一种 用法,就是this()在构造函数里可就调用其它的构造函数
你看这里 System.out.println(name+"……"+age);这里输出的是结果是 lisi……30     虽然它调用了this(name),但并没有用到“haha”这个值噢!

作者: 张亚青    时间: 2013-3-12 23:52
本帖最后由 张亚青 于 2013-3-13 00:00 编辑

先声明三点:
1、构造函数是new创建对象时用来对象进行初始化,另外每次肯定只运行一个构造函数即可;
2、如果类中没有构造函数,那么系统会默认给这个类添加一个空参数的构造函数;
3、子类构造函数中,默认第一行会自动添加一句super()因为子类对象会继承父类的属性,可以直接访问父类中的数据,所以就先要看看父类是如何对这些数据进行初始化的;

【下面开始讨论本问题】
1、为什么this();和super();需要放在第一行呢?
  解答:super()需要放在第一行,用上面的第三点即可解释;
        this()为什么也要放在第一行呢,
           因为首先super()和this()不能同时存在,原因是this()本身是对另一个构造函数的调用,那么this()所调用的这个构造函数中就包含了一句super(),
                   如果this()和super()同时存在,就运行了两次super()造成了重复调用,也没有这个必要;
                  (更详细点:如果super()在前,连着调用两次super(),没有必要;
                    如果this()在前,先初始化子类对象,然后又调用父类方法初始化了该子类对象,显然不是我们要的结果)
               然后,既然this()中本身就包含了一个super(); 而super()又要放在第一行,那么理所应当,this()也要放在第一行。
2、为什么不能同时存在两个this()?
解答: 还是上面说的this()本身是对另一个构造函数的调用,那么this()所调用的这个构造函数中就包含了一个super(),如果同时调用两个this(),也就造成了super()的重复调用,过程会变成:
this()->this()  即: super() ->第一次子类初始化->super()->第二次子类初始化
显然这样的话第二次调用super()的时候,会使得第一次子类初始化失效,这显然不是我们想要的。
综上所述,不能同时存在两个this(),同理也不能同时存在两个super()。


补充说明:
1、你可能会问,那我想要分别调用两个构造函数,难道就不让实现了吗?
解答: 肯定让你实现,但是构造函数也是函数,是用来对象进行初始化的函数,如果你真的要调用另外两个构造函数内的方法,那把他们封装成方法然后分别调用即可。
何必非要弄两个构造函数来调用呢?
如下所示
  1. public class Demo
  2. {
  3.         private String name;
  4.         private int age;

  5.         Demo(String name)
  6.         {
  7.                 setName(name);
  8.         }
  9.         Demo(int age)
  10.         {
  11.                 setAge(age);
  12.         }
  13.                
  14.         Demo(String name,int age)
  15.         {
  16.                 setName(name); //你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的

  17.                  setAge(age);
  18.         }

  19.   public void setName(String name)
  20.         {

  21.           this.name=name;//此处必须指明你要引用成员变量

  22.   }

  23.   public void setAge(int age)
  24.         {
  25.                 this.age=age;

  26.   }
  27. }
复制代码
2、你可能会问:我建立的Person没有父类啊,我调用的this()中也就不存在super()了呀?
解答: 任何类都是Object类的子类,所以任何类都会有父类,也就会在构造函数中存在super()
附:至于说Object()是怎么初始化的,就不在我们讨论范围内了。





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