黑马程序员技术交流社区

标题: 为什么this 不能使用在main()函数中???!!! [打印本页]

作者: 饶正林    时间: 2013-3-12 17:30
标题: 为什么this 不能使用在main()函数中???!!!
//在类D中定义的static int x,写出在类D的方法中使用x的三种不同形式:x,this.x,D.x;
//第一种情况
class D
{
static int x=2;
public static void main(String[] args)
{
  D d=new D();
  d.print();
}
void print()
{
  System.out.println(x);  
  System.out.println(this.x);
  System.out.println(D.x);
}
}

//第二种情况
class D
{
static int x=2;
public static void main(String[] args)
{
  System.out.println(x);  
  System.out.println(this.x);
  System.out.println(D.x);
}
}
我想问 为什么第二种情况不行,也就是 为什么this 不能使用在main()函数中???!!!

2013-03-12_172649.png (1.57 KB, 下载次数: 213)

第一种情况

第一种情况

2013-03-12_172759.png (1.89 KB, 下载次数: 187)

第二种情况

第二种情况

作者: 张卫刚    时间: 2013-3-12 17:42

//在类D中定义的static int x,写出在类D的方法中使用x的三种不同形式:x,this.x,D.x;
//第一种情况
class D
{
static int x=2;
public static void main(String[] args)
{
  D d=new D(); //1 这个你new对象了
  d.print();
}
void print()
{
  System.out.println(x);  
  System.out.println(this.x); 2 this就代表你new的对象d
  System.out.println(D.x);
}
}

//第二种情况
class D
{
static int x=2;
public static void main(String[] args)
{
  System.out.println(x);  
  System.out.println(this.x); //3 静态可以通过类名.成员访问,也可以通过对象.成员访问,this一般代表本类对象,你对象都没创建怎么访问,人可直直接输出x不完了
  System.out.println(D.x);
}
}
作者: 冷叙辰    时间: 2013-3-12 17:45
this的意思是指向本类对象,你这根本就没有对象啊,那让那个this指向谁啊
作者: 黄玉昆    时间: 2013-3-12 17:49
你没有发现x是静态修饰的吗?就像提示所说的一样,静态成员不能被非静态修饰。还可以从另一个角度想,就是静态是随着类的加载而存在于内存中的,是先于对象存在的,它不能被引用,因为被static修饰的并不知道后面会有这个对象,所以说无法从静态上下文中引用非静态成员。
作者: 饶正林    时间: 2013-3-12 17:53
//第二种情况
class D
{
        static int x=2;

        public static void main(String[] args)
        {
         D d=new D();//建立一个D对象       
         System.out.println(x);  
         System.out.println(this.x); //仍然用this
         System.out.println(D.x);
        }
}
可否这样:
如果用第二种情况,在main()中建个对象,再用this呢?仍然是错误的?

作者: 沉默de羔羊    时间: 2013-3-12 17:55
本帖最后由 沉默de羔羊 于 2013-3-12 17:59 编辑

其实这里你可以留心下,就可以看到,main方法有个static这个修饰词。

static修饰过的方法就是:静态方法。

静态方法没办法直接调用本类的非静态成员,你可以通过new一个当前类的对象,调用就不会出问题。

还有一点,就是java中规定过this只能在类中的非静态方法中使用。

作者: vmvm555    时间: 2013-3-12 18:58
我明白你什么意思了,为什么在第一种情况里能够使用this关键字,而第二种情况却不行,想要搞清楚用static修饰的变量是怎么加载进内存的
首先程序运行时,jvm中还没有任何对象,你运行哪个类,jvm就会自动去找那个类的main方法,因为main方法使用static修饰的,无需对象调用,一旦类加载进内存,就执行
main方法,你在main方法中调用this,this这个关键字代表当前对象,但是用static修饰的方法是属于类的,所以this这个关键字编译器无法知道你是要调用哪个对象,所以编译会报错,而第二种方式,你将this关键字放在了非静态方法上,非静态方法代表只有创建对象才能调用,所以使用this是完全合法的
作者: 张雪萍    时间: 2013-3-12 19:01
你的主函数用static修饰了,静态中不能出现this
作者: 黑马17期-闫东东    时间: 2013-3-12 21:00
static修饰的属性它属于这个类的所有对象所共享,它不在属性对象,也就是说static修饰的属性不在对象的堆内存中。static属性它是随着类的加载而加载的,优先于对象,
static方法内不能使用非static成员。错误: 无法从静态上下文中引用非静态 ,static方法内不能使用this super关键字
作者: Benwolf0818    时间: 2013-3-12 21:15
静态成员函数没有this。
作者: 移动小坦克    时间: 2013-3-12 21:54
是这样,静态是在类加载进内存的时候存在于方法区的,
所以不管有没有对象,静态都存在,
也就是说静态是优先于,对象存在的,
那么this,表示的是调用该函数的的对象,
所以静态方法不知道this表示的是哪个对象,因为对象还没生成,

作者: 曹睿翔    时间: 2013-3-12 23:00
星月之梦 发表于 2013-3-12 17:53
//第二种情况
class D
{

不行,编译期不通过




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