构造器
前面大概讲了一下java的基础概念,甚至还没接触到具体的语法。这次的知识依然是最基本的语法和概念。今天主要是介绍java构造器
构造器是一个特殊的方法,这个方法用于创建对象时进行初始化,前面介绍国,当创建一个对象的时候,系统会为这个对象的实例变量默认初始化(见java面向对象(一))这种默认犯法将左右基本类型的实例变量设为0,布尔变量设为false,引用变量设为null,如果想要改变这种默认初始化就需要在创建对象的时候就为该对象显示的指定初始值,这就是为什么我们需要构造器。
- 构造器初始化
构造器的最大用处在于创建对象时进行初始化。创建一个对象的时候系统为这个对象我们通常采用自定义的构造器开始定义自己的初始化操作。
例如 我们对Person类创建构造器进行初始化。
public class Person{
public String ame;
public int age;
//提供自定义的构造器
public Person(String name,int age){
//构造器内this代表他们的初始化对象
//下面的代码将传入的两个参数赋值给this代表的对象的name和age
this.name=name;
this.age=age;
}
public static void mian(String[] args){
//使用自定义的构造器创建对象
//系统将会对该对象自定义的初始化
Person p1 = new Person("李四",19);
System.out.println("我的名字是"+p1.name+"年龄是"+p1.age);
}
}
经过这个构造之后我们可以看到实例变量不是null而是“李四”和19;但是一旦程序员自定义构造器后,系统不再提供默认构造器,需要无参构造器需要自己显示写出
如果希望该类保留无参构造器或者有多个可以进行不同变量初始化的构造器就构成了构造器的重载。
- 构造器重载
- 同一个类中有多个构造器,每个构造器的形参类型,数量,顺序不同,其允许Java类中包含多个初始化逻辑,允许使用不同的构造器来初始化java对象
例如,上述的例子
public class Person{
public String ame;
public int age;
//提供自定义的构造器
public Person(String name,int age){
//构造器内this代表他们的初始化对象
//下面的代码将传入的两个参数赋值给this代表的对象的name和age
this.name=name;
this.age=age;
}
//提供无参构造
public Person(){ }
public static void mian(String[] args){
//使用自定义的构造器创建对象
//系统将会对该对象自定义的初始化
Person p1 = new Person("李四",19);
System.out.println("我的名字是"+p1.name+"年龄是"+p1.age);
//使用午餐构造器
Person p2=new Person();
}
}
上面两个重载的构造器使用形参不同来进行区分,系统通过new调用构造器的时候,系统根据传入的参数来决定调用哪一个,并且在构造器可以完全包含其他的构造器执行体。例如当构造器B完全包含构造器A,则可以在方法B中调用方法A,但是构造器不可以直接被调用,使用this关键字来调用相应的构造器
public class Person{
public String name;
int age;
double weight;
public Person(){ }
public Person(String name,int age){
this.name=nae;
this.age=age;
}
public Person(String name,int age,double weigt){
//通过this调用另一个重载的初始化代码,表示调用该类包含的带有两个参数的构造器
this(name,age);
this.weight=weight;
}
}
使用this的时候需要注意的是,this需要写在第一行。
初始化块
- 初始化块
初始化块是java类中可出现的第四种成员(前面是成员变量,方法,构造器)一个类里面可以有多个初始化块,相同类型的初始化块之间有顺苏,先定义的初始化块限制性后定义的后执行。
语法为
[修饰符]{
/初始化块的执行性代码
}
初始化块的修饰符只能是static,使用static修饰的初始化块被称为静态初始化块,初始化块可以包含任何可执行的语句,包括定义局部变量,调用其他对象的方法
例如:下面程序定义Person类既包含其他对象方法的初始化块也包含构造器
public class Person{
//定义一个初始化块
{
int a=6;
if(a>4){
Sytem.out.println("Person的初始化类:局部变量a);
}
System.out.println("Person的初始化");
}
public Person(){
System.out.println("Person的无参构造");
}
public static void mian(String[] args){
new Person();
}
上面之创造了一个Person对象但是初始化块也可以输出不是只有构造方法进行调用。系统总是先调用初始化块,再进行构造器调用。初始化块是java的一种成员但是他没有i孟子也就没有标识,因此无法通过类和对象来进行调用
==只能在创建java对象的时候进行隐式调用,而且在构造器之前执行。==从某种程度上看,初始化块是构造器的补充,且在其之前执行。但是初始化块是固定执行的代码,不接受任何参数,因此可以将那些初始化处理永远相同的且无需进行参数传入的代码段提取到初始化块中。