Java構造器的本質作用就是為對象初始化,即為實例變量初始化,賦初值;
而不是創建對象,創建對象時通過new關鍵字來完成的,當使用new 關鍵字時就會為該對象在堆內存中開辟一塊內存,只等構造器來初始化這塊內存,為實例變量賦初始值。在未賦初始值之前是默認值。看代碼中的構造器和編譯後構造器是不一樣的,編譯後的構造器包含了更多的內容。
構造器可以用來在初始化對象時初始化成員變量。
public class mystudent {
Integer age;
String name;
public static String addr = "beijing";
mystudent(Integer age,String name){
this.age = age;
this.name = name;
}
}
構造器,是用來初始化成員變量age 和 name的。
這裡的 age,與name是實例變量,類是不能直接調用,只能通過對象來調用。
但是 addr是 靜態變量,類是可以直接調用的
mystudent.addr
靜態變量和實例變量的區別是:
python 沒有構造器,但是有__new__ 與 __init__
__new__ 創建對象
__init__ 初始化對象
Python類變量、實例(成員)變量和局部變量
原文地址:
Python類變量、實例(成員)變量和局部變量_青果HA的博客-CSDN博客
下面介紹類變量的兩種定義方式、兩種讀取方式、在類裡面的調用方式
定義
1.類裡定義的,與構造函數、普通函數是一個級別縮進的。(下面例子裡的num)
2.在類外定義的,直接用類名.變量名新增類變量。(下面例子裡的myvar)
讀取
1.直接用類名的屬性 獲取:類名.類變量 (下面例子裡的Member.num和Member.myvar)
2.先實例化類,實例化對象的屬性 獲取 :實例對象.類變量 (下面例子裡的M.num和M.myvar)
調用
1. 在類裡面調用:類名.類變量,不能直接用類變量,即應為Member.num而不是num
# -*- coding: utf-8 -*-
class Member():
num=2 #類變量,可以直接用類調用,或用實例對象調用
def __init__(self,x,y):
self.x=x #實例變量(成員變量),需要它是在類的構造函數內以self.開頭來定義的
self.y=y
def add(self):
total=2 #局部變量
self.vara=3 # 雖是以self.給出,但並沒有在構造函數中進行初始化
self.varb=4
fina=(self.x+self.y)*total
return fina
def fuc(self,a,b):
self.varc=a #成員變量,他們在成員函數fuc()中定義
self.vard=b
self.x+=2
self.y+=2
self.vara+=3
self.varb+=Member.num
Member.myvar = 'huhuh'
print(Member.num,Member.myvar)
M=Member(1,2)
print(M.num,M.myvar)
(1)構造函數裡的成員變量:
定義:在__init__(self,成員變量)
讀取:只能實例對象.成員變量,不能類名.成員變量,即只能M.x不能Member.x
調用:構造函數的成員變量,顧名思義:在類實例化的時候,就需要給該變量賦值。類裡的普通函數可直接調用該變量,方式為:self.成員變量,
作用范圍:類裡面的全局變量,其值可以被其他函數修改
(2)普通函數裡的成員變量
定義:在類裡的普通函數def xxx(self,成員變量)
讀取:只能實例對象.成員變量,不能類名.成員變量,即只能M.vara不能Member.vara
調用:方式為self.成員變量,只有在類實例化後調用該普通函數,此時,該成員變量才會生,看下面的例子:必須先調用add函數後,fuc函數裡的self.vara和self.varb才會正常執行,不報錯。
作用范圍:類裡面的全局變量,其值可以被其他函數修改
局部變量相對就簡單很多了,跟不在類裡面的def函數的局部變量是一樣的。
作用范圍:該函數內部
總結:成員函數
1.不同點
(1)構造函數裡的成員變量,在類實例化之後,就可以使用
(2)在類裡普通函數裡的 成員變量,只能先調用該函數,才能使用該成員變量。
2.相同點:
(1)在類裡,都是全局的