九、Java面對物件
面向物件程式設計(OOP)
java的核心思想
面向過程
思想:
- 步驟清晰簡單,第一步做什麼,第二步做什麼...
- 適合處理一些較為簡單的問題
面向物件
-
思想:
-
分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考,最後,對分類下的細節進行面向過程的思索
-
適合處理複雜的問題,多人協作的問題
-
-
本質:以類的方式組織程式碼,以物件的組織(封裝)資料
-
抽象
-
三大特性:
-
封裝
-
繼承
-
多型
-
方法回顧
方法定義
- 修飾符 public
- 返回型別 void、 int、 String
- break和return的區別 break:跳出switch 結束迴圈 return:方法結束,返回一個結果
- 方法名 :見名知意 駝峰命名法
- 引數列表
- 異常丟擲
方法呼叫
-
靜態方法
-
非靜態方法
//靜態方法 static 和類一起載入的 直接呼叫其他類的方法 //非靜態方法 例項化類後呼叫
-
形參和實參
-
值傳遞和引用傳遞
引用傳遞:物件,本質還是值傳遞
值傳遞:傳遞過去改變,本身值不會改變
-
this關鍵字
類與物件的關係
- 類是一種抽象的資料型別
- 物件是抽象概念的具體例項
建立物件
類是抽象的
類例項化後(new)會返回一個自己的物件
-
使用new關鍵字建立物件
-
使用new關鍵字建立的時候,除了分配記憶體空間外,還會給建立好的物件進行預設初始化以及對類中構造器的呼叫
-
也稱為構造方法,是建立物件必須要呼叫的,並且構造器有兩個特點
-
構造器
-
必須與類名相同
-
必須沒有返回型別,也不能寫void
-
-
作用
- new本質是在呼叫構造方法
- 初始化物件的值
-
注意點
- 定義有參構造之後,想使用無參構造,必須顯示的定義一個無參構造
-
Alt+Insert快速構造
建立物件記憶體分析
小結
1、類與物件 類是抽象的 物件是一個具體的例項 2、方法 定義和呼叫 3、對應的引用 引用型別:除基本型別(8) 物件通過引用來操作的:棧裡面的 真實物件是在堆裡的 4、屬性:成員變數 預設初始化: 數字:0 0.0 char:u0000 boolean:false 引用型別:null 修飾符 屬性型別 屬性名= 屬性值 5、物件的建立和使用 - 必須使用new關鍵字創造物件 構造器 - 物件的屬性 - 物件的方法 6、類: 靜態的屬性 動態的行為
封裝
高內聚, 低耦合
類的內部資料細節由自己完成, 儘量暴露少量的方法給外部使用
屬性私有 get/set
意義:
- 提高程式安全性
- 隱藏程式碼實現細節
- 統一介面
- 系統可維護性
package com.oop.demo03;
public class Student {
//屬性私有
private String name;
private int id;
private char sex;
//提供一些可以操作這個屬性的方法
//提供一些public 的get、set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
繼承
extends
本質是對某一批類的抽象
子類繼承了父類,就會有父類的所有方法(public)
Object
在java中所有的類都預設繼承Object類
//public 公共的
//private 私有的 屬性一般是私有的
//protected 受保護的
//default 預設的
Ctrl+H顯示類的繼承結構
Java中只有單繼承,沒有多繼承!一個兒子只能有一個爸爸,一個爸爸可以有多個兒子
super
- super呼叫父類的構造方法,必須在構造方法中的第一個
- super必須只能出現在子類的方法或者構造方法中
- super和this不能同時呼叫構造方法
this和super區別
代表物件不同:
this:本身呼叫者這個物件
super:代表父類物件的應用
前提:
this:沒有繼承也能使用
super:只能在繼承條件下才能使用
構造方法:
this():本類的構造
super():父類的構造
私有的無法被繼承
父類
package com.oop.demo04;
//人
public class Person {
//public 公共的
//private 私有的 屬性一般是私有的
//protected 受保護的
//default 預設的
protected String name="woman";
public Person() {
System.out.println("父類的無參構造");
}
public void say(){
System.out.println("說了一句話");
}
}
子類
package com.oop.demo04;
//學生 人
public class Student extends Person{
private String name ="dy";
public Student() {
super();//super和this只能寫一個 並必須放在第一行,定義有參構造要把無參構造也顯示出來
System.out.println("子類的無參構造");
}
public void say(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
main函式
package com.oop;
import com.oop.demo04.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say("小紅");
}
}
方法重寫:重點——>多型
需要有繼承關係
子類重寫父類的方法(只有方法,不能屬性)
方法名必須相同,引數列表必須相同
修飾符:範圍可以擴大,不能縮小
丟擲的異常:範圍可以被縮小,但不能擴大
子類和父類方法必須一直,方法體不同
為什麼要重寫:
- 父類功能,子類不需要,或者不滿足 Alt+Insert :Override
多型
動態編譯:型別:可擴充套件性
-
多型是方法的多型,屬性沒有多型
-
父類和子類,有聯絡 型別轉換異常 ClassCastException
-
存在的條件:繼承關係,方法需要重寫,父類引用指向子類物件 father f1 = new Son()
不能重寫的有:
static 方法。屬於類,不屬於例項
final 常量 無法改變 在常量池裡
private
instanceof 和型別轉換
- 父類引用指向子類物件
- 把子類轉換為父類,向上轉型;
- 把父類轉換為子類,向下轉型,強制轉換
- 方便方法呼叫,減少重複的程式碼
父類
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
子類
package com.oop.demo06;
public class Student extends Person{
public void go(){
System.out.println("go");
}
}
main
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
import com.oop.demo06.Teacher;
public class Application {
public static void main(String[] args) {
Object object = new Student();
System.out.println(object instanceof Object);
System.out.println(object instanceof Person);
System.out.println(object instanceof Student);
System.out.println(object instanceof Teacher);
System.out.println(object instanceof String);
System.out.println("================");
Person person = new Student();
System.out.println(person instanceof Object);
System.out.println(person instanceof Person);
System.out.println(person instanceof Student);
System.out.println(person instanceof Teacher);
//System.out.println(person instanceof String);
System.out.println("================");
Student student = new Student();
System.out.println(student instanceof Object);
System.out.println(student instanceof Person);
System.out.println(student instanceof Student);
//System.out.println(student instanceof Teacher);
//System.out.println(student instanceof String);
//低轉高的 直接轉 高轉低的 需要強轉
//高 低
Person ps = new Student();
//將person轉換為student型別 可以使用student型別的方法
Student ps1 = (Student) ps;
ps1.go();
//子類轉換為父類 會丟失方法
Student sd = new Student();
Person sd1=sd;
}
}
static
package com.oop.demo07;
public class Person {
{
//程式碼塊(匿名程式碼塊) 執行在構造方法前
//賦初始值
System.out.println("匿名程式碼塊");
}
static {
//靜態程式碼塊
//類一載入,就執行一次 第一個執行
System.out.println("靜態程式碼塊");
}
public Person() {
System.out.println("構造方法");
}
public static void main(String[] args) {
Person p1=new Person();
System.out.println("=======");
Person p2=new Person();
}
}
返回結果
靜態程式碼塊
匿名程式碼塊
構造方法
=======
匿名程式碼塊
構造方法
Process finished with exit code 0
抽象類
abstract 抽象類 子類繼承它並實現抽象類中的抽象方法 extends 單繼承
類為單繼承 介面可以多繼承
- 不能new抽象類,只能靠子類去實現
- 抽象方法必須在抽象類中,抽象類中可以寫普通方法
抽象類
package com.oop.demo08;
//抽象類:類 extend:單繼承 類是單繼承 介面可以實現多繼承
public abstract class Action {
//只有方法名,沒有具體實現
public abstract void doSomething();
//1.不能new抽象類,只能靠子類去實現:約束
}
子類
package com.oop.demo08;
//抽象類的所有方法,子類都必須幫其實現 除非子類也是抽象的
public class A extends Action{
@Override
public void doSomething() {
System.out.println("do");
}
}
介面的定義與實現
普通類:只有具體實現
抽象類:具體實現和規範(抽象方法)都有
介面:只有規範 interface
介面的本質是契約
作用:
- 介面是一種約束
- 定義一些方法,讓不同的人實現
- public abstract 方法
- public static final 屬性
- 介面不能例項化,介面中沒有構造方法
- 一個類可以實現多個介面 implement
- 類必須要重寫介面中的方法
介面timer
package com.oop.demo09;
public interface TimeService {
void timer();
}
介面user
package com.oop.demo09;
//介面需要有實現類
public interface UserService {
//常量, public static final修飾
int AGE=99;
//介面中所有定義都是抽象的 public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
實現類
package com.oop.demo09;
//類可以實現介面
//實現了介面的類,就需要重寫介面的方法
//介面可以實現多繼承
public class UserServiceImpl implements UserService,TimeService{
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
@Override
public void timer() {
}
}
內部類
在一個類內部在定義一個類