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的成员函数,但是他仍然是非静态函数呀!
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之后,由对象调用。
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();
}
}
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调用的。
t.f();也不是静态方法呀,为甚麽能在静态的main函数中调用?
追答如果不是静态方法的话,必须要指定方法的对象,如t。你在 静态方法中调用的都是静态的变量或静态的方法,如果不是,就要指定对象。这个地方对java初学者来说,容易出错。
还有一点需要申明的是,静态方法不能调用非静态的方法这句话有问题。是静态方法中不能直接调用非静态的方法。
我想知道为什么静态的main函数能调用非静态方法f(),虽然f()是t的成员函数,但是他仍然是非静态函数呀!
可是有的书上却说是使用前要赋初值,为什么?
追答意思就是在使用前必须是有值的 赋初值是第一次赋值。就是默认的值 这个值在程序后面是可以改的 就是赋值
这是赋值 不是使用
void f()
{
int a;
a=13;//这是对a进行赋值操作,在对a的声明之前,那这叫使用吗?
}
这不是使用 是赋值 这其实是一步 相当于 int a=13;
追问还有一个疑惑:“静态方法只能被调用静态方法或访问静态成员”这句话是对的吗?
追答静态方法和实例方法的区别:
静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。