关于JavaFx程序运行过程的问题

最近在做一个24点的联网游戏,其中使用了JavaFx做界面,所以当时就创建了一个类client_ui, 这个类继承Application,这样就可以在后续能创建多个客户端界面,并在这个类有一个socket作为通信的套接字。但是在启动客户端时,创建了一个client_ui,然后在调用·Application.launch(); 来显示界面,可是明明在创建client_ui类之后已经声明并初始化的控件都是null。在调试过程中发现,使用 client_ui client = new client_ui(); 会创建一个对象,然而执行 client.launch()后又会自动创建一个client_ui 对象,这个对象和 client_ui client = new client_ui(); 创建的对象并不是同一个对象。后来将程序执行的过程的信息打印出来逐一比对,发现以下问题:
client_ui类如下:

 public class client_ui extends Application{
 	//这里定义一些成员变量
 	HBox hb = new HBox();
 	VBox vb = new VBox();
 	Label lab1;
 	Label lab2 = new Label();
	public client_ui(){
		...
	}
	public void init(){
		...
	}
	
	public void start(Stage stage){
		...
	}
	public void play(){
		//launch方法是Application类中的静态方法,
		//它创建Application类的实例,并且开始了JavaFX的生命周期
		Application.launch();
	}
	...
}

执行client_ui client = new client_ui();后,这个类的执行过程:

public client_ui()		//完成初始化后就退出client_ui类的执行

执行client.play();后:

public void play() 		//启动这个应用
--> public client_ui() 		//完成这个应用的初始化
--> public void init() 		//默认的init方法什么也不做,但我们可以重新该方法,以实现特定的初始化任务
--> public void start(Stage stage) 		//start方法用于创建并显示UI接口

由上面的执行过程可以发现,执行launch方法后还会创建一个对象,这里的疑问就是
原来通过 new client_ui(); 创建的对象哪去了?client.play();调用的不应该是 client的launch方法吗?

为什么调用client.play(); 后悔再次创建一个对象?
但是,希望各位有类似困惑的朋友也注意一下,每当调用launch()方法后都会自动创建一个对象!!!
还有一点就是:

由于在client_ui 类里定义了一些成员变量,而且有些经过了初始化,有些没有经过初始化,在调用构造函数之前,会初始化那些有初始化语句的成员,对与那些没有初始化的,只声明的变量则不会执行,所以要注意在使用之前一定有初始化,否则会出现初始化异,如 java.lang.IllegalStateException: Toolkit not initialized 、 java.lang.ExceptionInInitializerError常等!!!

血与泪的教训啊!!

你可能感兴趣的:(Program,java)