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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天回答问题的时候突然发现个问题。问题就如题了哈!
为什么在调用构造函数时使用的this而不能用类名啊??

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

12 个回复

正序浏览
this代表当前对象的引用。使用的时候,谁调用方法,this就代表谁。
用于局部变量隐藏成员变量,写功能的时候,可能用到this.
构造函数中使用this,如果此类继承了其他类,在此类加载的同时,构造函数会默认的去找父类构造函数,加上this()就是手动指定本类构造函数;并且这个this()必须在程序的第一行;
回复 使用道具 举报
看了各种答案,我就一个晕啊,不过总算想起来了,这个问题老师说过,不过其实我也忘记了,查了半天才想想起来。
简单的说下:
this指代的是本类中的对象,而这里的对象指的是本类new出来的对象。
举例:有一个Person类,那么this引用的时候指的是Person p=new Person();里面的p,也就是说这里this=p------this()=p();

注意这里的this指代的是“对象”---->p,(如果楼主的意思是Person(),,没有new就没有产生对象,没有产生对象,这样的调用有什么意义呢)   所以如果你直接使用类名的

话,就必须new Person()这样的形式,这就意味着你每次使用这个构造方法的时候,会重新再产生一个对象,你就不能把属性赋给到你自己生成的对象 。
希望我的回答还算满意!
回复 使用道具 举报
上面的没发表完,看下面
回复 使用道具 举报
看了各种答案,我就一个晕啊,不过总算想起来了,这个问题老师说过,不过其实我也忘记了,查了半天才想想起来。
简单的说下:
this指代的是本类中的对象,而这里的对象指的是本类new出来的对象。举例:有一个Person类,那么this引用的时候指的是Person p=new Person();里面的p,也就是说这里this=p------this()=p();注意这里的this指代的是“对象”---->p,(如果楼主的意思是Person(),没有产生对象,这样的调用有什么意义呢)所以如果你直接使用类名的话,就必须new Person()这样的形式,这就意味着你每次使用这个构造方法的时候,会重新再产生一个对象,也就是说不再
回复 使用道具 举报
李啸 中级黑马 2012-5-10 22:01:00
9#
用类名点构造函数说明那个构造函数是静态的 那么你见过静态的构造吗
this关键字代表当前对象
回复 使用道具 举报
也可以这样理解:
如果在当前类的内部调用当前类的构造方法,就必须这样this(参数列表);规定放在构造方法的第一行上。
new ClassName(参数列表);是用来构造对象的。
回复 使用道具 举报
在一个Java类中,其方法可以分为成员方法和构造方法两种。构造方法是一个与类同名的方法, 在Java类中必须存在一个构造方法。如果在代码中没有显示的体现构造方法的话,那么编译器在编译的时 候会自动添加一个没有形式参数的构造方法。这个构造方法跟普通的成员方法还是有很多不同的地方。如 构造方法的话一律是没有返回值的。而且也不用void关键字来说明这个构造方法没有返回值。而普通的方 法可以有返回值、也可以没有返回值,程序员可以根据自己的需要来定义。不过如果普通的方法没有返回 值的话,那么一定要在方法定义的时候采用void关键字来进行说明。其次构造方法的名字有严格的要求, 即必须与类的名字相同。也就是说,Java编译器发现有个方法与类的名字相同才把其当作构造方法来对待 。而对于普通方法的话,则要求不能够与类的名字相同,而且多个成员方法不能够采用相同的名字。在一 个类中可以存在多个构造方法,这些构造方法都采用相同的名字。只是形式参数不同。Java语言就凭用户 参数的参数来判断调用那个构造方法。
this关键字除了可以调用成员变量之外,还可以调用构造方 法。如下面的代码:

public class Student{ //定义一个类,类的名字为student

    public Student(){ //定义一个方法,名字与类相同故为构造方法  

    this(“luobo”)  }  

public Student(String name){ //定义一个带形式参数的构造方法  

  }  
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主的意思我怎么看懂
分两种情况讲吧,首先在构造函数里面的this
class Clerk {
        public Clerk(String name, int num, float sal) {
                this.name = name;// 名字
                this.num = num;// 员工号
                this.sal = sal;// 薪水
        }

this是指代当前对象,当你new的时候,this就指代你当前的这个对象。但是要注意this不能在静态方法中使用,this方便了程序的书写,也增加了程序可读性。
另外一种情况:
构造函数是不需要你去调用的,在你创建对象的时候jvm会自动的去调用它,但是还是有这么几种情况可以去调用的
对构造函数的调用可以通过反射来实现,或者是下面这种情况
  1. public class Test {

  2. [/color]       
  3.         public static void main(String[] args) {
  4.                 new Son();
  5.         }

  6. }



  7. class Person{

  8.         public Person(){
  9.                
  10.                 System.out.println("aaa");
  11.         }
  12.         public Person(int x){
  13.                 this();
  14.                 System.out.println("bbb");
  15.         }
  16. }

  17. class Son extends Person{
  18.         Son(){
  19.                 super(1);
  20.         }
  21. }
复制代码
这断代码就可以看出子类一般会自动调用父类的,但是如果在带参数的构造函数里面写上this();就可以通过在子类里面super(x);....x是参数,来调用父类的构造函数

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
this 指向的是 new 出来的对象的地址 而 类名.属性调用的是静态属性
  1. package com.cn;

  2. public class ThisDemo {
  3.        
  4.         int age;
  5.        
  6.         public ThisDemo(int age,String s){
  7.                 this.age=age;
  8.                 System.out.println(ThisDemo.this);//输出 com.cn.ThisDemo@de6ced
  9.                 System.out.println(this);//输出 com.cn.ThisDemo@de6ced
  10.         }
  11.        
  12.         public static void main(String[] args){
  13.                 ThisDemo t = new ThisDemo(2,"s");
  14.                 System.out.println(t);//输出 com.cn.ThisDemo@de6ced
  15.                 }
  16. }
复制代码
this 地址的来源于new

你可以通过这个代码发现  三个输出地址的内容是一样的
用类名的就静态变量和方法
回复 使用道具 举报
构造方法是在产生对象时被java系统自动调用的,我们不能在程序中像调用其他方法一样去调用构造方法(必须通过关键词new自动调用它)。但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。例如:     
public class Person{
        String name;
        int age;
        public Person(String name){
            this.name = name;
        }
        public Person(String name,int age){
            this(name);
            this.age = age;
        }
    }

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
不是太明白楼主的问题
构造函数名它是与类名同名的,一般对事物进行描述时而该事物具备一些特有属性时,使用构造函数,因为对象已建立这些属性就被赋给对象。
楼主说的是不是在构造函数中为什么用类似this.name=name;的语句,如果是,那原因是这样的
如果不用this关键字,也就是name=name;也就相当于局部变量赋给局部变量,当在主函数中为对象初始化时,你赋予的name属性值,确实传给了构造函数的name,但是它就不会将其赋予给构造函数中的name,而加上this后,哪一个对象调用,this就等于那个对象。相应代码也就不贴了,楼主应该明白的。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马