java基礎(二)
、面向對象基礎
- 類與對象
- 封裝
- 構造方法
- 方法
- 重載
- 對象數組
- this關鍵字
- static關鍵字
1.1類與對象
類:類是抽象的,概念上的,共性的,是對象的模板
對象:個體,具體的,可以看見的,對象是個性的,是該類事物的每個個體,也稱為類的實例。
類的組成:
- 方法
- 屬性
對象的創建
- 類名 對象名= new 類名()
對象的引用傳遞問題
- 註意引用的是對象堆內存的空間
1.2封裝
面向對象的特性:封裝,繼承,多態
封裝的概念:使用private實現類的封裝,用private關鍵字修飾屬性,修飾方法,private的含義是私有的,使用private修飾的方法和屬性不能被外部直接訪問。
封裝的特性:通過使用封裝的屬性,要通過get,set方法來獲得和設值。
1.3構造方法的問題
構造方法的作用:構造方法的作用主要是用來構造對象並且為對象的屬性賦值。構造方法的定義規則:
- 無需任何的放回值類型
- 方法名稱必須和類重名
1.4方法
方法的定義
public|private|protected|默認 + static|默認|synchroized|native|abstract+返回值類型|void|空+方法名稱(參數)+ throws Exception{ 方法體 }
方法的調用:
- 如果是普通方法,通過對象去調用
- 如果是構造方法,通過實例化去調用
- 如果是靜態方法,可以通過類名直接訪問
2.4對象數組
以類作為數組的類型,以對象作為數組的元素
Person p[] = new Person[10];//一類作為數組的類型,元素就是對象 for (int j = 0; j < p.length; j++) { Person px = new Person("張三",20+j); p[j] = px; } for (int j = 0; j < p.length; j++) { Person per = p[j]; System.out.println(per.getName()+"===="+per.getAge()); }
2.5方法的重載
在同一個類中,方法的名稱相同,返回值的類型相同,但是參數的個數,類型,順序不同就叫做重載,重載是面向對象多態性的一個體現。
//吃飯 public void eat(){ System.out.println(name + "在吃飯"); } public void eat(int x){ System.out.println(name + "在吃飯,吃了"+ x +"碗。"); }
2.6this的關鍵字的用法
this關鍵字可以表示當前對象
this關鍵字可以表示當前類的屬性
this關鍵字可以表示調用當前類的方法
this關鍵字調用當前類的構造方法
2.7static關鍵字
- static變量的聲明和使用
- static方法的聲明及使用
- static方法塊的聲明及使用
static變量:使用static修飾的變量就叫做靜態變量
static方法:使用static修飾的方法就叫做靜態方法
public class OopDemo01 { static int score = 70;//靜態變量 double salary = 5000.00;//普通變量 public static void add(){//靜態方法 //eat();靜態方法中不能調用非靜態方法 System.out.println(score); //System.out.println(salary);靜態方法不能調用非靜態變量 } public void eat(){//普通方法 add();//非靜態方法可以調用靜態方法 System.out.println(score);//普通方法可以調用靜態變量 System.out.println(salary); } public static void main(String[] args) { }
對於靜態方法調用的問題
- 靜態方法中不能調用非靜態方法,靜態方法不能調用非靜態變量
- 非靜態方法可以調用靜態方法,普通方法可以調用靜態變量
棧:保存屬性(變量)名稱
堆:保存屬性(變量)值
全局數據區: static修飾的變量
全局代碼區:static修飾的方法
- 代碼塊:使用一對{}圍起來的就是代碼塊:
- 普通代碼塊:寫在方法中的語句
- 構造塊(實例塊):直接寫在類中的語句,優於構造方法先執行,在實例化多個對象的時候,構造塊執行多次
- 靜態塊:直接寫在類中,使用static修飾,是優於構造塊先執行,在實例化多個對象的時候,靜態塊只執行一次
面向對象高級部分
- 繼承
- 抽象類
- 接口
- 多態
2.1繼承
繼承的作用:
- 通過繼承可以簡化子類的定義
- 擴展子類的功能
子類通過extends關鍵字繼承父類
繼承的特點:子類可以繼承父類一切非私有的屬性和方法
繼承的規定:
- java只支持單繼承,一個類不能同時有多個父類(一個人只有一個父親一樣)
- java支持多層繼承,一個類繼承自父類,父類也可以自爺爺類
子類的實例化過程:實例化子類對象的時候會先調用父類的構造方法,說明父類也進行了實例化對象操作,實際上調用父類的構造方法構造父類對象就是為子類對象開辟空間,而且可以為父類的屬性初始值。
super關鍵字的使用:父類也稱為超類()
- super關鍵字可以調用父類的屬性(非私有)
- super可以調用父類的方法(非私有)
- super關鍵字可以調用父類的構造方法(必須放在首行)
方法的復寫()
方法的重寫的定義:方法的返回值的類型,方法名稱,方法裏的參數的個數,順序,類型一致,就是方法的復寫,子類復寫父類的方法,調用子類的方法,擴展父類的屬性,復寫分類的方法子類的訪問權限必須要大於等於父類的方法,父類的方法不能為private。
復寫和重載的區別:
序號 |
重載 |
覆寫 |
1概念 |
名稱相同,參數的個數類型順序不同 |
方法名稱相同,訪問權限不小於父類被覆寫方法,參數相同,返回值類型相同 |
2範圍 |
在同一類中 |
在繼承關系中,子類覆寫父類方法 |
訪問修飾符
位置 |
private |
默認 |
protected |
public |
同類 |
V |
V |
V |
V |
同包的類 |
X |
V |
V |
V |
不同包的字類 |
X |
X |
V |
V |
不同包且不是字類 |
X |
X |
X |
V |
public|private|protected|默認 + static|默認|synchroized|native|abstract+返回值類型|void|空+方法名稱(參數)+ throws Exception{ 方法體 }
2.3抽象類
final :在java中final可以修飾變量方法,類
- 使用final修飾的變量就是常量,只能賦值一次,而且常量一般使用大寫字母來表示常量名稱。
- 使用final修飾的方法不能被子類復寫
- 使用final修飾的就是太監類,不能擁有子類
- 抽象類:使用abstract修飾的類就是抽象類
- 抽象方法:使用abstract修飾的方法就是抽象方法
package com.wanczy.oopHightLevelDemo; public abstract class OopDemo003 {//定義就是抽象類 public abstract void eat();//聲明抽象方法 }
抽象方法只需要聲明不需要實現,有一個抽象方法必須定義為抽象類
抽象類和普通類相比區別:抽象類比普通類多了抽象方法,普通類中的所有定義都可以在抽象類中使用
抽象類的使用規則:
- 抽象類本身不能實例化
- 抽象類中的抽象方法只需要聲明,不需要實現
- 含有抽象方法的類必須聲明為抽象類
- 抽象類必須要有子類,不然抽象類沒有任何意義,抽象類的子類必須要復寫抽象類中的全部抽象方法。
- 抽象類中可以有抽象方法
- 抽象類中不可以用final聲明
範例:現在有兩類員工,一類是技術類,一類是銷售類,兩種員工的提升工資的方式不一樣,技術員工類按照崗位等級提升,銷售員工按照上一年度銷售業績來提升工資
package com.wanczy.abstractDemo; public abstract class Employee { private String name; private double salary;//工資 public Employee() { super(); // TODO Auto-generated constructor stub } public Employee(String name, double salary) { super(); this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public abstract void updSalary();//提升工資的抽象方法 }
package com.wanczy.abstractDemo; public class TechEmployee extends Employee{ private String post;//崗位等級 @Override public void updSalary() { // TODO Auto-generated method stub double salary = super.getSalary(); if(this.post .equals("高級工程師")){ super.setSalary(salary*1.05); }else if(this.post.equals("中級工程師")){ super.setSalary(salary*1.1); }else if(this.post.equals("初級工程師")){ super.setSalary(salary*1.15); } } public String getPost() { return post; } public void setPost(String post) { this.post = post; } public TechEmployee(String post) { super(); this.post = post; } public TechEmployee() { super(); // TODO Auto-generated constructor stub } public TechEmployee(String name, double salary,String post) { super(name, salary); this.post = post; // TODO Auto-generated constructor stub } }
package com.wanczy.abstractDemo; public class OopDemo01 { public static void main(String[] args) { Employee e = new SaleEmployee("長桑",3000,100); e.updSalary(); System.out.println(e.getSalary()); } }
通過以上程序,我們可以發現,如果以後出現其他的員工類型,提升工資的方式不同,可以編寫抽象類的字類完成,不需要更改頂層設計。也就是說抽象類的作用就是在於可以方便程序的擴展。
2.4接口
接口的聲明使用interface,接口只有常量和抽象方法;
package com.wanczy.oopDemo; public interface InterfaceDemo01 { //常量 //抽象方法 public abstract void eat(); public abstract void run(); }
如果說一個抽象類只有抽象方法和常量的話,我們就可以使用接口來表示。接口中沒有子類的概念,實現類,實現類通過implements實現接口,必須覆寫接口中所有的抽象方法。
接口的使用規則:
- 接口中訪問權限永遠都是public,public可以省列,省列後依然時public
- 接口中的方法都是抽象方法,可以省列abstract,省列後依然是abstract方法
- 接口中的常量可以省列final,省列後依然是常量
- 接口在程序中叫實現,接口必須通過實現類實現,也必須要有實現類,不然接口沒有意義
- 接口本身不能實例化
- 接口與接口之間可以繼承,一個接口可以同時繼承多個父接口,子接口中繼承了父接口中所有抽象方法和常量
- 實現類也可以實現多個接口,如果實現的多個接口中,有相同的抽象方法,那麽實現類只需要復寫一次
抽象類與接口的區別
|
抽象類 |
接口 |
相似 |
不能直接實例化,抽象類通過子類實例化,接口通過實現類實例化 |
|
不同 |
包含抽象方法、一般方法、變量、長流昂、構造方法 |
常量和抽象方法 |
抽象類可以實現接口 |
接口不繼承抽象類 |
|
單繼承的局限性 |
多繼承多實現 |
2.7多態
多態的核心就是子類對象作為父類對象來使用,抽象類的子類對象作為抽象類對象使用,實現類對象作為接口的對象來使用。
3總結
理解抽象類和接口的區別
理解重載和覆寫的區別
熟記繼承的特點以及規定(super關鍵字的使用)
java基礎(二)