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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Java 类中的this 说是表示这个类的一个实例,但是这个实例是在什么创建的呢?是由谁来创建的呢?
为什么在静态方法中又不能用这个this了呢?
这个地方有点儿没搞明白,望大家指点一二。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

11 个回复

倒序浏览
这是我根据毕老师上课整理的笔记。
希望对你有帮助

关于this关键字
class person
{
private int age;
private String name;


public void setName(String name)
{
this.name = name;
}
}


this可以用于区分局部变量和成员变量。
this就代表本类的对象,到底代表哪一个呢?
this代表它所在函数所属对象的引用。
简单说:哪个对象在调用this所在的函数,this就代表哪个对象。


this的应用:当定义类中功能,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。但凡本类功能内部使用本类对象都用this。
class person
{
private int age;
private String name;

public void setName(String name)
{
this.name = name;
}

public boolean compare(Person p)
{
    return this.age == p.age;
}
}

this用于构造函数之间进行互相调用时.
构造函数间的调用只能用this,传入对应参数即可。
构造函数里的this必须放在第一行,因为初始化动作要先执行。
class Person
{
private int age;
private String name;

Person(int age)
{
this.age = age;
}

Person(String name,int age)
{
this(age);
this.name = name;
}
}


防止this的死循环调用,递归构造函数调用
class Person
{
private String name;
private int age;

Person()
{
this("haha");
}
Person(String name)
{
this();
this.name = name;
}

public static void main(String[] args)
{
Person p = new Person("show");

}
}

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
给你简洁的说一下!
1:this关键字是在方法中的(方法的调用需要类或者对象),那个对象调用这个方法,这个this就代表哪个对象。所以说不是谁创建的,而是说this代表调用该方法的对象。
2:静态方法里面不能用this,因为静态方法是在类加载的时候就已经存在了,但是类加载了,但是对象还没有创建(类早于对象加载),而this又代表对象,方法不能调用一个还没有创建的对象。所以静态方法不能使用this关键字。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
你看啊,
如果你声明一个方法,是比较两个对象的属性信息是否相等
public boolean com(Perosn p)
{return this.age==p.age;}
而接收参数只有一个,那么另一个对象呢?
另一个对象就是this代表的,
哪个对象调用了此方法:
例如  p1.com(p2);
那么this代表的就是P1.

若为静态方法,此方法在类加载时就已经存在于内存,
而this是代表实例对象需要被创建,
晚于静态方法的存在,
所以会报错.

this代表的就是哪个对象.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 易伟 于 2012-2-5 12:09 编辑

楼主,首先你要明白的是:this是依赖于对象的,没有对象就用不到this。
给你举个简单的例子:假如你是男人,并且没有儿子,这样你就不能跟别人说:我儿子怎么怎么的,你不能用我儿子这个词,因为你确实没有儿子;可是当你有儿子了,你就可以跟别人自豪的说:我儿子怎么怎么优秀啊帅气啊等等。其中,“儿子”就是相当于对象,“我儿子”就相当于this,也就是代表儿子这个对象。
实例是new创建出来的,如Person p  =  new person();这样就创建了person类的一个实例。至于怎么生儿子?呵呵 你懂的。。。
静态方法中不能有this是因为静态方法可以不通过对象直接用类来调用,就是一个类没有对象也可以使用静态方法,但是this是必须存在对象才能用的。所以静态方法中不能用到this,有就矛盾了。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 有点意思

查看全部评分

回复 使用道具 举报
1,this关键字只能在方法中使用,表示“调用方法的那个对象”。this是一个引用,
  1. public class Person {
  2.         private String name;
  3.         public String getName() {
  4.                 return name;
  5.         }
  6.         public void setName(String name) {
  7.                 this.name = name;
  8.         }
  9. }
复制代码
当你创建了Person对象并且调用了setName方法,
Person p = new Person();
p.setName("张三");
这时的this就相当于p,指向的是同一个对象。
2,静态方法存储在方法区中,而对象是存储在栈内存中,当对象还没有创建的时候
静态方法已经存在了,这时候this引用的对象还不存在,所以会报错

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
王_涛 黑马帝 2012-2-5 14:28:53
7#
1.这个实例是在什么创建的呢?
答:这个实例是在new时创建的。

2.是由谁来创建的呢?
答:是由调用该类对象的程序来创建的。

3.为什么在静态方法中又不能用这个this了呢?
答:this指的是当前对象的引用;
在类第一次被加载时,静态方法就被加载到静态方法区中,此时该类并没有new对象,this不存在。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
我就根据视频中毕老师的讲解简单的解释一下:
class Person{
   String name;
   Static String country="cn";
  public void show(){
      System.out.println("name="+name);
}
public class PersonDemo{
      public static void main(String[] args){
           Person p= new Person();
     }
}
}
/*实例是由用户根据自己或者其他要求创建的。比如,这里建立一个Person对象或者可以说新建某个人出来。
静态方法中不能使用this的原因。
当实例化对象时,类会对成员变量首先进行默认初始化,接着进行显示初始化(即原有赋初值的显示)。
在某些函数中会对成员变量再次赋值,如果使用了static修饰后根据其优先性,被static修饰的函数先对
某些变量进行了赋值,然后才是对象实例化的显示。(相当于覆盖了自己想要的赋值)
*/

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
this指的是本对象,当前编写的类实例化后所产生的对象。
你想在main函数中使用this?那this就指的是main函数所在的java5的一个对象了,显然不对,而且main函数是static(静态)的,静态方法中不能用this。
你一定要用this.talk()?  
那就在person类中将say方法的定义改成:
public void say()
{
this.talk();;
}
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
通过下面的一个程序来说明this的三种用法:

package test;
public class ThisTest {
private int i=0;

    //第一个构造器:有一个int型形参
    ThisTest(int i){
       this.i=i+1;//此时this表示引用成员变量i,而非函数参数i
       System.out.println("Int constructor i——this.i:  "+i+"——"+this.i);
       System.out.println("i-1:"+(i-1)+"this.i+1:"+(this.i+1));
       //从两个输出结果充分证明了i和this.i是不一样的!
}

    //  第二个构造器:有一个String型形参
    ThisTest(String s){
       System.out.println("String constructor:  "+s);
    }
    //  第三个构造器:有一个int型形参和一个String型形参
    ThisTest(int i,String s){
       this(s);//this调用第二个构造器
       //this(i);
       /*此处不能用,因为其他任何方法都不能调用构造器,只有构造方法能调用他。
       但是必须注意:就算是构造方法调用构造器,也必须为于其第一行,构造方法也只能调

       用一个且仅一次构造器!*/

       this.i=i++;//this以引用该类的成员变量

       System.out.println("Int constructor:  "+i+"\n"+"String constructor:  "+s);

    }

    public ThisTest increment(){

       this.i++;

       return this;//返回的是当前的对象,该对象属于(ThisTest)

    }

    public static void main(String[] args){

       ThisTest tt0=new ThisTest(10);

       ThisTest tt1=new ThisTest("ok");

       ThisTest tt2=new ThisTest(20,"ok again!");

      

       System.out.println(tt0.increment().increment().increment().i);

       //tt0.increment()返回一个在tt0基础上i++的ThisTest对象,

       //接着又返回在上面返回的对象基础上i++的ThisTest对象!

    }

}



运行结果:



Int constructor i——this.i:  10——11

String constructor:  ok

String constructor:  ok again!

Int constructor:  21

String constructor:  ok again!

总结一下,其实this主要要三种用法:

1、表示对当前对象的引用!

2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。

3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
刘峰 黑马帝 2012-2-5 19:55:17
11#
this是指本类对象一个引用。当new一个对象是,对象本身就有一个this引用,它指向自身。this引用是用来区分局部变量和成员变量,这只是它的一种用法。当一个方法被static修饰时 ,这个方法就属于类。而不属于对象。非static的方法是属于某个对象的方法。在静态方法中不能用this,因为this是指向一个对象,而静态方法属于类,随着类的消失而消失。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黄凯 黑马帝 2012-2-6 20:41:30
12#
本帖最后由 黄凯 于 2012-2-6 20:41 编辑

哪个对象引用了这个方法,这个方法里的this就表代哪个对象。
例如:对象A,使用了方法B(),而B()方法里有个this关键字,那么这个this就代表了对象A。
这是最常见的,如果想了解更多,推荐你好好去看一下毕向东老师的Java基础教学视频里的面向对象那部分。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马