1. 程式人生 > >java對象與類

java對象與類

pub blog 過程 常見 程序設計 設計 arr 數據類型 效果

1.構造器總是伴隨著new操作符的執行而被調用,而不能對一個已經存在的對象調用構造器來達到重新設置實例域的目的。

2.靜態域與靜態方法

如果將類定義為static,每一個類只有一個這樣的域。靜態域是屬於類的,而不屬於任何獨立的對象,其又被稱為類域。

靜態方法是一種不能向對象實施操作的方法,但是他可以訪問自身類中的靜態域。

main方法也是一個靜態方法,main方法不對任何對象進行操作,實際上,在啟動程序時還沒有任何一個對象。靜態的Main方法將執行並創建所需要的對象。

3.方法參數

常見的將參數傳遞給方法的方式有2種:按值調用,按引用調用

按值調用表示方法接受的是調用者提供的值,按引用調用表示方法接受的是調用者提供的變量地址;

java程序設計語言總是采用按值調用,也就是說,方法得到的是所有參數值得一個拷貝,特別的,方法不能修改傳遞給他的任何參數變量得內容

例如

public static void tripleValue(double x){
    x=3*x;
}

然後,調用這個方法

double percent=10;
tripleValue(percent);

在調用完這個方法後,percent的值還是10.

下面來看一下上面代碼的具體執行過程

a.首先,x被初始化為percent值得一個拷貝(也就是10)

b.然後,x在被乘3後變成30,但是percent 依然是10

c.在這個方法中,x變為了30,但是在方法結束之後,參數變量x不再使用,percent依然還是10.

一般來講,方法參數共有兩種類型:

a.基本參數類型(數字,布爾值)

b.對象引用

從上面可以看出,一個方法是不能修改一個基本數據類型的參數,但是當參數為對象引用就不一樣了

例如,下面程序實現將一個員工的工資提升兩倍

1 public static void tripleSalary(Employee x)
2 {
3     x.raiseSalary(200);
4 }

當調用

1 harry=new Employee(...);
2 tripleSalary(harry);

後,員工的工資加倍了

下面來看一下具體的執行過程

a.x被初始化為harry值的拷貝,這裏是一個對象的引用

b.raiseSalary方法應用於這個對象引用。x和harry同時引用的那個Employee對象的工資提升了200%

c.方法結束後,參數變量x不在使用,當然,對象變量harry繼續引用那個工資增至3倍的員工對象

java對於對象采用的也是值傳遞的方式,但是不少人認為采用的為引用調用,下面給出一個反例

//首先,編寫一個交換兩個員工對象的方法;
public static void swap(Employee x,Employee y)
{
    Employee temp=x;
    x=y;
    y=temp;
}

如果java對於對象采用的是按引用調用,那麽這個方法就能夠實現交換數據的效果

Employee a=new Employee("Alice",...)
Employee b=new Employee("Bob",...)
swap(a,b)

但是,方法並沒有改變儲存在變量a和變量b中的對象引用,swap方法的參數x,和參數y被初始化為兩個對象引用的拷貝,這個方法交換的是這兩個拷貝。

//x refers to Alice,y to Bob
Employee temp=x;
x=y;
y=temp;

//now x refers to Bob,y to Alice

兩個拷貝被成功交換了,但隨著方法的結束,參數變量隨之被丟棄,原來的a,b 變量仍保留方法調用之前所引用的對象,實質上,對象引用是按值傳遞的

總結一下java中方法參數的使用情況:

a.一個方法不能修改一個基本參數類型的參數(即數值型,布爾型)

b.一個方法可以改變一個對象參數的狀態

c.一個方法不能讓對象參數引用一個新的對象

java對象與類