黑马程序员技术交流社区

标题: 静态变量是先于对象存在的,这句话是什么意思 [打印本页]

作者: 大奔    时间: 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.主函数中直接用类名调用没有问题的,但是对非静态变量的调用会导致编译失败。

  1. class person
  2. {
  3.                 /**
  4.                  * static方法只能调用静态变量,所以name必须要被static所修饰
  5.                  */
  6.         static String  name;//实例变量
  7.         static String country="cn";//类变量
  8.         public static void show()
  9.         {
  10.              System.out.println(name+"     "+country);
  11.         }


  12. }
  13. class personDemo5
  14. {

  15.         public static void  main(String args[])
  16.         {
  17.                 //person p=new person();
  18.                 //p.name="zhangsan";
  19.                 //p.show();
  20.                 System.out.println(person.country);//先于对象存在,随着类的加载而存在
  21.                 person.show();                                   //可以直接用类名来调用  被所以对象所共享 存在于方法区中

  22.         }
  23. }
复制代码

作者: 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