Java學習的第四天(昨天有事)
阿新 • • 發佈:2021-06-24
JAVA學習Day04
面向物件程式設計
Java的核心思想就是OOP
面向過程&面向物件
-
面向過程思想
-
步驟清晰簡單,第一步做什麼,第二步做什麼
-
面對過程合適處理一些較為簡單的問題
-
-
面向物件思想
- 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索。
- 面向物件適合處理複雜的問題,適合處理需要多人協作的問題!
-
對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。
什麼是面向物件
-
面向物件程式設計(Object-Oriented Programming,OOP)
-
面向物件程式設計的本質:以類的方式組織程式碼,以物件的組織(封裝)資料。
-
抽象
-
三大特性:
- 封裝
- 繼承
- 多型
-
從認識論角度考慮是先有物件後有類。物件。是具體的事物。類,是抽象的,是對物件的抽象。
-
從程式碼執行角度考慮是先有類後有物件。類是物件的模板。
方法的回顧和加深
- 方法的定義
- 修飾符
- 返回值型別
- break和return的區別
- 方法名:注意規範 見名知意
- 引數列表:(引數型別,引數名)...
- 異常丟擲
package Day04.OOP; import java.io.IOException; //Demo01 類 public class Demo01 { //main 方法 public static void main(String[] args) { } /* 修飾符 返回值型別 方法名(...){ 方法體 return 返回值 } */ public String sayHello(){ //return 結束方法,返回一個結果! return "Hello world"; } public void readFile(String file)throws IOException { } }
- 方法的呼叫:遞迴
- 靜態方法
- 非靜態方法
- 形參和實參
- 值傳遞和引用傳遞
- this關鍵字
package Day04.OOP; public class Demo02 { //靜態方法 static // public static void main(String[] args) { // //靜態方法呼叫 // Demo02_1.say(); // } public static void main(String[] args) { //例項化這個類 new //物件型別 物件名 = 物件值 Demo02_1 stu = new Demo02_1(); stu.say(); } //非靜態方法 //和類一起載入的 public static void a(){ // b(); } //類例項化之後才能存在 public void b(){ } }
package Day04.OOP;
public class Demo02_1 {
//靜態方法
// public static void say(){
// System.out.println("學生說話了!");
// }
public void say(){
//非靜態方法
System.out.println("學生說話了!");
}
}
package Day04.OOP;
public class Demo03 {
public static void main(String[] args) {
//實際引數和形式引數型別要對應
int sum = Demo03.add(1,5);
System.out.println(sum);
}
public static int add(int a,int b){
return a+b;
}
}
package Day04.OOP;
//值傳遞
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a)//1;
Demo04.change(a);
System.out.println(a);//1
}
//返回值為空
public static void change(int a){
a = 10;
}
}
package Day04.OOP;
//引用傳遞,物件
//物件,記憶體
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null
Demo05.change(person);
System.out.println(person.name);//柒
}
public static void change(Person person){
//person是一個物件:指向的 ---> Person person = new Person();這是一個具體的嗯,可以改變屬性
person.name = "柒";
}
}
class Person{
String name;//null
}
類和物件的關係
-
類是一種抽象的資料型別,它是對某一類事物整體描述/定義,但是並不能代表某一個具體的事物。
- 動物、植物、手機。。。
- Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應該具備的特點和行為
-
物件是抽象概念的具體例項
- 張三就是人的一個具體例項,張三家的旺財就是狗的一個具體例項
- 能夠體現出特點,展現出功能是具體的例項,而不是一種抽象的概念
我們可以將這些思想轉換為程式碼來實現!
建立與初始化物件
-
使用new關鍵字建立物件
-
使用new關鍵字建立的時候,除了分配記憶體空間外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫。
-
類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的。並且構造器有以下倆個特點:
- 必須和類的名字相同
- 必須沒有返回值型別,也不能寫void
-
構造器必須要掌握
package Day04.OOP;
//一個專案應該只存在一個main方法
public class Demo06_Application {
public static void main(String[] args) {
//類:抽象的,例項化
//類例項化後會返回一個自己的物件
//demo06物件就是一個Demo06類的具體例項
Demo06 demo06 = new Demo06();
Demo06 xiaoming = new Demo06();
xiaoming.name = "小明";
xiaoming.age = 18;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
}
}
package Day04.OOP;
//學生類
public class Demo06 {
//屬性:欄位
String name;//null
int age;//0
public void study(){
System.out.println(this.name+"在學習");
}
}
package Day04.OOP;
public class Demo07_Application {
public static void main(String[] args) {
//例項化一個物件
Demo07 demo07 = new Demo07("柒");
System.out.println(demo07.name);
}
}
package Day04.OOP;
public class Demo07 {
//一個類即使什麼東西不寫,它也會存在一個方法
//顯示的定義構造器
String name;
//例項化初始值
// 1.使用new關鍵字,本質是在呼叫構造器
// public Demo07(){
// this.name = "柒";
// }
//有參構造:一旦定義了有參構造,無參就必須顯示定義
//用來初始化值
public Demo07(){
}
public Demo07(String name){
this.name = name;
}
//快捷鍵:Alt + insert
/*構造器:
1.和類名相同
2.沒有返回值
作用:
1.new本質是在呼叫構造方法
2.初始化物件的值
注意:定義有參構造之後,如果想使用無參構造,顯示的定義一個無參的構造
*/
}
package Day04.OOP.Demo08;
public class Application {
public static void main(String[] args) {
Pet dog = new Pet();
dog.name = "旺財";
dog.age = 2;
dog.shout();
System.out.println(dog.name);
System.out.println(dog.age);
Pet cat = new Pet();
}
}
總結
-
類與物件
- 類是一個模板:抽象,物件是一個具體的例項
-
方法
- 定義、呼叫!
-
對應的引用
- 引用型別:基本型別(8)
- 物件是通過引用來操作的:棧--->堆
-
屬性:欄位Field 成員變數
- 預設初始化
- 數字: 0 0.0
- char: u0000
- boolean: false
- 引用:null
- 預設初始化
-
物件的建立和引用
- 必須使用new關鍵字創造物件,構造器 Person qi = new Person();
- 物件的屬性 qi.name;
- 物件的方法 qi.sleep();
-
類
- 靜態的屬性 屬性
- 動態的行為 方法
封裝
-
該露的露,該藏的藏
- 我們程式設計要追求“高內聚,低耦合”,高內聚就是類的內部資料細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用
-
封裝(資料的隱藏)
- 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。
-
屬性私有,get/set
- 提高程式安全性,保護資料
- 隱藏程式碼的實現細節
- 統一介面
- 系統可維護增加了
package Day04.OOP.Demo09;
import Day04.OOP.Demo09.Student;
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("柒");
System.out.println(s1.getName());
s1.setAge(150);//不合法
System.out.println(s1.getAge());
}
}
package Day04.OOP.Demo09;
//類 private:私有
public class Student {
//屬性私有
//名字
private String name;
//學號
private int id;
//性別
private char sex;
private int age;
//學習()
//睡覺()
//提供一些public的get、set方法
//get 獲得這個資料
public String getName(){
return this.name;
}
//set 給這個資料設值
public void setName(String name){
this.name = name;
}
//alt + insert 自動生成get,set方法
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 120 || age < 0){
this.age = 999;//不合法的結果
}else{
this.age = age;
}
}
}
繼承
- 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模
- extands的意思是“擴充套件”。子類是父類的擴充套件
- Java中類只有單繼承,沒有多繼承
- 繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。
- 繼承關係的兩個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示
- 子類和父類之間,從意義上講應該具有“is a”的關係
- object類
- super
- 方法重寫