A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© haozi050 中级黑马   /  2014-1-18 19:14  /  2003 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

创建一个对象的流程:
1,加载指定的字节码文件进内存。
2,通过new在堆内存中开辟空间。分配首地址值。
3,对对象中的属性进行默认初始化。
4,调用与之对应的构造函数。构造函数压栈。
5,构造函数中执行隐式的语句super()访问父类中的构造函数。
6,对属性进行显示初始化。
7,调用类中的构造代码块。
8,执行构造函数中自定义的初始化代码。
9,初始化完毕,将地址赋值给指定的引用。
问题:5-8步是创建对象调用构造函数时才执行的,假设Person类中有属性country:public static String country=“CN”;如果不创建对象,直接用类名调用该country是可以的,那么这个country属性是随Person类的加载就赋值了呢,还是在执行第6步显示初始化才赋值的???另外,静态成员变量有默认值吗?

6 个回复

倒序浏览
随Person类的加载就赋值,
静态成员变量我记得有默认值的吧
回复 使用道具 举报

静态变量在定义的时候就已经初始化了 如果没有赋值 那就是默认值 int的话就是0 对象就是null
初始化:如果不显式初始化,那么将被隐式初始化为0
静态变量是属于类本身的 不属于具体的某一个对象 所有类的静态变量是随着类的加载而加载
回复 使用道具 举报
public static String country=“CN”是静态的
初始化时:
优先级:静态初始化>默认初始化>显示初始化>构造代码块初始化>构造函数初始化
所以public static String country=“CN”是随着类的加载而加载的
静态变量有默认值的,默认值为0;
例子

class Test1
{
        public static int a;
        void show()
        {
            System.out.println(a);
        }
}
public class Test
{

        /**
         * @param args
         */
        public static void main(String[] args)
        {
               
       Test1 h =new Test1();
       h.show();
        }

}//输出默认值为0
回复 使用道具 举报
静态成员是类成员,意思就是只要类加载,静态成员就存在于方法区中,先于对象存在,静态成员有默认值为0
回复 使用道具 举报
其实这点只需要理解static就行了,static的知识点
特点:
①:随着类的加载而加载
②:优先于对象的存在
③:被所有对象所共享
④:可直接被类名调用
没有用static修饰的字段或方法,属于对象的-----实例成员(方法)
用static修饰的字段或方法,属于类的          ------类成员(方法)
调用:
如果是没有static修饰的实例成员(方法),只能通过对象调用·即 对象.字段(方法);
如果是有static修饰的类成员(方法),可以通过对象来调用,即 对象.字段(方法)
      也可以通过类来调用,即 类名.字段(方法)
                     但是建议使用 类.字段(方法)来调用,因为在底层,对象调用类成员也转换为类调用成员
在JVM中,专门有一块区域,静态区域,来存储 类成员或方法(所以,当当一个对象修改了其中的另类成员的话,另外一个对象再次调用时,调用的是修改过后的值)
静态方法中只能访问静态成员,但非静态方法中可访问静态成员
静态方法中不能存在this,super关键字,原因是那几个关键字和对象有关的

第二个问题是静态成员变量,
只要是成员变量都是有默认的初始值得
成员变量都有默认值:整数类型默认都是 0 ;小数默认是0.0 ;布尔类型默认 false ;引用类型默认   null ;char默认 ‘\u0000’;

希望我的解释对你有所帮助
回复 使用道具 举报
  1. package itHeima.RUXUE1;

  2. public class Test13 {
  3.         public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
  4.                 //把用new创建对象的方式拆开写
  5.                 ClassLoader c = ObjectTest.class.getClassLoader();      //获取类加载器
  6.                 Class<?> clazz = c.loadClass("itHeima.RUXUE1.ObjectTest");      //读取字节码文件,并返回字节码对象
  7.                 ObjectTest obj = (ObjectTest) clazz.newInstance();           //通过反射调用无参构造器创建对象
  8.                
  9.         }
  10. }
  11. class ObjectTest{
  12.         int i;           //只要是成员字段,都有默认初始值,无论是否为静态
  13.         static int b;
  14.         static{
  15.                 System.out.println("静态代码块,类初始化  " +b);   //1、对静态字段进行默认初始化
  16.         }
  17.         {
  18.                 System.out.println("构造代码块,对象初始化"+i+" "+b);  //2、对成员字段进行默认初始化
  19.         }
  20.         ObjectTest(){
  21.                 System.out.println("无参构造器");
  22.         }
  23.         ObjectTest(int i,int b){               //3、用构造器对成员字段进行显式初始化
  24.                 this.i = i;
  25.                 this.b = b;
  26.                 System.out.println("有参构造器  "+this.i+" "+this.b);
  27.         }
  28. }
复制代码

上面这个例子是我的一个总结,希望对楼主有帮助。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马