1. 程式人生 > >面向物件(上)

面向物件(上)

1.      名次解釋:構造方法,抽象

答:(1)構造方法:具有與類相同的名稱;不含返回值;不能在方法中用 return 語句返回一個值;當自定義了構造方法後,編譯器將不再自動建立不帶引數的構造方法。

構造方法就是與類名相同的類方法。它的作用是可以用來初始化,每當使用new關鍵字建立一個物件,為新建物件開闢了記憶體空間後,java系統將自動呼叫構造方法初始化這個新建的物件。從構造方法的定義可知,構造方法專屬於類,而不屬於任何物件。

構造方法作用就是對類進行初始化。如果你沒有定義任何構造方法的形式,程式會為你取一個不帶任何引數的建構函式,那麼你產生類的對像時只能用不帶引數的方法,

如:class a {}//沒有任何建構函式。

也可以自己定義構造方法。

具體的例子如下:
class Person //人類{
public Person(String n,int a) //構造方法

{name = n; age = a;}
 private string name;
 private int age;}
static void main(String[] args){
Person p = new Person("張三",14);//這就是作用

}

(2)抽象:從被研究物件中捨棄個別的、非本質的或者與研究主旨無關的次要特徵;抽取與研究有關的共性內容進行考察,形成對研究問題正確的、簡明扼要的認識。

在java中抽象是一種過程,在這個過程中,資料和程式定義的形式與代表的內涵語言相似,同時隱藏了實現細節。抽象是一個概念或者想法不和任何特定的具體例項綁死。簡單地說:“抽象只從正確的角度,透露物件的某些相關細節。”抽象在任何程式語言中的許多方面起作用。從建立子程式到定義介面來,生成低階語言呼叫,例如設計模式。

面向物件的概念中,我們知道所有的物件都是通過類來描繪的,但是反過來卻不是這樣。並不是所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,這樣的類就是抽象類。抽象類往往用來表徵我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類是不能夠例項化的。  在

面向物件領域,抽象類主要用來進行型別隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模組可以操作一個抽象體。由於模組依賴於一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴充套件此模組的行為功能。熟悉OCP的讀者一定知道,為了能夠實現面向物件設計的一個最核心的原則OCP(Open-ClosedPrinciple),抽象類是其中的關鍵所在。

--------------------------------------------------------------------------------------------------------------------------

2.物件存於記憶體何處?宣告能引用物件的實質是什麼?

答:(1)物件位於堆記憶體中。

     (2) 宣告能夠引用物件的實質:在棧中保留了物件的地址。

java中記憶體主要包含4塊,即heap(堆記憶體)、stack(棧記憶體)、data segment(靜態變數或是常量存放區)、codesegment(方法區). 
堆記憶體中存放的是new出的物件,new出的物件只包含成員變數。 
棧記憶體中:存放的是區域性成員變數。對於基本的資料型別存放的是基本變數的值,而對於物件變數,存放的是堆記憶體的地址。 
靜態、常量區:存放的是靜態變數(類變數)或是常量。 
方法區:存放的是物件的方法。因此即使new出多個物件也是隻是存在一個方法。 
如 A a = new A(); A中含有一個work方法,2個成員變數a,b。那麼對應的記憶體分配為 
則 a是分配在棧記憶體中。裡面存放了一個指向堆記憶體中存放的new A()的地址。 
new A()會導致在堆記憶體中分配一塊空間,該記憶體中的A物件同時會含有a和b。 
work()方法會在codesegment區中分配記憶體。 
如果此時 A b = a;則表示把a的值複製給b,即b的值為a中儲存的地址

例如:Person per = new Person(); per這個new出來的物件是在堆記憶體中,當引用時是在棧中找到地址,這個棧地址指向堆記憶體

--------------------------------------------------------------------------------------------------------------------------

3.物件和基本資料型別作為引數傳遞時有什麼不同?

答:(1)基本資料型別作為引數在方法中傳遞的是值傳遞。

(2)物件是引用傳遞,當物件作為引數傳遞時,傳遞的是物件的地址。

基本資料型別在棧中進行分配,而物件型別在堆中進行分配。

值傳遞:方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際引數的值。
引用傳遞:也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,方法執行中形式引數值的改變將會影響實際引數的值。

傳值---傳遞基本資料型別引數

引用傳遞---物件作為引數
如果在方法中把物件(或陣列)作為引數,方法呼叫時,引數傳遞的是物件的引用(地址),即在方法呼叫時,實際引數把對物件的引用(地址)傳遞給形式引數。這是實際引數與形式引數指向同一個地址,即同一個物件(陣列),方法執行時,對形式引數的改變實際上就是對實際引數的改變,這個結果在呼叫結束後被保留了下來。

--------------------------------------------------------------------------------------------------------------------------

4.在自定義物件中寫finalize方法,看看什麼情況下finalize被呼叫。

答:類的Finalize方法,可以告訴垃圾回收器應該執行的操作,該方法從Object類繼承而來。在從堆中永久刪除物件之前,垃圾回收器呼叫該物件的Finalize方法。注意,無法確切地保證垃圾回收器何時呼叫該方法,也無法保證呼叫不同物件的方法的順序。即使一個物件包含另一個物件的引用,或者在釋放一個物件很久以前就釋放了另一個物件,也可能會以任意的順序呼叫這兩個物件的Finalize方法。如果必須保證採用特定的順序,則必須提供自己的特有清理方法。

--------------------------------------------------------------------------------------------------------------------------

5.物件在什麼條件下成為垃圾?什麼情況下釋放垃圾物件,如何證明一個物件被釋放了?

答:當一個物件有多個引用時,若所有引用都變成null時,物件沒有任何引用,成為垃圾。成為垃圾後,系統不會自動釋放物件所佔記憶體資源,而是在資源不夠情況下才進行釋放。物件不再佔有記憶體空間時說明物件被釋放了。

--------------------------------------------------------------------------------------------------------------------------

6.Final修飾符都有什麼作用:

答:以final修飾類屬性,則該屬性為常量;如果修飾方法,則方法稱為最終方法,在子類當中不能被覆蓋。

--------------------------------------------------------------------------------------------------------------------------

7.Static修飾符的屬性和方法有什麼特點

答:(1)static 修飾的成員方法表示靜態方法,可以直接通過類名來訪問。

     (2)static 修飾的程式程式碼塊表示靜態程式碼塊,當JAVA虛擬機器載入類時,就會執行該程式碼塊。

     (3)static 所修飾的成員變數和成員方法標明歸某個類所有,它不依賴於類的特定例項,被類的所有例項共享。

--------------------------------------------------------------------------------------------------------------------------

8.Application程式執行時,為什麼後面不能帶字尾名

答:Java application源程式檔案的副檔名為java.exe。在執行時,是先編譯後執行,執行一個類。

--------------------------------------------------------------------------------------------------------------------------

9.如何用eplipse將程式進行打包並匯入?

答:(1)Eplipse怎麼將程式打包?

百度:Eplipse怎麼將程式打包

(2)eplipse如何開啟jar包?

步驟如下:
1、右鍵點選你需要新增jar包的專案。
2、選擇“Properties”。
3、然後選擇對話方塊中的“Java Build Path”。
4、選擇“Libraries”選項卡,然後點選右邊的“Add External JARS“,然後找到你的jar所存放的路徑,選擇需要新增的jar包。
5、點選“OK”完成。
經過以上步驟即可新增好jar包。
注意:如果是新增系統所帶有的jar,在第4步的時候選擇“Add JARS”,其他步驟相同。

--------------------------------------------------------------------------------------------------------------------------

10.請在display函式中用遞迴方式輸出如圖形。


答:程式碼如下:

package 課後習題;
import java.util.Scanner;
public class di10ti {
	   static void    display (int n){
		if (n==1){
	    System.out.print("1  ");
	}
		else{
			for (int i=1;i<=n;i++){
				System.out.print(n);
				System.out.print("  ");
			}
			System.out.println("");	
			display(n-1);
		}
	}
	public static void main(String[] args) {
		int n;
		Scanner input=new Scanner(System.in);
        System.out.print("輸入行數n的值:");
        n=input.nextInt();
		display(n);
	}
}