类加载与对象初始化

1. 初始化原因:避免发生空指向异常。

2. 类加载与初始化的顺序:

2.1 类加载时间:

         每个类的编译代码都存在于他自己的独立文件中,该文件的加载通常发生在创建类的第一个对象时,或是访问类的static域或static方法时。

2.2 初始化顺序:(先父类后子类,创建对象之前先对类中的域进行初始化)

       首先,类加载器主动加载主类(主类的初始化顺序与下面普通类一样),找到main方法,在main方法中根据第一行要创建的对象,加载该类的字节码文件,如果编译器注意到她有基类(这是由extends关键字得知)则继续加载(,不管是否需要创建基类对象,这都要发生。)在根基类中首先的static初始化,static代码块,依次是子类,至此类加载和静态初始化及静态代码快的执行已经完毕,对象就可以被创建。首先对象中所有的域都会设为默认值,然后在调用父类的构造方法之前普通域会被初始化,依次执行直到完成初始化工作。

3. 代码验证:

class Person{
 private static String city = "shanxi" ;
 private String name = new String("wh") ;
 private String age ;
 static{
  System.out.println(city+"perosn静态代码块");
 }
 {
  System.out.println(name+"普通块"+age);
 }
 public Person(String name,String age){
  System.out.println(city+"---------->"+this.name+"----------->"+this.age);
  this.name = name ;
  this.age  = age ;
  System.out.println(city+"---------->"+this.name+"----------->"+this.age);
 }
}
class Student extends Person{
 private static String school = "xd" ;
 private String sname = new String("sn") ;
 private String sage ;
 static{
  System.out.println(school+"   student静态代码块");
 }
 {
  System.out.println(sname+"   student普通块"+sage);
 }
 public Student(String name,String age){
  super(name,age) ;
  System.out.println(Student.school+"------------>"+this.sname+"------->"+this.sage);
  this.sname = name ;
  this.sage = age ;
  System.out.println(Student.school+"------------>"+this.sname+"------->"+this.sage);
 }
}
public class InitSort {
 public static void main(String[] args) {
  Student s1 = new Student("cjt","23") ;
  Student s2 = new Student("cjr","21") ;
 }
}

输出:

shanxiperosn静态代码块
xd   student静态代码块
wh普通块null
shanxi---------->wh----------->null
shanxi---------->cjt----------->23
sn   student普通块null
xd------------>sn------->null
xd------------>cjt------->23
wh普通块null
shanxi---------->wh----------->null
shanxi---------->cjr----------->21
sn   student普通块null
xd------------>sn------->null
xd------------>cjr------->21

类加载与对象初始化,布布扣,bubuko.com

时间: 2024-11-10 07:45:06

类加载与对象初始化的相关文章

java类加载和对象初始化

对象初始化过程:  1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  3.其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法: 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法: Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父

阿里巴巴面试题--Java对象初始化

转自 http://blog.csdn.net/ysjian_pingcx/article/details/19605335 Java对象初始化 这是一道阿里巴巴的关于Java对象初始化的面试题,堪称经典,代码很简单(编写格式做了些修改),但是需要面试者对Java中对象初始化有一个透彻的认识,那么通过这道面试题,对我有点启发,所以希望在这里分享给大家,希望能给迷惘的初学者一起指引,下面我们直入主题,先看看代码: 1 public class InitializeDemo { 2 private

有关java类、对象初始化的话题,从一道面试题切入

最近在整理东西时,刚好碰到以前看的一道有关java类.对象初始化相关题目,觉得答案并不是非常好(记忆点比较差,不是很连贯).加上刚好复习完类加载全过程的五个阶段(加载-验证-准备-解析-初始化),所以如果周志明大大诚不我欺的话,无论是类加载过程.还是实例化过程的顺序我都已经了然于心了才对. 一道面试题 标题:2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题) 地址:https://zhuanlan.zhihu.com/p/25746159 该题代码如下: public cl

Java变量、Java对象初始化顺序

局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量:必须在代码块内对其显示初始化,从初始化后开始生效,随代码块的结束而凋亡. 成员变量: 静态属性:类加载时初始化,随着类的存在而存在: 非静态属性:随着实例的属性存在而存在: 关于他两的区别: 1.局部变量不可以加static: 2.局部变量不可以加public.protected.private:

对象初始化

对象初始化过程 第一步:在创建之前,检查是否加载(检查硬盘上的class文件是否加载到内存中,如果没有加载,就先加载父类的文件) 在加载父类的文件,在加载本类的文件中java使用的加载的策略:懒惰式加载(按需加载)用到的时候,只加载一次. 第二步:分配对象的空间.递归分配所有父类和子类的属性空间,属性会自动初始化为"0"的值 第三步:给属性赋值 第四步:调用父类的构造方法(默认调用父类的无参构造方法) 第五步:调用本类的构造方法

理解隐式类型、对象初始化程序和匿名类型

在C# 3.0中,几乎每个新特性都是为LINQ服务的.所以,本文将介绍下面几个在C# 3.0中引入的新特性: 自动实现的属性 隐式类型的局部变量 对象和集合初始化程序 隐式类型的数组 匿名类型 其实这几个特性都是比较容易理解的,对于这几个特性,编译器帮我们做了更多的事情(想想匿名方法和迭代器块),从而简化我们的代码. 自动实现的属性 在C# 3.0以前,当我们定义属性的时候,一般使用下面的代码 public class Book { private int _id; private string

对象初始化的过程

对象初始化过程: a.在创建类之前,检查类是否已加载(检查硬盘上的class文件,是否已加载到内存中),如果没有加载就先加载父类文件,再加载本类的文件        Java使用的加载策略:懒惰式加载(按需要加载),用到的时候加载,只加载一次 b.分配对象的空间,递归分配所有的父类和子类的属性空间  属性会自动初始化为"0"值 c.给属性赋值 d.调用父类的构造方法(默认调用父类的无参构造方法) e.调用本类的构造方法