黑马程序员技术交流社区
标题:
关于类中静态成员问题
[打印本页]
作者:
haozi050
时间:
2014-1-18 19:14
标题:
关于类中静态成员问题
创建一个对象的流程:
1,加载指定的字节码文件进内存。
2,通过new在堆内存中开辟空间。分配首地址值。
3,对对象中的属性进行默认初始化。
4,调用与之对应的构造函数。构造函数压栈。
5,构造函数中执行隐式的语句super()访问父类中的构造函数。
6,对属性进行显示初始化。
7,调用类中的构造代码块。
8,执行构造函数中自定义的初始化代码。
9,初始化完毕,将地址赋值给指定的引用。
问题:5-8步是创建对象调用构造函数时才执行的,假设Person类中有属性country:public static String country=“CN”;如果不创建对象,直接用类名调用该country是可以的,那么这个country属性是随Person类的加载就赋值了呢,还是在执行第6步显示初始化才赋值的???另外,静态成员变量有默认值吗?
作者:
银酱
时间:
2014-1-18 19:36
随Person类的加载就赋值,
静态成员变量我记得有默认值的吧
作者:
DOOR
时间:
2014-1-18 21:24
静态变量在定义的时候就已经初始化了 如果没有赋值 那就是默认值 int的话就是0 对象就是null
初始化:如果不显式初始化,那么将被隐式初始化为0
静态变量是属于类本身的 不属于具体的某一个对象 所有类的静态变量是随着类的加载而加载
作者:
姬运涛
时间:
2014-1-18 22:49
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
作者:
s476596497
时间:
2014-1-20 11:45
静态成员是类成员,意思就是只要类加载,静态成员就存在于方法区中,先于对象存在,静态成员有默认值为0
作者:
廉伟杰
时间:
2014-1-20 16:01
其实这点只需要理解static就行了,static的知识点
特点:
①:随着类的加载而加载
②:优先于对象的存在
③:被所有对象所共享
④:可直接被类名调用
没有用static修饰的字段或方法,属于对象的-----实例成员(方法)
用static修饰的字段或方法,属于类的 ------类成员(方法)
调用:
如果是没有static修饰的实例成员(方法),只能通过对象调用·即 对象.字段(方法);
如果是有static修饰的类成员(方法),可以通过对象来调用,即 对象.字段(方法)
也可以通过类来调用,即 类名.字段(方法)
但是建议使用 类.字段(方法)来调用,因为在底层,对象调用类成员也转换为类调用成员
在JVM中,专门有一块区域,静态区域,来存储 类成员或方法(所以,当当一个对象修改了其中的另类成员的话,另外一个对象再次调用时,调用的是修改过后的值)
静态方法中只能访问静态成员,但非静态方法中可访问静态成员
静态方法中不能存在this,super关键字,原因是那几个关键字和对象有关的
第二个问题是静态成员变量,
只要是成员变量都是有默认的初始值得
成员变量都有默认值:整数类型默认都是 0 ;小数默认是0.0 ;布尔类型默认 false ;引用类型默认 null ;char默认 ‘\u0000’;
希望我的解释对你有所帮助
作者:
贾浩田
时间:
2014-10-24 16:24
package itHeima.RUXUE1;
public class Test13 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
//把用new创建对象的方式拆开写
ClassLoader c = ObjectTest.class.getClassLoader(); //获取类加载器
Class<?> clazz = c.loadClass("itHeima.RUXUE1.ObjectTest"); //读取字节码文件,并返回字节码对象
ObjectTest obj = (ObjectTest) clazz.newInstance(); //通过反射调用无参构造器创建对象
}
}
class ObjectTest{
int i; //只要是成员字段,都有默认初始值,无论是否为静态
static int b;
static{
System.out.println("静态代码块,类初始化 " +b); //1、对静态字段进行默认初始化
}
{
System.out.println("构造代码块,对象初始化"+i+" "+b); //2、对成员字段进行默认初始化
}
ObjectTest(){
System.out.println("无参构造器");
}
ObjectTest(int i,int b){ //3、用构造器对成员字段进行显式初始化
this.i = i;
this.b = b;
System.out.println("有参构造器 "+this.i+" "+this.b);
}
}
复制代码
上面这个例子是我的一个总结,希望对楼主有帮助。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2