黑马程序员技术交流社区

标题: 类的初始化 [打印本页]

作者: wangzhiyong515    时间: 2014-5-9 15:26
标题: 类的初始化
一个类的初始化过程是怎样的?求步骤?
作者: 李东梁    时间: 2014-5-9 15:34
本帖最后由 李东梁 于 2014-5-9 15:36 编辑

一个类初始化,要看里面代码是怎么实现的?类里面的构造代码块、静态代码块的加载顺序是不样的
给你分享一篇博客,详解类加载顺序
http://blog.csdn.net/u014316982/article/details/22232861

作者: 没壳的蜗牛    时间: 2014-5-9 15:45
Java 编译器把所有的类变量初始化语句和类型的静态初始化器通通收集到 <clinit> 方法内,该方法只能被 Jvm 调用,专门承担初始化工作。除接口以外,初始化一个类之前必须保证其直接超类已被初始化,并且该初始化过程是由 Jvm 保证线程安全的。另外,并非所有的类都会拥有一个 <clinit>() 方法,在以下条件中该类不会拥有 <clinit>() 方法:
1.该类既没有声明任何类变量,也没有静态初始化语句;
2.该类声明了类变量,但没有明确使用类变量初始化语句或静态初始化语句初始化;
3.该类仅包含静态 final 变量的类变量初始化语句,并且类变量初始化语句是编译时常量表达式。
作者: 彭飞    时间: 2014-5-9 16:07
不知道怎么来回来了,
哈哈
其实,一个类,在建立的时候是通过构造函数(或者说构造方法) 来进行初始化的。

特别是前期接触代码的时候很少能遇见构造函数。或者说没有函数。
其实不是没有函数,是你没有定义构造函数,这个时候,是默认有一个空的构造函数
而这个空的构造函数里也有一个默认的指针,指向父类的构造函数中。

类就是这样来进行初始化的。

给你小个简单的小列子你就知道了:
  1. class Person
  2. {
  3.         Person(){
  4.                 System.out.println("出生时哭叫");
  5.         }
  6. }

  7. class YinEr extends Person
  8. {

  9. }

  10. class  add
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                 YinEr y=new YinEr();
  15.         }
  16. }
复制代码


我们定义了一个人的类,然后什么也不写,在main方法中实例化一个对象,运行,编译通过,运行空白
然后我们在人类中写上一句输出语句,然后在运行, 发现出现了这句话。
然后我们在写一个小孩类  【不知道你视频学到继承没有】
小孩类里什么也不写, 直接在main方法中实例化,运行,同样会执行父类中的输出语句

说明,一个类的建立如果没有定义构造函数,会默认添加。而构造函数就是初始化作用的。
在定义类的时候,进行事物分析时,该事物存在具备一些特性或者行为,那么就将这些内容定义在构造函数中。
所以这里,其实应该把哭这个特性写到小孩类里面。

在比如实际用到某些事物,我这里就举例了,比如要用到茶杯这个类,
  1. class chaBei{
  2.         String name;

  3.         chaBei(String name){
  4.                 this.name=name;
  5.         }
  6. }
复制代码

假设他们的共性就是 都有名字,就可以在构造函数中进行初始化。

构造函数的执行优先级高于普通代码
对象一建立首先执行的是静态方法和静态修饰的变量,而后执行构造函数,
构造函数匹配其内容进行初始化,只执行一次。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2