1. 程式人生 > 其它 >Java學習的第四天(昨天有事)

Java學習的第四天(昨天有事)

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();
    }
}

總結

  1. 類與物件

    • 類是一個模板:抽象,物件是一個具體的例項
  2. 方法

    • 定義、呼叫!
  3. 對應的引用

    • 引用型別:基本型別(8)
    • 物件是通過引用來操作的:棧--->堆
  4. 屬性:欄位Field 成員變數

    • 預設初始化
      • 數字: 0 0.0
      • char: u0000
      • boolean: false
      • 引用:null
  5. 物件的建立和引用

    • 必須使用new關鍵字創造物件,構造器 Person qi = new Person();
    • 物件的屬性 qi.name;
    • 物件的方法 qi.sleep();
    • 靜態的屬性 屬性
    • 動態的行為 方法

封裝

  • 該露的露,該藏的藏

    • 我們程式設計要追求“高內聚,低耦合”,高內聚就是類的內部資料細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用
  • 封裝(資料的隱藏)

    • 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。
  • 屬性私有,get/set

  1. 提高程式安全性,保護資料
  2. 隱藏程式碼的實現細節
  3. 統一介面
  4. 系統可維護增加了
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
  • 方法重寫