日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Java-Python对比学习之构造器

發布時間:2024/3/26 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 puppy

python對構造器的訪問(將傳入參數綁定到類屬性的過程)是通過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对比学习之构造器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。