我们为什么需要构造器与代码块?
当我们创建对象时,对象究竟是怎么样new出来的,又是怎么样将new出来的对象返回的呢?虽然Java是有着封装的特性,我们不知道内部的实现也不妨碍编程,但不刨根问底的程序员不是好的架构师,有余力时还是应该多看源码多看内部实现。new对象的内部实现,就离不开构造器的概念。
简单来说,被 { } 括住的代码,就叫代码块。我们平时总会习以为常的使用代码块,甚至习惯到不以为然了,而越是这种不以为然的东西,越是应该好好分析研究一下。
构造器
在创建对象时,调用的方法,称为构造器,或构造方法。
一个类里,至少会有一个构造方法。即使没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法(《方法的重载》)。
来个实例:
public class Person {
private String name;
private int age;
Person() {
System.out.println("默认构造器被调用");
}
// 构造器的重载
Person(String name,int age) {
System.out.println("重载的带参构造器被调用");
this.name = name ;
this.age = age ;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("------------");
Person person2 = new Person("小猪",18);
System.out.println("------------");
System.out.println(person1);
System.out.println(person2);
}
}
-------------------------------------------------
输出结果为:
默认构造器被调用
------------
重载的带参构造器被调用
------------
Person [name=null, age=0]
Person [name=小猪, age=18]
构造器特点:
- 1.通过new关键字调用。
- 2.构造器名称必须和当前类名一致。
- 3.构造器有返回值,返回的值的类型就是本类,所以不要使用void(会报警告),不可以使用return返回任何值。
- 4.如果没有定义构造器,编译器会自动定义一个无参数构造器。如果已定义,则不会自动添加!(来个实例:)
- 5.如果类是public的,则默认的构造器也为public。
public class Person {
private String name;
private int age;
Person(String name,int age) {
this.name = name ;
this.age = age ;
}
public static void main(String[] args) {
Person person1 = new Person(); // 此处会报错。因为不会再自动生成无参构造器
Person person2 = new Person("小猪",18);
}
}
代码块
代码块,就是指在类或方法中,使用{}括起来的一段代码。
- 1.局部代码块:是最常见的代码块,在方法里用一对“{}”括起来的一段代码,就是局部的代码块。
// 局部代码块
public void eatFood() {
System.out.println("吃吃吃");
}
- 2.初始化代码块:在类中直接定义的,用“{}”括起来的代码,相当于写在构造器中,且代码块不管放在构造器前后,初始化代码块内的代码都会放在构造器最前面,且写在前面的代码块放在前面。
class Animal {
{
System.out.println("初始化代码块1");
}
Animal(){
System.out.println("构造器");
}
{
System.out.println("初始化代码块2");
}
}
public class Test {
public static void main(String[] args){
new Animal();
}
}
---------------------------------------------
输出结果:
初始化代码块1
初始化代码块2
构造器
- 3.静态代码块:在初始化代码块前面,加上一个static。静态代码块在加载字节码时就执行了(不用创建对象,就会执行),在主方法之前,且只会执行一次。
public class Test {
static {
System.out.println("静态代码块");
}
public static void main(String[] args){
System.out.println("main方法执行");
}
}
---------------------------------------------
输出结果:
静态代码块
main方法执行