類和對象 類是某一批對象的抽象,可以把類理解成某種概念。對象是一個具體存在的實體。類和對象是面向對象的核心。 類定義的是多個實例的特征,類不是具體存在,實例才是具體存在。 定義類(class)的語法: [修飾符] class 類名 { 零個到多個構造器定義.... 零個到多個成員變數.... 零個到 ...
類和對象
類是某一批對象的抽象,可以把類理解成某種概念。對象是一個具體存在的實體。類和對象是面向對象的核心。
類定義的是多個實例的特征,類不是具體存在,實例才是具體存在。
定義類(class)的語法:
[修飾符] class 類名
{ 零個到多個構造器定義....
零個到多個成員變數....
零個到多個方法....}
要點:1.三種常見的成員:構造器(new關鍵字調用) 成員變數 方法
2.類名由一個或多個有意義的詞連接而成,每個單詞首字母大寫,其餘小寫。
3.修飾符可以是public final abstract或省略
定義成員變數(field)的語法:
[修飾符] 類型 成員變數名 [=預設值];
要點:1.成員變數名第一個單詞首字母小寫,後面每個單詞首字母大寫,其餘小寫。
2.類型可以是基本類型,也可以是引用類型。
定義方法的語法
[修飾符] 方法返回值類型 方法名(形參列表)
{方法體}
要點:方法名和成員變數的規則相同,通常選英語動詞。
static是一個特殊的關鍵字,可修飾方法成員變數等成員。static修飾的成員屬於類本身而不屬於該類的單個實例,也叫類變數和實例變數(靜態變數和非靜態變數)。靜態成員不能訪問非靜態成員。
構造器是一種特殊的方法。
[修飾符] 構造器名(形參列表)
{方法體}
要點:構造器名必須與類名相同
類的作用:定義變數 創建對象 調用類方法或訪問類變數
對象的產生和使用
創建對象的根本途徑是構造器,通過new關鍵字來調用某個類的構造器即可創建這個類的實例。
例:Persn p=new Person();//定義p變數的同時為p變數賦值
類或實例訪問方法和成員變數的語法:類.類變數|方法 實例.實例變數|方法
static修飾的成員變數,可通過類和實例調用。沒有static修飾的方法和成員變數,只能通過實例來調用。
Person p=new Person(); 這段代碼創建了Person對象,對象賦值給p變數。
person對象賦給一個引用變數的示意圖
person類型的變數實際是一個引用,被存放在棧記憶體里。指向實際的person對象
真正的person對象存放在堆記憶體中
java程式不允許直接訪問堆記憶體中的對象,只能通過該對象的引用操作該對象,當訪問p引用變數的成員變數和方法時,實際是訪問p所引用對象的成員變數和方法。
對象的this引用
this關鍵字的最大作用,就是讓類中的一個方法,訪問該類里的另一個方法或實例變數。
this關鍵字總是指向調用該方法的對象。
大部分時候,一個方法訪問該類中定義的其他方法,成員變數時加不加this首碼效果完全一樣。
方法方法不能獨立定義,方法必須屬於類或對象。
同一個類里的一個方法調用另一個方法時,如被調方法是普通方法,預設使用this作為被調者,如被調方法是靜態,預設使用類作為調用者。
java里方法的參數傳遞只有一種:值傳遞 將實際參數的副本傳入方法內而參數本身不受影響。
參數副本分為基本類型的參數和引用類型(地址)的參數
1 public class PrimitiveTransferTest 2 { 3 public static void swap(int a , int b) 4 { 7 int tmp = a; 8 a = b; 10 b = tmp; 12 System.out.println("swap方法里,a的值是" 13 + a + ";b的值是" + b);} 14 public static void main(String[] args) 16 { 17 int a = 6; 18 int b = 9; 19 swap(a , b); 20 System.out.println("交換結束後,變數a的值是" 21 + a + ";變數b的值是" + b); }
1 class DataWrap 2 { 3 int a; 4 int b; 5 } 6 public class ReferenceTransferTest 7 { 8 public static void swap(DataWrap dw) 9 { 10 // 下麵三行代碼實現dw的a、b兩個成員變數的值交換。 11 int tmp = dw.a; 13 dw.a = dw.b; 15 dw.b = tmp; 17 System.out.println("swap方法里,a成員變數的值是" 18 + dw.a + ";b成員變數的值是" + dw.b); 19 // 把dw直接賦為null,讓它不再指向任何有效地址。 20 dw = null; 21 } 22 public static void main(String[] args) 23 { 24 DataWrap dw = new DataWrap(); 25 dw.a = 6; 26 dw.b = 9; 27 swap(dw); 28 System.out.println("交換結束後,a成員變數的值是" 29 + dw.a + ";b成員變數的值是" + dw.b); 30 }
成員變數和局部變數成員變數是在類里定義的變數,局部變數實在方法里定義的變數。
只要類存在,程式可以訪問該類的類變數 類.類變數
只要實例存在,程式可以訪問該實例的實例變數 實例.實例變數
類變數也可以讓該類的實例來訪問 實例.類變數
通過實例修改類變數的值,會導致該類的其他實例訪問這個類變數時也獲得被修改的值。
java允許局部變數和成員變數同名,如果方法里的局部變數和成員變數同名,局部變數會覆蓋成員變數,若需在方法里調用被覆蓋的成員變數,則可使用this(實例變數)或類名(類變數)來調用。
成員變數在記憶體中的運行機制