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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如果我在测试类的方法中定义一个静态方法,然后在方法里创建一个对象.然后调用实体类的非静态变量呢?
[Java] 纯文本查看 复制代码
class Demo8_Demoo {
	public static void main(String[] args) {
		print2();
	}
		public static void print2() {	//静态成员方法
			Demoo ddd = new Demoo();
			//ddd.num1 = 200;
			System.out.println(ddd.num1);//输出非静态成员方法	//为什么this不能用,但是ddd可以用?			
			
		}	
}

class Demoo {
	int num1 = 10;					//非静态成员变量		
}

纠结到最后我自己都晕了,还请大神们给分析分析

16 个回复

正序浏览
静态方法中不可以出现this,super关键字
回复 使用道具 举报
总结一下,this代表当前对象的引用.
静态方法中不能出现this关键字...谢谢各位大神的不吝赐教!
回复 使用道具 举报
你就记住静态方法中不可以出现this,super关键字
回复 使用道具 举报 1 0
jingyarufeng 发表于 2016-8-2 00:27
[mw_shl_code=java,true]class Demo8_Demoo {
        static int num1 = 12;
        public static void main(String[ ...

是不是因为 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。静态方法在优先于对象存在,所以静态方法中不可以出现this.所以上面的代码虽然this代表了当前类当前对象的引用,但是为了避免上述错误,还是不可以用呢?
回复 使用道具 举报
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

[Java] 纯文本查看 复制代码
class Demo8_Demoo {
	static int num1 = 12;
	public static void main(String[] args) {
		//static int num1 = 12;
		print2();
	}
	//static int num1 = 12;
		public static void print2() {
			
			//静态成员方法
			//Demoo ddd = new Demoo();
			//ddd.num1 = 200;
			Demo8_Demoo dddd = new Demo8_Demoo();
			System.out.println(dddd.num1);	//这里还是不能用this,为啥?			
			
		}	
}
回复 使用道具 举报
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

this 也明白了,应该是代表的是当前类的当前对象的引用,应该是用Demo8_Demoo 创建出来的对象,例如Demo8_Demoo ddd = new Demo8_Demoo(); 而 Demoo ddd = new Demoo();  对象ddd是 Demoo类的对象,所以不能在 Demo8_Demoo使用.不知道我是不是可以这样理解呢
回复 使用道具 举报
mingyeing 发表于 2016-8-1 23:27
静态方法不能访问非静态成员,是值在方法中调用本类的非静态成员是不可以的。另外,我那个关于内存的解释 ...

内存中的解释我懂,我们导师也给我们画图说明了,意思就是类先加载,而对象不知道有没有创建,所以,静态方法不可以调用非静态变量.我现在明白了.是在本类中.本类中.谢谢大神的热心解答昂.
回复 使用道具 举报
jingyarufeng 发表于 2016-8-1 23:00
但是,我这样写不也成了静态方法调用了静态变量么...

静态方法不能访问非静态成员,是值在方法中调用本类的非静态成员是不可以的。另外,我那个关于内存的解释不知道你看了没有。看懂了,应该就好理解了一些。
回复 使用道具 举报
jingyarufeng 发表于 2016-8-1 23:13
那我要是先创建一个对象,再调用静态方法呢.

有了对象直接拿对象调呗~~~这个时候this又代表不了你创建的对象~
回复 使用道具 举报
yuxing 发表于 2016-8-1 23:10
静态中当然不能用this,this代表对象的引用,而静态的是先于对象的~~

那我要是先创建一个对象,再调用静态方法呢.
回复 使用道具 举报
静态中当然不能用this,this代表对象的引用,而静态的是先于对象的~~
回复 使用道具 举报
本帖最后由 jingyarufeng 于 2016-8-1 23:11 编辑
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

其实说的是在方法中,不能直接调用本类的成员变量和成员方法。
是不是因为我这个是在不同的类中,所以可以调用了 .今天老师讲到这,我就是在想,如果我们在调用之前,提前给他创建一个对象,这样,非静态成员变量也会被创建了出来,这样,我们是否就可以在静态方法中调用这个静态变量了呢!


回复 使用道具 举报
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

但是,我这样写不也成了静态方法调用了静态变量么...
回复 使用道具 举报
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变量和成员方法。
其实这一点很好理解,当我们创建一个对象的时候非静态成员存储在堆内存中, 静态成员存储在方法区中,也叫静态区中。非静态成员随着对象的创建而创建,静态成员随着类的加载而加载。如果你在一个静态方法中,调用了一个非静态的成员变量。那么,我们知道静态方法可以不创建对象,直接同过类名调用,那么,当我们在另一个类中通过类名直接调用这个静态方法的时候,他的非静态的成员变量就并没有创建出来,这样就不行了。
而关于你这道题,this为什么不能用,因为this代表的当前对象的引用,代表的是Demo8_Demoo 这个类创建的对象的引用,与Demo类无关!
回复 使用道具 举报
你需要记住,this代表一个对象,如果在demo8里边用this,代表的就是demo8的对象,但是你需要访问的是deno的成员变量
回复 使用道具 举报
是不是我概念没搞明白...还是怎么的..求大神
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马