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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//在类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, 下载次数: 210)

第一种情况

第一种情况

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

第二种情况

第二种情况

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览

//在类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);
}
}
回复 使用道具 举报
this的意思是指向本类对象,你这根本就没有对象啊,那让那个this指向谁啊
回复 使用道具 举报
你没有发现x是静态修饰的吗?就像提示所说的一样,静态成员不能被非静态修饰。还可以从另一个角度想,就是静态是随着类的加载而存在于内存中的,是先于对象存在的,它不能被引用,因为被static修饰的并不知道后面会有这个对象,所以说无法从静态上下文中引用非静态成员。
回复 使用道具 举报
//第二种情况
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:59 编辑

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

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

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

还有一点,就是java中规定过this只能在类中的非静态方法中使用。
回复 使用道具 举报
我明白你什么意思了,为什么在第一种情况里能够使用this关键字,而第二种情况却不行,想要搞清楚用static修饰的变量是怎么加载进内存的
首先程序运行时,jvm中还没有任何对象,你运行哪个类,jvm就会自动去找那个类的main方法,因为main方法使用static修饰的,无需对象调用,一旦类加载进内存,就执行
main方法,你在main方法中调用this,this这个关键字代表当前对象,但是用static修饰的方法是属于类的,所以this这个关键字编译器无法知道你是要调用哪个对象,所以编译会报错,而第二种方式,你将this关键字放在了非静态方法上,非静态方法代表只有创建对象才能调用,所以使用this是完全合法的
回复 使用道具 举报
你的主函数用static修饰了,静态中不能出现this
回复 使用道具 举报
static修饰的属性它属于这个类的所有对象所共享,它不在属性对象,也就是说static修饰的属性不在对象的堆内存中。static属性它是随着类的加载而加载的,优先于对象,
static方法内不能使用非static成员。错误: 无法从静态上下文中引用非静态 ,static方法内不能使用this super关键字
回复 使用道具 举报
静态成员函数没有this。
回复 使用道具 举报
是这样,静态是在类加载进内存的时候存在于方法区的,
所以不管有没有对象,静态都存在,
也就是说静态是优先于,对象存在的,
那么this,表示的是调用该函数的的对象,
所以静态方法不知道this表示的是哪个对象,因为对象还没生成,
回复 使用道具 举报
星月之梦 发表于 2013-3-12 17:53
//第二种情况
class D
{

不行,编译期不通过
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马