JAVA中构造器和方法的区别点
要學(xué)習(xí)Java,你必須理解構(gòu)造器。因?yàn)闃?gòu)造器可以提供許多特殊的方法,這個(gè)對于初學(xué)者經(jīng)常混淆。但是,構(gòu)造器和方法又有很多重要的區(qū)別。
?下面將簡單介紹一下 ,最后用一個(gè)表作了些簡單的總結(jié)。?
功能和作用的不同
構(gòu)造器是為了創(chuàng)建一個(gè)類的實(shí)例。這個(gè)過程也可以在創(chuàng)建一個(gè)對象的時(shí)候用到:Platypus p1 = new Platypus();?
相反,方法的作用是為了執(zhí)行java代碼。?
修飾符,返回值和命名的不同
構(gòu)造器和方法在下面三個(gè)方便的區(qū)別:修飾符,返回值,命名。和方法一樣,構(gòu)造器可以有任何訪問的修飾: public, protected, private或者沒有修飾(通常被package 和 friendly調(diào)用). 不同于方法的是,構(gòu)造器不能有以下非訪問性質(zhì)的修飾: abstract, final, native, static, 或者 synchronized。?
返回類型也是非常重要的。方法能返回任何類型的值或者無返回值(void),構(gòu)造器沒有返回值,也不需要void。?
最后,談?wù)剝烧叩拿?gòu)造器使用和類相同的名字,而方法則不同。按照習(xí)慣,方法通常用小寫字母開始,而構(gòu)造器通常用大寫字母開始。構(gòu)造器通常是一個(gè)名詞,因?yàn)樗皖惷嗤?#xff1b;而方法通常更接近動(dòng)詞,因?yàn)樗f明一個(gè)操作。?
"this"的用法
構(gòu)造器和方法使用關(guān)鍵字this有很大的區(qū)別。方法引用this指向正在執(zhí)行方法的類的實(shí)例。靜態(tài)方法不能使用this關(guān)鍵字,因?yàn)殪o態(tài)方法不屬于類的實(shí)例,所以this也就沒有什么東西去指向。構(gòu)造器的this指向同一個(gè)類中,不同參數(shù)列表的另外一個(gè)構(gòu)造器,我們看看下面的代碼:?
public class Platypus {?
String name;?
Platypus(String input) {?
name = input;?
}?
Platypus() {?
this("John/Mary Doe");?
}?
public static void main(String args[]) {?
Platypus p1 = new Platypus("digger");?
Platypus p2 = new Platypus();?
}?
}?
在上面的代碼中,有2個(gè)不同參數(shù)列表的構(gòu)造器。第一個(gè)構(gòu)造器,給類的成員name賦值,第二個(gè)構(gòu)造器,調(diào)用第一個(gè)構(gòu)造器,給成員變量name一個(gè)初始值 "John/Mary Doe".?
在構(gòu)造器中,如果要使用關(guān)鍵字this,那么,必須放在第一行,如果不這樣,將導(dǎo)致一個(gè)編譯錯(cuò)誤。?
"super"的用法?
構(gòu)造器和方法,都用關(guān)鍵字super指向超類,但是用的方法不一樣。方法用這個(gè)關(guān)鍵字去執(zhí)行被重載的超類中的方法。看下面的例子:?
class Mammal {?
void getBirthInfo() {?
System.out.println("born alive.");?
}?
}?
class Platypus extends Mammal {?
void getBirthInfo() {?
System.out.println("hatch from eggs");?
System.out.print("a mammal normally is ");?
super.getBirthInfo();?
}?
}?
在上面的例子中,使用super.getBirthInfo()去調(diào)用超類Mammal中被重載的方法。?
構(gòu)造器使用super去調(diào)用超類中的構(gòu)造器。而且這行代碼必須放在第一行,否則編譯將出錯(cuò)。看下面的例子:?
public class SuperClassDemo {?
SuperClassDemo() {}?
}?
class Child extends SuperClassDemo {?
Child() {?
super();?
}?
}?
在上面這個(gè)沒有什么實(shí)際意義的例子中,構(gòu)造器 Child()包含了 super,它的作用就是將超類中的構(gòu)造器SuperClassDemo實(shí)例化,并加到 Child類中。?
編譯器自動(dòng)加入代碼
編譯器自動(dòng)加入代碼到構(gòu)造器,對于這個(gè),java程序員新手可能比較混淆。當(dāng)我們寫一個(gè)沒有構(gòu)造器的類,編譯的時(shí)候,編譯器會(huì)自動(dòng)加上一個(gè)不帶參數(shù)的構(gòu)造器,例如:public class Example {}?
編譯后將如下代碼:?
public class Example {?
Example() {}?
}?
在構(gòu)造器的第一行,沒有使用super,那么編譯器也會(huì)自動(dòng)加上,例如:?
public class TestConstructors {?
TestConstructors() {}?
}?
編譯器會(huì)加上代碼,如下:?
public class TestConstructors {?
TestConstructors() {?
super;?
}?
}?
仔細(xì)想一下,就知道下面的代碼?
public class Example {}?
經(jīng)過會(huì)被編譯器加代碼形如:?
public class Example {?
Example() {?
super;?
}?
}?
繼承
構(gòu)造器是不能被繼承的。子類可以繼承超類的任何方法。看看下面的代碼:?
public class Example {?
public void sayHi {?
system.out.println("Hi");?
}?
Example() {}?
}?
public class SubClass extends Example {?
}?
類 SubClass 自動(dòng)繼承了父類中的sayHi方法,但是,父類中的構(gòu)造器 Example()卻不能被繼承。
轉(zhuǎn)載于:https://www.cnblogs.com/fage123/p/7507208.html
總結(jié)
以上是生活随笔為你收集整理的JAVA中构造器和方法的区别点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 敏捷与DevOps整合之道
- 下一篇: MyBatis基础:MyBatis关联查