实例化一个类的对象时的执行顺序
来源:互联网 发布:知的草书写法 编辑:程序博客网 时间:2024/05/01 11:16
下面这个小程序,你能把结果做对吗? 我就做错了,对实例化对象时的执行顺序有些生疏了,希望以后杜绝类似的疏忽。
--Book.java:
import java.io.IOException;
public class Book {
Book(int marker) {
System.out.println("Book(" + marker + ")");
}
public void f1(int marker) {
System.out.println("f1(" + marker + ")");
}
}
--Room.java:
import java.io.IOException;
public class Room {
static Book book1 = new Book(1);
public Room() {
System.out.println("Room()");
book2.f1(1);
}
public static void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
Book book2 = new Book(2);
}
--Shelf.java:
import java.io.IOException;
public class Shelf {
Book book3 = new Book(3);
Book book4 = new Book(4);
public Shelf() {
System.out.println("Shelf()");
book4.f1(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
static Book book5 = new Book(5);
}
--InitializationTest.java:
import java.io.IOException;
class InitializationTest {
public static void main(String[] args) {
System.out.println("Creating new Shelf() in main");
Room.f2(1);
new Shelf();
System.out.println("Creating new Shelf() in main");
new Shelf();
new InitializationTest();
}
static Room room = new Room();
Shelf cupboard = new Shelf();
InitializationTest()
{
System.out.println("InitializationTest()");
}
}
执行结果是:
Book(1)
Book(2)
Room()
f1(1)
Creating new Shelf() in main
f2(1)
Book(5)
Book(3)
Book(4)
Shelf()
f1(2)
Creating new Shelf() in main
Book(3)
Book(4)
Shelf()
f1(2)
Book(3)
Book(4)
Shelf()
f1(2)
InitializationTest()
仔细看一看上面的流程,可以概括成几个要点:
1.在实例化一个类的对象时,先要实例化该类的成员变量,再执行该类的构造函数。
2. 在实例化一个类的成员变量时,先要实例化静态成员变量,再实例化非静态成员变量。
3. 一个类的静态成员变量只实例化一次,即只有一个拷贝,在该类的所有对象中共享。
4. 执行一个类的静态成员函数时,该类的对象并没有生成,因此,只会实例化该类的静态成员变量,而不会实例化非静态成员变量,也不会执行构造函数。
另外,上面4个java文件都没有指定包名,可以让他们在同一个目录中,这样在使用“javac”命令编译文件以及“java”命令执行文件时就不需要显示的指明classpath的路径。
而如果他们分属不同的package,比如说Book.java、Room.java、Shelf.java在同一个包com1中, 而InitializationTest.java在另一个包com2中,那么我们使用“javac”编译InitializationTest.java时,就要使用-classpath指明com1所在的位置,当然InitializationTest.java要import com1.*.
然后,使用“java”命令来执行InitializationTest.class时,也要用-classpath指明包com2的位置。
因此,使用默认包名和自定义包名来编译时还是有区别的,只是大家容易忽略罢了。
- 实例化一个类的对象时的执行顺序
- 实例化一个对象(类加载)的执行顺序详解
- 黑马程序员-实例化对象执行时的执行顺序
- Unity对象实例的执行顺序探究及一个对象关联多个脚本的
- 实例化类的执行顺序
- Java中new一个对象时 执行顺序的探析
- Java类实例化时的执行顺序
- java类的初始化块/执行顺序,实例化对象数据赋值
- java 类的实例 new一个对象初始化顺序
- java 类的实例 new一个对象初始化顺序
- 创建一个类的对象时,程序的执行顺序(C#)
- 类的初始化顺序:实例化一个类的对象和访问静态域或者静态方法时的不同
- C# 实例化的执行顺序
- java创建对象时的执行顺序
- Spring创建对象时的执行顺序
- java 父类访问子类对象的实例变量 继承过程中的执行顺序
- 对象初始化的执行顺序
- 从一个实例看java,new一个对象时的初始化顺序
- java学习笔记——使用DOM解析XML和使用SAX解析XML
- C/C++网络编程中的TCP保活
- 关于研究思考的一些感悟
- ManageStartUpApps:C#操作注册表来读取和修改开机启动项
- 调用startActivityForResult后,onActivityResult无响应
- 实例化一个类的对象时的执行顺序
- C++模板定义与实现分离所导致的链接错误LNK2019
- 剑指OFFER
- ios模拟器中应用程序的安装位置
- linux shell脚本文件执行分析
- MAX3421E版本1和2主机OUT传输
- Autotools上手指南Autotools上手指南1——autoconf基本思想
- SIMD和多核心编程时的一些总结。
- js,java变量使用