一、構造方法
1、什麼是構造方法?
用於創建對象並初始化對象屬性的方法,叫構造方法,也叫構造器,在類中定義,且類是一定有構造器的。
2、構造器的特點
· 構造器與類同名
· 每個類可以有一個以上的構造器
· 構造器可以重載有0、1、或多個參數
· 構造器沒有返回值
· 構造器總是伴隨着new操作一起調用,對象一建立,構造器就運行且只運行一次。一般方法可以被調用多次。
構造器之間可以相互利用(只能用this())
///構造器的格式
修飾符 類名(參數列表){
...
}
public class Phone{
String name;
Phone (String Name){///自定義構造器,public可以忽略
name=Name;
}
public static void main(String args[]){
Phone p = new Phone("華爲");
System.out.println(p.name);
}
}
3、默認構造器和自定義構造器
· 默認構造器(如果類中沒有構造器,Java編譯器自動添加): 無參數,方法體是空的構造器,且默認構造器的訪問權限隨着所屬類的訪問權限變化而變化(如類的修飾符爲pubilc,則構造器的也是)。默認構造器是隱藏的。
注意: 如果類中沒有自定義的無參構造器,不能去調用無參構造器,否則會報錯。
· 自定義構造器: 自己定義(參數、方法體…)的構造器。
注意:當構造方法爲private級別時,意味着只能在當前類中訪問它。
4、關鍵字super和this的區別
(1)super和this的含義
· super: 代表父類存儲空間標識(父親的引用)
· this: 代表當前對象的引用
(2)super和this的用途
· super的用途:①引用隱式參數;(隱式參數:聲明在方法名前的,隱藏的)
②調用該類其他的構造器。
· this的用途:①調用超類(父類)的方法;
②調用超類(父類)的構造器。
(3)super和this在程序中的注意事項
super(): 調用父類的其他構造器,一定在子類調用構造器第一行使用。如果沒有就默認添加super()。
this(): 是訪問當前對象,本類對象的引用,能區分實例變量和局部變量(也就是不同名),this可省略,否則不能省。
在構造器中,super(…)和this(…)不能同時出現,否則會出現初始化兩次的不安全操作,因爲super(…)和this(…)同時出現的話,在調用super(…)之後還會執行this(…),而this(…)又會自動調用super(…),這就造成了調用兩次super(…)的結果。
class Animal{
String name;
int age;
Animal(String name,int age){///自定義
this.name=name;
this.age=age;
}
public void eat(){
System.out.println("eat()!!!");
}
}
class Cat extends Animal{
///如果父類沒有自定義構造器,子類是調用父類默認構造器初始化(一定調用的,無論是否子類構造是否存在)
int Children;
Cat(String name,int age,int Children){
super(name,age);
this.Children=Children;///父類沒有的功能,可以用this
/*
this.name=name;///已經初始化,不能再初始化了,
this.age=age;
*/
}
public void eat(){
System.out.println("貓吃魚!!!");
}
public void show(){
System.out.println("此"+this.name+"活了"+this.age+"年且有"+this.Children+"個孩子");
}
}
public class Demo {
public static void main(String [] args){
Cat c = new Cat("cat",2,3);///帶有變量的初始化
c.eat();///就近原則,覆蓋父類方法
c.show();
}
}
this的運用(構造器之間的相互利用)
public class Animal{
String name;
int age;
int child;
public Animal(String name){
this.name=name;
}
public Animal(String name,int age){///自定義
this(name);///調用另一個重載的構造器,只能再構造器中使用
this.age=age;
}
public Animal(String name,int age,int child){
this(name,age);
this.child=child;
}
public static void main(String [] args){
///Animal animal= new Animal();///如果沒有自定義構造器,就是調用默認構造器的初始化:null 0 0
Animal animal= new Animal("Dog",5,10);
System.out.println(animal.name);
System.out.println(animal.age);
System.out.println(animal.child);
}
}
二、實例方法
就是可以通過類的實例(某個對象)調用的方法,也就是我們正常情況下使用的方法。實例方法也稱爲成員方法、對象方法、非靜態方法。
當類的字節碼文件加載到內存中時,類的實例方法並沒有被分配入口地址,只有當該類的對象創建以後,實例方法才分配了入口地址。從而實例方法可以被類創建的所有對象調用,還有一點需要注意,當我們創建第一個類的對象時,實例方法的入口地址會完成分配,當後續在創建對象時,不會再分配新的入口地址,也可以說,該類的所有對象共享實例方法的入口地址,當該類的所有對象被銷燬,入口地址纔會消失。
實例方法的特點:
1、實例方法中可以引用實例變量,也可以引用類變量(成員變量);
2、實例方法可以調用類方法;
3、類方法中可以使用super和this的關鍵字
三、類方法
就是直接可以用類名調用的方法,也就是被關鍵字static修飾的方法,它不需要創建類的對象來調用該方法。類方法也叫靜態方法。
當字節碼文件(.class)加載到內存,類方法的入口地址就會分配完成,所以類方法不僅可以被該類的對象調用,也可以直接通過類名完成調用。類方法的入口地址只有程序退出時消失。
類方法的特點:
1、用static修飾的方法;
2、類方法中不能調用類的實例方法;
3、在類方法中不能使用super、this關鍵字;
4、類方法不能被覆蓋;
5、在類方法中不能引用實例變量;
public class Main {
public void Method(){
System.out.println("我是實例方法!");
}
public static void StaticMethod(){
System.out.println("我是類方法,也是靜態方法!");
}
public static void main(String [] args){
Main m = new Main();
m.Method();///實例方法必須有對象才能調用
m.StaticMethod();///類方法的調用方法1:對象名.類方法名
Main.StaticMethod();///類方法的調用方法2:類名.類方法名,一般選擇這種方法,沒有實例,如:隨機數的獲取Math.random()
}
}
四、參考資料
1、https://www.cnblogs.com/miaoxingren/p/9366958.html
2、https://blog.csdn.net/c1776167012/article/details/102687737
3、https://blog.csdn.net/joxlin/article/details/81911330
4、https://www.jianshu.com/p/60ba478f101d
5、https://www.cnblogs.com/sunyubin/p/9751412.html