问题:静态变量初始化后,不会再被对象初始化吗?
static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。
赋值的话,是可以任意赋值的
假如Student类里{
private Student(){ }
static Student s = new Student();
}
那么
Demo类里
Student.s 拿到的永远是这个s的引用地址值 。 因为static Student s = new Student();
是静态,所以当使用 类的非常量静态字段 就已经被初始化了。 初始化new 好了对象,返回了引用地址值。 所以你之后再继续不停地Student.s Student.s Student.s Student.s 他也不会继续new出一个新的student对象。
类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
- 创建类的实例
- 调用类的静态方法
- 使用类的非常量静态字段
- 调用Java API中的某些反射方法
- 初始化某个类的子类
- 含有main()方法的类启动时
初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法
1.25
如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。
问题:什么时候或情况下 .class 类会加载到内存?
类加载器:负责将.class文件加载到内在中,并为之生成对应的Class对象
1.26
类一旦被加载进内存,或被强行加载进内存,这个类的静态代码块都会首先执行。
Java是先调用构造方法才新建对象,还是新建对象后才调用构造方法?
个人通过上图可看出,其实只要执行了构造方法就已经 能新建一个对象了。在普通Java中,可以理解为 构造的方法的执行的关键字是new 而在反射中, Class c = Class.forName("cn.incast.homework30.Person"); Constructor cons = c.getConstructor(String.class, int.class); Object obj = cons.newInstance("小明", 20);
深入探究:
1.27
java Object数组里可以装基本类型吗?
Object可以引用任何的类,像int double char这类是基本类型,Object不能引用,但是可以引用他们的封装类,Integer Double这种,因此,Object数组能放除了8个基本类型之外的所有类
所以即使int 放进Object数组,它肯定也是要自动装箱的。
查了下API文档,例如包装类Ingeter :
String toString()
返回一个表示该 Integer 值的 String 对象。
从数据库取出一个 Count函数 统计的值
在代码中要转成Integer类型的时候, 报错java.math.BigDecimal cannot be cast to java.lang.Integer
答:最好不要.toString, 以免出现NullPointerException,使用String.valueOf(),可以避免。