关于java的static我很晕
发布网友
发布时间:2022-04-30 21:29
我来回答
共5个回答
热心网友
时间:2023-10-14 10:44
首先你得理解什么是类属性和对象属性,加static修饰的属性是类属性的充分必要条件,因此不加static的属性就是对象属性。
那区别是什么呢?
静态变量分配空间是在程序开始运行的时候自动完成的,因此你可以使用类名直接访问,如:Math.PI。
非静态变量(对象变量)是在对象初始化以后才分配空间,以后才能使用。如:Test t = new T(); t.shuxing; 这个之后shuxing就有内存空间啦,你就可以访问了。
给你说说图片上的错误你就明白啦
1.22行错误时因为主方法里面访问的a是对象属性,此时a还没有分配空间,因此会有错误,只有new之后才能用对象访问它。但是23行就不会有错误啦,因为b是static的,此时已经有了内存空间
2.25行错误是因为在f_4()里面访问了非静态属相a,此时a还是没有分配空间,所以就出错啦,这也是楼主遇到的问题。
3.即使方法里面都是静态属性,也不可以直接调用,如:24行所示。这是Java的语法规定,可能是为了简化语法才这样做的。
热心网友
时间:2023-10-14 10:45
实例变量(instance variable):或叫实例域、实例字段(instance field),或叫成员变量(member variable)。实例的变量,每个实例的变量可能不同。
实例方法(instance method):或叫成员方法(member method)。供实例用的方法,必须要先有实例,才能通过此实例调用实例方法。
类变量(class variable):或叫静态域、静态字段(static field),或叫静态变量(static variable)。出现在这样的情况下:一个类的所有实例需要一个公有的属性,比如,一,统计实例个数;二,常量。类变量与类直接关联在一起。内存当中只有一个地方存放这个变量。任何实例都可以修改它的值(前提是它没有被final修饰符修饰,不然就是常量),但是,访问类变量并不需要实例,用类就可以操作了。
类方法(class method):跟类变量的基本特点一样。供类用的方法,可以没有实例,直接通过类来调用类方法。
从形式上看,类变量和类方法,比一般的变量和方法多了一个static修饰符。因为这个原因,类变量和类方法也被叫做静态变量和静态方法。
它们的使用方法:
实例方法可以直接访问实例变量,调用实例方法;
实例方法可以直接访问类变量,调用类方法。但不推荐这么做,原因是不清晰,容易把类变量误认为是实例变量,把类方法误认为是实例方法(借助IDE,它会给出警告信息。);
类方法可以直接调用类变量和类方法;
类方法不能直接调用实例变量和实例方法;
类方法里面不能使用“this”关键字,因为没有实例存在,“this”不知道引用哪个实例。
明白没,你的answer是实例方法,想不用staic也行,写个够造函数,来调用它。
热心网友
时间:2023-10-14 10:45
类的成员包括【成员属性】、【成员方法】,只有类的成员才可以用【static】标识,【static】标识后的成员可以使用【类名.成员名】的方式进行访问,即无需创建该类的对象,就可以访问,当然同样可以【对象名.成员名】的方式进行访问,但是这样是不建议的。
【静态的方法不能访问非静态的成员】,由于【静态方法】可以不通过创建对象而调用,而【非静态的成员属性】是在创建对象后为其分配空间的的,如果允许【静态方法】访问一个【非静态的成员属性】,那么就有这样的可能,【静态方法】去访问了一个【不存在的成员属性】,Java不允许这样的危险存在,所以【静态方法】不可以访问【非静态的成员属性】。同理,我们知道【非静态的成员方法】可以访问【非静态的成员属性】,如果【静态方法】可以访问【非静态的成员方法】的话,那么就可以间接访问【非静态的成员属性】,这样也是不允许的。
【静态的成员属性】是在类被加载时分配空间的,不需要【创建对象】,所以【静态的方法】只能访问【静态的成员属性】和【静态的成员方法】。
这就是你出错的原因,不知道你是否看懂了。
热心网友
时间:2023-10-14 10:46
跟switch和if没关系.
唔,静态方法的意思..
静态方法a如果要召唤方法b的话. b必须要是静态.
但如果a不是静态的话他就可以召唤b(不管b是不是静态的).
嗯,我只样说的话你可能觉得有一些方法就召唤不出来,因为main就必须是静态的...教你个方法...
// The "Test" class.
import java.awt.*;
public class Test
{
public static void main (String[] args)
{
testx x = new testx ();
// Place your program here. 'c' is the output console
} // main method
} // Test class
class testx
{
public testx ()
{
a ();
}
public static void b ()
{
System.out.println ("Test b");
}
public void a ()
{
System.out.println ("Test a");
b ();
}
}
你看,现在main就能召唤a出来了..而a就不是静态..
希望能帮助到你..
热心网友
时间:2023-10-14 10:46
我来告诉你吧。。哈哈
非静态的方法 比如 void test(int a)
有几个参数呢。。两个。。一个是int类型 一个就是调用这个方法的对象。。
在方法体内可以用this使用它。。这个对象是作为隐式参数传进这个方法的。。
所谓隐式参数就是可以不用写明的。。
比如你调用这个方法。。你需要一个对象去调用他。。调用的时候还需要传一个int类型的参数。。所以这个方法有两个参数。。
静态方法 比如static void test(int a)有几个参数呢。。只有一个int类型了。。因为静态方法不需要实例对象就能直接调用。。所以他的参数只有一个a。。所以你在里面不能使用this。因为他并没有将这个对象作为参数传进去。。
所以如果你在静态方法里调用了非静态方法的话。比如static void test(int a) {
test1(a);//test1是非静态方法
}
那么test1需要两个参数是吧。。现在有一个你给他了。。还有一个呢。。就是调用它的对象呢。。你并没有给他。。也没法给他。。因为静态方法里没有那个隐式参数。。
所以明白了吗。。静态变量也是一样了撒。