Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.4-4.1.5)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值