Java-Python对比学习之构造器
構造器?
構造器是一種特殊的方法,方法的本質是類中的函數,所以構造器還是一種特殊的函數。?
既然是方法,此方法的作用是什么??既然是特殊的方法,特殊的地方究竟是哪里呢?
在學習過的python中有沒有類似的構造器呢?他們的作用是相同的嗎?在后面一一解答.
在初次學習python的過程中并沒有接觸到構造器這一概念,但存在一個類的---構造方法,"__init__()"。
?Java篇
Java中構造器的相關知識
1.構造方法有兩類:
????????不帶參數的構造方法
public class Puppy {public Puppy(){System.out.println("無參數構造器");}public static void main(String[] args) {Puppy myPuppy = new Puppy();} }//輸出結果: 無參數構造器? ? ? ? 帶有參數的構造方法
public class Puppy {public Puppy(int age,String name ){System.out.println(age);System.out.println(name);}public static void main(String[] args) {Puppy hisPuppy = new Puppy(16,"lion");} } //輸出: //16 //lion總結:
1.創建格式:
權限修飾符 類名 () {
????????????????????????????????//code?
???????????????????????????????}?
2.兩個注意:
????????注意類名一致
????????注意權限修飾符不能錯用成 void訪問控制符
2.構造器是類所必須的嗎??
沒有構造器,類也能正常構建并使用,難道Java構造器真的不是必須的嗎?
顯式構造函數:自定義類的初始屬性
隱式構造函數:java提供的默認空構造函數
事實上,沒有構造器,編譯器會提供默認的為空構造函數 代碼等價于上面第2處的注釋代碼
既然如此,構造函數起的作用是什么呢?
構造器是為類服務的,一個類是由屬性和方法構成的,而方法是屬性的調用.
那么是不是構造器就創建了整個對象呢?
不是,構造器只是用來初始化變量的
初始化變量是指讓某個變量從類創建后就存在
例如 "人的胎記"
那究竟是誰創建了整個對象呢?
簡單來說使用new關鍵詞時,對象就被創建了
Puppy mypuppy = new Puppy?
執行這一語句相當于:
創建對象Puppy并交給構造器初始化屬性然后返回給對象
接著Puppy和myPuppy關聯起來
?3.一個類中只能有一個函數嗎?
? ? ? ? 清楚了類中的構造器作用 那么一個類中只能有一個構造函數嗎? 如果有多個作用一樣嗎?
有必要用多個構造函數嗎?如果有必要,作用是什么?
public class Puppy {public Puppy(){System.out.println("hello");}public Puppy(String name){System.out.println("hello"+name);}public Puppy(int age){System.out.println("年齡"+age);}public static void main(String[] args) {Puppy myPuppy = new Puppy();Puppy hisPuppy = new Puppy("tom");Puppy herPuppy = new Puppy(19);} }
?
?結論:
1.沒有參數類型只能有一個
2.有參數類型 同一個參數只能有一個
//關于構造重載等問題后續學習后添加到筆記內容
?4.既然是函數,能用返回值嗎?
public class Puppy {int ns;public Puppy(){n = 2;return n;}public static void main(String[] args) {Puppy myPuppy = new Puppy();} }?
?構造器是不允許有顯式return的的,那隱式return呢?自己有return嗎?
總結:
構造器不允許顯式return,但自己內部會有返回值 ?返回的是該類的實例?
關于return還有一點:正常的函數 使用return可以提前退出函數,那么構造方法里面是否也可以呢?
public class Puppy {int age;public Puppy(int num_age){if (age == 0){return;}//如果age為0 退出初始化構造this.age = num_age;int num =20;System.out.println(num);}public int getAge(){this.age = age;return this.age;}public static void main(String[] args) {Puppy myPuppy = new Puppy(3);System.out.println(myPuppy.getAge());} } //最后輸出的結果是0?事實證明 return是可以退出構造的
?5.類中的方法可以調用,構造器可以被調用嗎?
? ? ? ? 構造器是不可以被類調用的,原因其實在上面已經提過了
初始化值然后將值返回給對象 是和new關鍵詞一起執行的
? ? ? ? 不能被類調用那傳入構造器的參數究竟怎么使用的呢?
1.通過this將類中的實例變量與傳入的參數關聯起成為類的屬性(this.事先聲明的全局變量="傳入的參數")
2.成為類的屬性被其他方法調用
來看看下面的代碼
public class Puppy {int age;int nums;public Puppy(int num_age){this.age = num_age;//傳入的參數和開始聲明的實例變量關聯了起來int num =20;//構造器中的局部變量 System.out.println(num);//輸出局部變量}public void PuppyAgeGet(){System.out.println(this.age);}public static void main(String[] args) {Puppy myPuppy = new Puppy(7);//初始化對象 由于構造器中有輸出所以會輸出20System.out.println(myPuppy.age);//調用已經綁定參數的屬性 所以輸出7System.out.println(myPuppy.nums);//我們的nums參數沒有指定 被默認初始化為0myPuppy.PuppyAgeGet();//傳入的參數變為屬性被方法調用} }更多變量知識在其他筆記中會有所說明
6、static、final、synchronized、native能修飾構造器嗎?
7. 初始化時可以執行其他操作嗎?
Python篇
1.python的"init"可以出現多個嗎?
前面提到"__init__(self)"函數,他的作用類似構造器,這種以"__"開頭和結尾的函數稱為魔法函數
關于雙前導和雙末尾下劃線的用法:
以雙下劃線開頭和結尾的變量是不會被python解釋器所修改的是內置在python中的變量
我們注意到,python中__init__(self)和我們java中的構造器有相似的地方?
class Puppy:def __init__(self):print("無參數構造器")def __init__(self, name):print("有參數構造器")my_puppy = Puppy() your_Puppy = Puppy("tom") //報錯提示 ''' Traceback (most recent call last):File "c:\Users\lh\Desktop\學習\python_work\作業\study.py", line 9, in <module>my_puppy = Puppy() TypeError: __init__() missing 1 required positional argument: 'name' '''第一個函數實例化時缺少參數
當我們為其添加參數后,兩個實例化輸出的結果都是”有參數構造器“
由此可知:
Python __init(self)__方法只能出現一個,如果出現多個會執行最下面的那個(解釋器由上而下執行)
2."init"能夠return嗎?
class Puppy:def __init__(self):self.name = "puppy"return self.namepuppy=Puppy() puppy.name?結果:
Traceback (most recent call last):File "c:\Users\lh\Desktop\學習\python_work\作業\study.py", line 10, in <module>puppy = Puppy() TypeError: __init__() should return None, not 'str'init的返回值只能是none而不能是字符串?
?3.init能被類或者實例對象調用嗎?
與java構造器類似,init內的代碼不能夠被類或者實例對象調用,可以通過self 類似java中的this與實例化對象相互綁定,成為實例對象的屬性。
python對參數的訪問
class Puppy:def __init__(self, age):self.name = "puppy"self.age = agepuppy = Puppy(2) print(puppy.age, puppy.name) // 結果:2 puppypython對構造器的訪問(將傳入參數綁定到類屬性的過程)是通過self來執行?
4.java有new關鍵字,python沒有是不是說明python對象的構造就是由init來實現的呢?
其實不是,python中其實也是有類似new關鍵字的
"__new__(cls,arg*)" new方法是一個靜態方法
puppy = Puppy()
當解釋器遇到Puppy()時調用內置函數__new__創建對象 然后調用__init__方法
當類中沒有__init__方法時創建一個默認為空的__init__
當內部有__new__時繼續創建對象 用new里面的屬性返回給對象 覆蓋了原先已經初始化的內容 這與出現多個init后處理原則相同
這樣處理也體現了靜態方法的特性
暫時總結這么多,等學的更深,用的更多再來添加補充,如果上面有錯誤不足,歡迎指正
//java為什么這樣設計?python為什么沒有呢?
總結
以上是生活随笔為你收集整理的Java-Python对比学习之构造器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java设置器或访问器_java里面的构
- 下一篇: python力扣刷题记录——204. 计