面向物件(上)
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中抽象是一種過程,在這個過程中,資料和程式定義的形式與代表的內涵語言相似,同時隱藏了實現細節。抽象是一個概念或者想法不和任何特定的具體例項綁死。簡單地說:“抽象只從正確的角度,透露物件的某些相關細節。”抽象在任何程式語言中的許多方面起作用。從建立子程式到定義介面來,生成低階語言呼叫,例如設計模式。
在面向物件的概念中,我們知道所有的物件都是通過類來描繪的,但是反過來卻不是這樣。並不是所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,這樣的類就是抽象類。抽象類往往用來表徵我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類是不能夠例項化的。 在
--------------------------------------------------------------------------------------------------------------------------
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);
}
}