(1)java局部变量在使用前“必须声明并赋初值”,还是“必须声明并赋过值”?,(2)“使用”是什么意思?

class Test
{
int a=3;
void f(){ }
public static void main(String []args)
{
Test t=new Test();
t.f():
System.out.println(t.a);}
}

我想知道为什么静态的main函数能调用非静态方法f(),虽然f()是t的成员函数,但是他仍然是非静态函数呀!

java局部变量在使用前必须声明并赋过值,使用就是对这个变量进行除了赋值之外的操作,如将其赋给别的变量,调用其成员方法等。
void f()
{
Integer a;
a=13;//这是对a进行赋值操作,不叫使用,使用是对这个变量进行除了赋值之外的操作,如将其赋给别的变量,调用其成员方法等。
比如 :
int b=a;
a.getInt();
等属于使用。
}

静态方法只能调用静态方法或访问静态成员,把那个被去掉。追问

a.getInt();//a只不过是个基本类型的变量,又不是对象类型,怎能调用方法getInt()呢?

追答

a我改成Integer类型了...只是为了给你举个使用的例子。

追问

class Test
{
int a=3;
void f(){ }
public static void main(String []args)
{
Test t=new Test();

System.out.println(a);//对吗?
System.out.println(t.a);//对吗?那个能正确输出?
t.f();
}
}
上面两个输出,哪个能正确输出?
还有t.f();改为f();可以吗?

追答

都能正确输出 t.f();改为f(); 就错了 因为f();是局部方法,无法在静态方法里被调用。

追问

(1)为什么局部方法,无法在静态方法里被调用?
(2)t.f();也不是静态方法呀,为甚麽能在静态的main函数中调用?

追答

t是main方法里的变量,调用变量的方法当然是可以的。
静态方法不需要实例化也就是new就能调用,而普通成员只能被new之后,由对象调用。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-19
(1)必须声明并赋过值。
(2)调用变量名用其值做任何操作包括打印输出,变量赋值计算等操作。追问

void f()
{
int a;
a=13;//这是对a进行赋值操作,那这叫不叫使用呢?
}

追答

这叫赋值,使用是a在等号右边。

追问

还有一个疑惑:“静态方法只能被调用静态方法或访问静态成员”这句话是对的吗?

追答

静态方法只能被“静态方法调用”或访问静态成员,这么说对。

追问

class Test
{
int a=3;
void f(){ }
public static void main(String []args)
{
Test t=new Test();

System.out.println(a);//对吗?
System.out.println(t.a);//对吗?那个能正确输出?
t.f();
}
}
上面两个输出,哪个能正确输出?
还有t.f();改为f();可以吗?

追答

class StaticTest
{
int a = 3;

void f()
{
}

public static void main(String[] args)
{
StaticTest t = new StaticTest();

//System.out.println(a);// 对吗?不对,a得用static修饰。static int a = 3;
System.out.println(t.a);// 对吗?那个能正确输出?这个正确。
t.f();//不能改成f();
}
}

第2个回答  2013-07-19
(1)其实他们都是正确的,只是后者更为直观更易理解,而前者的说法更为标准、规范他们都是说明java中局部变量在被使用之前需要赋给它一个值,它才能被使用。不然编译的时候会出错的。
(2)使用就是将变量在某种方法里面的运用。
a=13不是使用,java中局部变量要声明并赋初始值,所以a=13只是给变量赋值还没被使用。追问

class Test
{
int a=3;
void f(){ }
public static void main(String []args)
{
Test t=new Test();

System.out.println(a);//对吗?
System.out.println(t.a);//对吗?那个能正确输出?
t.f();
}
}
上面两个输出,哪个能正确输出?
还有t.f();改为f();可以吗?

追答

(1)第二个可以正确输出
(2)不可以
你看啊,它是通过Test类创建的一个对象t(也就是一个实例)再用这个对象t调用的。

第3个回答  2013-07-19
在JDK1.5之后可以不用给数据赋值,它有默认值,但为了开发方便,建议给出。

System.out.println(t.a);输出是正确的,结果为3

System.out.println(a)犯了一个错误,静态方法中只能用静态变量,而a不是静态的追问

t.f();也不是静态方法呀,为甚麽能在静态的main函数中调用?

追答

如果不是静态方法的话,必须要指定方法的对象,如t。你在 静态方法中调用的都是静态的变量或静态的方法,如果不是,就要指定对象。这个地方对java初学者来说,容易出错。

还有一点需要申明的是,静态方法不能调用非静态的方法这句话有问题。是静态方法中不能直接调用非静态的方法。

追问

我想知道为什么静态的main函数能调用非静态方法f(),虽然f()是t的成员函数,但是他仍然是非静态函数呀!

第4个回答  2013-07-19
1 必须声明并赋过值
2 使用就是你代码中除了声明的地方 还有其他的地方出现过它追问

可是有的书上却说是使用前要赋初值,为什么?

追答

意思就是在使用前必须是有值的 赋初值是第一次赋值。就是默认的值 这个值在程序后面是可以改的 就是赋值

这是赋值 不是使用

追问

void f()
{
int a;
a=13;//这是对a进行赋值操作,在对a的声明之前,那这叫使用吗?
}

追答

这不是使用 是赋值 这其实是一步 相当于 int a=13;

追问

还有一个疑惑:“静态方法只能被调用静态方法或访问静态成员”这句话是对的吗?

追答

静态方法和实例方法的区别:
静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。