構造方法:
- 對象都有構造方法,
- 如果沒有,編譯器回自動加上一個default構造方法
- 不可以使用new創建對象的抽象類也有構造方法
調用構造方法:
- this調用本類的其他構造方法,
- super調用直接父類的構造方法,
- this和super要放在第一條語句,且只能有一條,
- 如果沒有this及super,則編譯器自動加上super(),即調用直接父類不帶參數的構造方法
package study;
import jdk.jshell.PersistentSnippet;
public class ConstructCallThisAndSuper {
public static void main(String[] args){
Person p = new Graduate();
}
}
class Person{
String name;
int age;
Person(){};
Person(String name, int age){
this.name=name; this.age=age;
System.out.println("In Person(String,int)");
}
}
class Student extends Person
{
String school;
Student(){
this(null, 0, null);
System.out.println("In Student()");
}
Student(String name, int age, String school){
super(name, age);
this.school = school;
System.out.println("In Student(String,int,String)");
}
}
class Graduate extends Student
{
String teacher = "";
Graduate(){
// super();
System.out.println("In Graduate");
}
}
/*
In Person(String,int)
In Student(String,int,String)
In Student()
In Graduate
*/
對象初始化特殊寫法
p = new Person(){{ age=18; name="李明"}} # 雙花括號,針對沒有對應構造方法,但又要賦值的情況下,創建對象時對屬性賦值
實例初始化:先於構造方法{}中的語句執行
靜態初始化:在第一次使用這個類時要執行,但其執行的具體時機是不確定的,但是總是先於實例的初始化
package study;
public class InitObject {
public static void main(String[] args){
test t = new test();
}
}
class test
{
test()
{
System.out.println("普通初始化");
}
{
System.out.println("實例初始化");
}
static{
System.out.println("靜態初始化");
}
}
/*
靜態初始化
實例初始化
普通初始化
*/
構造方法的執行過程
- 調用本類或父類的構造方法,直到最高一層(object)
- 按照聲明順序執行字段的初始化賦值
- 執行構造方法中的其他各語句
package study;
public class InitExecutionStep {
public static void main(String[] args){
Fruit f = new Apple();
}
}
class Fruit{
Fruit(){
System.out.println("Fruit構造方法執行");
keepfresh();
}
void keepfresh(){
System.out.println("Fruit類keepfresh方法執行");
}
}
class Apple extends Fruit{
String name = "蘋果"; // 第二部
int fresh = 100;
Apple(){
super(); // 第一步
System.out.println("Apple構造方法執行"); // 第三部
}
void keepfresh(){
System.out.println("保存時間爲:" + fresh);
}
}
/*
Fruit構造方法執行
保存時間爲:0
Apple構造方法執行
*/
子類構造方法執行時,當父方法的構造方法調用了虛方法,而這個虛方法又被子類覆蓋,則會從父類虛方法跳到子類虛方法,所以上面例子中子類fresh字段還沒來得及賦值,所以打印了一個默認值(0值)
構造方法中儘量不做虛方法調用,唯一能夠安全調用的是具有final屬性的方法