4.1.4如何实现在main()方法执行前输出”Hello World”
在java语言中,main()方法是在程序运行的时候最先加载的方法,但是他不是第一个被执行的模块,静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出”Hello World”功能
代码如下:
public class TestPrintBeforeMain {
static{
System.out.println("Hello World!");
}
public static void main(String[] args){
System.out.println("Hello World main!");
}
}
运行结果如下:
Hello World!
Hello World main!
因为前一篇博文(http://blog.csdn.net/qq_28814687/article/details/72768122)也说过,静态块不管位置如何,都会在main()方法之前执行,所以也可以把静态代码块放在mian函数下边
public class TestPrintBeforeMain {
public static void main(String[] args){
System.out.println("Hello World main!");
}
static{
System.out.println("Hello World!");
}
}
运行结果是一样的。
4.1.5Java程序初始化的顺序是怎样的
当实例化对象时,对象所在的类的所有成员变量首先要进行初始化,只有当所有的类成员完成初始化之后,才会调用对象所在的类的构造函数创建对象初始化优先级:1>静态对象(变量)优先于非静态对象(变量)初始化。静态对象(变量)只初始化一次,非静态对象(变量)可能会初始化多次。2>父类优先于子类进行初始化。3>按照成员变量的定义顺序进行初始化,即使变量定义散布于方法定义之中,他们依然在任何方法(包括构造函数)被调用之前初始化。
构造函数的使用()
参考网址http://longying2008.iteye.com/blog/1535722
对象一建立就会调用与之对应的构造函数,初始化对象。当一个类中没有定义构造函数是,那么系统就会默认给该类加入一个空参数的构造函数,当类中加入构造函数,默认的构造函数就没有了。
一个对象建立,构造函数只运行一次,与new关键字配合使用,而一般方法可以调用多次。
构造函数使用方法:
1.必须与类同名,如果一个源文件有多个类,那么构造器必须与公共类同名
2.每个类可以有一个以上的构造器
3.构造器可以有0个,1个或一个以上的参数
4.构造器都没有返回值
5.构造器总是伴随着new操作一起调用
示例:
A.java
public class A{
public A(){
System.out.println("调用了无参的构造函数");
}
public A(String mess){
System.out.println("调用了有参的构造函数\n"+
"参数内容为:"+mess);
}
}
Test.java
public class Test{
public static void main(String [] args){
A a_1=new A();//调用无参的构造函数
A a_2=new A("Hello");//调用有参的构造函数
}
}
输出结果:
调用了无参的构造函数
调用了有参的构造函数
参数内容为:Hello
子类调用父类的构造器:
A.java
public class A{
public A(){
System.out.println("调用了A的无参的构造函数");
}
public A(String mess){
System.out.println("调用了A的有参的构造函数\n"+
"参数内容为:"+mess);
}
}
B.java
public class B extends A{
public B(){
System.out.println("调用了B的无参构造函数");
}
public B(String mess){
super(mess);
System.out.println("调用了B的有参函数\n"+"参数内容为:"+mess);
}
}
Test.java
public class Test {
public static void main(String[] args){
B b1 = new B();
B b2 = new B("你好");
}
}
运行结果:
调用了A的无参的构造函数
调用了B的无参构造函数
调用了A的有参的构造函数
参数内容为:你好
调用了B的有参函数
参数内容为:你好
使用super调用父类构造器的语句必须是子类构造器的第一条语句,如果子类构造器没有显式的调用父类的构造器,则将自动调用父类的默认(没有参数)的构造器。即如果在B.java的带参构造函数中,没有super(mess),那么Test.java中的B b2=new B(“你好”);就会调用A中的无参构造函数。
如果父类没有不带参数的构造器,并且在子类中又没有显示的调用父类的构造器,则java编译器会报告错误。即在A.java如果没有无参数构造器,按照B中的写法,B中的无参构造函数就会报错。
构造代码块:对象一建立就运行,而且优先于构造函数运行,构造代码块定义的是不同对象共性的初始化内容,所以是给所有对象进行统一初始化
参考网址:http://longying2008.iteye.com/blog/1535722
代码如下:
TestConstructor.java
public class TestConstructor {
private String name;
private String address;
public TestConstructor(int n){
System.out.println("hello,I'm object "+n);
}
{
System.out.println("I'm commom in every object!");
}
}
Test.java
public class Test {
public static void main(String[] args){
TestConstructor tc1 = new TestConstructor(1);
TestConstructor tc2 = new TestConstructor(2);
}
}
运行结果:
I’m commom in every object!
hello,I’m object 1
I’m commom in every object!
hello,I’m object 2
从代码中可以看出,即使我们把构造代码块放在构造函数后面,执行的时候依然在构造函数之前运行。
所以,Java程序的初始化工作可以在许多不同的代码块中完成,执行顺序如下:
父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类构造代码块,父类构造函数,子类非静态变量,子类构造代码块,子类构造函数。
如下代码所示:
Base.java
public class Base {
static{
System.out.println("Base Static block");
}
{
System.out.println("Base constructor block");
}
public Base(){
System.out.println("Base constructor");
}
}
Derived.java
public class Derived extends Base{
static{
System.out.println("Derived static block");
}
{
System.out.println("Derived constructor block");
}
public Derived(){
System.out.println("Derived Constructor");
}
public static void main(String[] args){
new Derived();
}
}
运行结果:
Base Static block
Derived static block
Base constructor block
Base constructor
Derived constructor block
Derived Constructor