黃艷峰 陳 濤
(商丘師范學院 計算機與信息技術學院,河南 商丘 476000)
?
Java構造方法解析
黃艷峰陳濤
(商丘師范學院計算機與信息技術學院,河南商丘476000)
摘要:構造方法是面向對象程序中在創建對象時系統自動調用的一個方法,與其他方法相比,該方法在語法和應用上都具有一些特殊性。基于此,重點介紹Java語言中構造方法的特點、定義及使用方法。
關鍵詞:Java;構造方法;面向對象
Java是面向對象的語言,類是構成Java程序的基本單元。面對一個特定的問題領域,需要抽象出該問題領域的對象,然后根據問題領域的需要,從這些對象身上抽象出屬性和方法,把它們包裝成類。而類只是對象的一個模板,要想實現其具體的功能,還要創建出該類的對象。創建一個類的對象的語法是:類名對象名=new構造方法([參數1,參數2,…….]);這條語句在執行時包含3個步驟:①在棧中為該對象名即對象的引用分配內存,也就是類名對象名這部分執行的操作;②利用new運算符在堆內存中為Java對象的各個屬性分配內存,并把該內存的首地址賦值給對象名,即=new這部分執行的操作;③調用構造方法完成對象的初始化,給對象的各個屬性賦初值。一個對象可能包含若干個屬性,需要若干條賦值語句,把這若干個賦初值的語句組合成一個方法在創建對象時一次性執行,這個方法就是構造方法[1]。
2.1構造方法的特點及定義
構造方法是一種比較特殊的方法,其特殊性主要體現在以下幾個方面:①構造方法的方法名與類名相同[2];②構造方法沒有返回值類型,在構造方法的方法體里不能出現return語句;③構造方法的調用通常在創建對象時由系統自動調用;④構造方法通常用來初始化類的非靜態屬性。
一個類中可以定義多個構造方法,既可以不帶參數也可以帶參數,如:
class Student{
String name;
int age;
Student(){
name="張三";
age=21;}}
public class TestConstructor{
public static void main(String[]args){
Student s1=new Student();
Student s2=new Student();}}
假如一個類中只定義一個無參的構造方法,如上例,那么創建出來的所有對象s1、s2的屬性值都一樣,這顯然不符合實際,為了創建出不同屬性值的對象,我們需要添加多個不同參數的構造方法,
class Student{
String name;
int age;
Student(){
name="張三";
age=21;}
Student(String n){
name=n;
age=23;}
Student(String n,int a){
name=n;
age=a;}}
再分別創建對象Student s1=new Student(“張三”,21);Student s2=new Student(“李四”,23);通過傳進不同的參數值,就可以創建出不同屬性值的對象。一個類中可以包含多個不同的構造方法,在一個構造方法里面可以調用同類其他的構造方法,對同類構造方法的調用,不能使用構造方法名,而是使用關鍵字this,如上例可以改成如下形式:
class Student{
String name;
int age;
Student(String n,int a){
name=n;
age=a;}
Student(String n){
this(n,23)}
Student(){
this(“張三”,21);}}
如果在一個類中沒有定義任何一個構造方法,則系統會自動創建一個參數為空,方法體也為空的默認構造方法,以滿足創建對象的需要,但是如果在程序中一旦定義了一個構造方法,系統不會再創建默認的構造方法。
2.2子類對父類構造方法的調用
構造方法不能繼承,但是在初始化子類對象時,為了確保繼承自父類的所有屬性被初始化,則在執行子類構造方法之前,一定要先對父類的構造方法進行調用[3]。子類對父類構造方法的調用分2種情況,一種是默認調用,即程序中不體現出來,這種情況下只能調用父類無參的構造方法,如果父類中沒有定義無參的構造方法(系統也不創建),那么一定要顯式調用。對父類構造方法的調用同樣也不能用方法名,而是用super()形式調用。如:
class Art{
Art(){
System.out.println("Art()constructor");}}
class Drawing extends Art{
Drawing(){
System.out.println("Drawing()constructor");}}c
public class Cartoon extends Drawing{
Cartoon(){
System.out.println("Cartoon()constructor");}
public static void main(String[]args){
Cartoon x=new Cartoon();}}
本例的輸出結果是Art()constructor,Drawing()con?structor,Cartoon()constructor,很顯然,在Cartoon類的構造方法中并沒有調用父類Drawing的構造方法,同樣在Drawing的構造方法中也沒有調用其父類Art的構造方法,這里對父類構造方法的調用是隱含的,是系統自動調用的。而如果把Drawing類的構造方法修改成Drawing (int i){System.out.println("Drawing()constructor");,則在Cartoon的構造方法中會提示找不到符號Drawing()的錯誤。顯然,這里系統調用的是Drawing(),即父類無參的構造方法。而此時Drawing中的帶參數的構造方法需要在Cartoon類中用super(6)(帶一個任意整數的參數,如1,2,3,…….)來顯式調用。
構造方法是一種特殊的方法,主要完成對象初始化的工作,為了滿足創建對象時的不同需求,在同一個類中可以定義多個不同參數的構造方法,即對構造方法進行重載,為了在子類中完成繼承自父類的屬性的初始化,在創建子類對象時需要首先調用父類的構造方法。
參考文獻:
[1]印旻.Java語言與面向對象程序設計(第2版)[M].北京:清華大學出版社,2013.
[2]潘浩.Java程序設計教程[M].北京:北京郵電大學大學出版社,2008.
[3]Y.Daniel Liang.Java語言與面向對象程序設計基礎篇[M].李娜譯.北京:機械工業出版社,2012.
中圖分類號:TP312
文獻標識碼:A
文章編號:1003-5168(2016)02-0037-02
收稿日期:2016-01-27
作者簡介:黃艷峰(1977-),女,副教授,研究方向:計算機應用。
Analysis of Java Constructor
Huang YanfengChen Tao
(College of Computer and Information Technology,Shanqiu Normal University,Shangqiu Henan 476000)
Abstract:Construcor is a method that is automatically called when the object is created in the object orient?ed program,and the method has some special characteristics in grammar and application compared with oth?er methods.Based on this,this paper mainly introduced the characteristics,definition and using method in Java language.
Keywords:Java;constructor;object-oriented