最近翻看下java编程思想,对java类和对象的初始化有点困惑,查阅了一些资料:
一、java类初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:
1、先按照静态成员变量的定义顺序在类内部声明成员变量。
2、再按照原java类中对成员变量的初始化顺序进行初始化。
源文件
public class Person {
public static String name = "gyq";
public static int age;
static {
age = 20;
System.out.println("初始化了age");
}
public static String address;
static {
address = "shenyang";
age = 21;
}
public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
当java源代码转换成一个class文件后,其转换成类似下面的代码:
public class Person{
public static String name;
public static int age;
public static String address;
static{
name="gyq";
age=20;
System.out.println("初始化了age");
address="shenyang";
age=21;
}
public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。
二、java对象的生成
对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:
package package1;
public class Person {
{
name = "gyq";
age = 20;
System.out.println("初始化了age");
address = "shenyang";
}
public String name = "ddl";
public int age = 21;
public String address = "dalian";
public Person() {
name = "ddlgyq";
age = 27;
address = "shenyang";
}
}
编译器转换成class文件后,会转换成类似下面的代码:
public class Person {
public String name;
public int age;
public String address;
public Person() {
name = "gyq";
age = 20;
System.out.println("初始化了age");
address = "shenyang";
name = "ddl";
age = 21;
address = "dalian";
name = "ddlgyq";
age = 27;
address = "shenyang";
}
}
可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。
类的初始化和对象的初始化都可以按照以上说的模型进行记忆。死记硬背只能起到事倍功半的效果,按照模型记忆,则可以事半功倍
分享到:
相关推荐
天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始...
陈宝峰视频-Java基础-07.类的初始化与方法重载 wmv格式
c++ 基本知识--类定义、初始化、析构(曹阳).ppt
《Java程序设计基础教程》按内容分成五篇:Java 语言入门篇、面向对象篇、数据流应用篇、Java GUI编程篇和高级应用篇,共有二十四讲组成。
ComplexNumber(double r,double i):构造函数,创建复数对象的同时完成复数的实部、虚部的初始化,r为实部的初值,i为虚部的初值。 getRealPart():获得复数对象的实部。 getImaginPart():获得复数对象的虚部。 ...
介绍java对象的创建、初始化、和引用。并分析一下JAVA中对象创建和初始化过程中涉及的相关概念问题。
面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将功能封装进对象,强调具备了功能的对象。 面向对象是基于面向过程的。
java 数组初始化 详解 doc
对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理
NULL 博文链接:https://949507869-qq-com.iteye.com/blog/1053933
4.1 类的方法 4.2 类封装与访问控制 4.3 类的继承 4.4 多态性 4.5 接口 4.6 Java的内部类 4.7 Lambda表达式初步 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第2页。...
java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
C++ 基本知识--类定义、初始化、析构(陆璐).pptx
基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-...
NULL 博文链接:https://justcoding.iteye.com/blog/1352346
解决ORA-01033 ORACLE 正在初始化或关闭
quartz-2.2.3版本的quartz初始化sql语句
RDBMS--MYSQL--1.MYSQL初始化--6.mysql_5.7初始化.pdf
对java类初始化以及顺序,详解,由于转载仅供大家参考!