黑马程序员技术交流社区
标题:
静态变量是先于对象存在的,这句话是什么意思
[打印本页]
作者:
大奔
时间:
2015-2-28 23:13
标题:
静态变量是先于对象存在的,这句话是什么意思
class person
{
String name;//实例变量
static String country="cn";//类变量
public static void show()
{
System.out.println(name+" "+country);
}
}
class personDemo5
{
public static void main(String args[])
{
//person p=new person();
//p.name="zhangsan";
//p.show();
System.out.println(person.country);//先于对象存在,随着类的加载而存在
person.show(); //可以直接用类名来调用 被所以对象所共享 存在于方法区中
}
}
作者:
奋斗小青年
时间:
2015-3-1 09:41
所谓的静态变量优先于对象存在,是说当你的类被加载到内存中时,被static修饰的变量也会随着类的加载而加载到内存中,而这个类的对象此时并没有出现,只有当你申明并实例化这个类的变量时,才会在内存中开辟空间存放该类的对象,所以当类加载后,可以直接调用类名.变量名直接调用,因为其在内存中已经存在,而对象暂时还没有。
所以你写的代码有两个个问题。
1.就是Person类中show函数是静态的,随类加载而加载,此时并没有该类对象,所以你是无法调用类中非静态成员name的。
2.主函数中直接用类名调用没有问题的,但是对非静态变量的调用会导致编译失败。
class person
{
/**
* static方法只能调用静态变量,所以name必须要被static所修饰
*/
static String name;//实例变量
static String country="cn";//类变量
public static void show()
{
System.out.println(name+" "+country);
}
}
class personDemo5
{
public static void main(String args[])
{
//person p=new person();
//p.name="zhangsan";
//p.show();
System.out.println(person.country);//先于对象存在,随着类的加载而存在
person.show(); //可以直接用类名来调用 被所以对象所共享 存在于方法区中
}
}
复制代码
作者:
aawenwei
时间:
2015-3-1 16:48
一楼正解, 要么你把 name 属性也静态下, 要么你就只能创建对象来调.show() 方法来获取那name属性
作者:
lwenz
时间:
2015-3-1 22:49
楼上讲的很详细,在没有实例化前就直接调用类的静态变量和函数,能有打印值就是说明静态变量先于实例化后的对象加载到内存中
作者:
qq563426478
时间:
2015-3-2 08:54
二楼高手
作者:
埗箬
时间:
2015-3-2 09:42
你的show方法是静态方法,那么他调用的成员就必须得是静态的,否则,函数抛出异常。其次,需要强调的是,类的权限:public->default-还可以用static , final修饰,作用不同,不可使用 private 和 protected
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2