1. 程式人生 > 實用技巧 >JavaSE學習筆記05面向物件程式設計01

JavaSE學習筆記05面向物件程式設計01

面向物件程式設計01

java的核心思想就是OOP

面向過程&面向物件

面向過程思想:

  1. 步驟清晰簡單,第一步做什麼,第二步做什麼......
  2. 面向過程適合處理一些較為簡單的問題

面向物件思想:

  1. 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後才對某個分類下的細節進行面向過程的思索
  2. 面向物件適合處理複雜的問題,適合處理需要多人協作的問題

對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。

面向物件程式設計(Object-Oriented Programming,OOP)

面向物件程式設計的本質就是:以類的方式組織程式碼,以物件的形式組織(封裝)資料

三大特性:封裝、繼承、多型

1.回顧方法

方法的定義

package com.oop.demo01;

//Demo01類
public class Demo01 {
    //main方法
    public static void main(String[] args) {

    }
    /*
    修飾符   返回值   方法名(...){
        //方法體
        return  返回值
    }
     */
    //return 結束方法,返回一個結果!
    public String sayHello(){
        return "Hello,world";
    }
    public void print(){
        return;
    }
    public int max(int a,int b){
        return a > b ? a : b;//三元運算子
    }
}

方法的呼叫

package com.oop.demo01;

public class Demo02 {
    public static void main(String[] args) {

        //例項化這個類new
        //物件型別  物件名 = 物件值
        Student student = new Student();
        //呼叫
        student.say();
    }
}
package com.oop.demo01;
//學生類
public class Student {

    //非靜態方法
    public void say(){
        System.out.println("學生說話了");
    }
}
package com.oop.demo01;

public class Demo03 {
    public static void main(String[] args) {
        //實際引數和形式引數的型別要對應
        int add = Demo03.add(1,2);
        System.out.println(add);
    }
    public static int add(int a, int b){
        return a + b;
    }
}

值傳遞與引用傳遞

package com.oop.demo01;
//值傳遞
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 com.oop.demo01;
//引用傳遞:物件,本質還是值傳遞
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 = "阿波";
    }
}
//定義了一個Person類,有一個屬性:name
class Person{
    String name;//預設值為null
}

變數知識點補充

java中一共有三大變數:區域性變數、例項變數(物件級別)、靜態變數(類級別)

  1. 區域性變數儲存在棧(stack)

  2. 例項變數儲存在堆記憶體

  3. 靜態變數儲存在方法區

2.類與物件的關係

類是一種抽象的資料型別,它是對某一類事物的整體描述/定義,但是並不能代表某一個具體的事物

  1. 動物、植物、手機、電腦......
  2. Peson類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應該具備的特點和行為

物件是抽象概念的具體例項

  1. 張三就是人的一個具體例項,張三家裡的旺財就是狗的一個具體例項
  2. 能夠體現出特點,展現出功能的是具體的例項,而不是一個抽象的概念

建立與初始化物件

物件的建立和使用:

  1. 類是一個模板,通過一個類,是可以建立N多個物件的

  2. new是一個運算子,專門負責物件的建立

//例:
    XueSheng s1 = new XueSheng();

S1是變數名(區域性變數),XueSheng是變數s1的資料型別(引用資料型別),XueSheng()是一個物件(學生類創建出來的學生物件)

package com.oop.demo02;

//使用new關鍵字建立物件
//一個專案應該只有一個main方法
public class Application {
    public static void main(String[] args) {

        //類,抽象的,例項化
        //類例項化後會返回一個Student類的具體例項
        //student物件就是一個Student類的具體例項
        Student xiaoming = new Student();
        Student xiaohong = new Student();

        xiaoming.name = "小明";
        xiaoming.age = 3;
        System.out.println(xiaoming.name);
        System.out.println(xiaoming.age);

        xiaohong.name = "小紅";
        xiaohong.age = 3;
        System.out.println(xiaohong.name);
        System.out.println(xiaohong.age);
    }
}
package com.oop.demo02;

//學生類
public class Student {

    //屬性:欄位
    String name;//預設值為null
    int age;//預設值為0

    //方法
    public void study(){
        System.out.println(this.name + "在學習");
    }
}

構造方法

使用new建立物件的時候,除了分配記憶體空間之外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫。

類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的。並且構造器有以下兩個特點:

  1. 必須和類的名字相同
  2. 必須沒有返回值型別,也不能寫void
package com.oop.demo02;

public class Application {
    public static void main(String[] args) {

        //new 例項化了一個物件
        Person person = new Person();
        System.out.println(person.name);//阿波

        Person person1 = new Person("波波");
        System.out.println(person1.name);//波波
    }
}
package com.oop.demo02;

public class Person {

    //一個類即使什麼都不寫,他也會存在一個構造方法

    String name;

    //顯示的定義構造器
    //無參構造
    //例項化初始值,使用new關鍵字本質上是在呼叫構造器
    public Person(){
        this.name = "阿波";
    }

    //有參構造,一旦定義了有參構造,無參構造必須顯示定義
    public Person(String name){
        this.name = name;
    }
}
/*
1.快捷鍵:Alt + insert會彈出一個小視窗
2.選擇Constructor,勾選引數再點0k即可
3.若要選擇無參,選擇Constructor後點select none
 */

構造方法的作用:

  1. 建立物件

  2. 給屬性賦值

注意:

  1. 構造方法支援過載

  2. 當一個類沒有提供任何構造方法的時候,系統會預設提供一個無引數的構造方法(這個方法被稱為預設構造器)

  3. 手動定義有參的構造方法,無引數構造方法將消失(保險一些建議將無引數的構造方法手寫出來)

  4. 構造方法中沒有手動賦值,統一都會預設賦值,預設賦系統值

空指標異常

空引用訪問物件相關的資料時,會出現空指標異常(NullPointerException)

Public class NullPointerTest{

Public static void main(String[] args){

	//建立客戶物件
	Customer c = new Customer();
	//訪問這個客戶的id
	System.out.println(c.id);//0

	//重新給id賦值
	c.id = 9527;
	System.out.println(“客戶的id是” + c.id);
    
	c = null;
	// NullPointerException
	//編譯沒問題,因為編譯器只檢查語法
	//但是執行的時候需要物件的存在,但是物件沒了(null)
	//就只能出現異常
	System.out.println(c.id);
	}
}
Class Customer{
    
	int id;
}

3.靜態程式碼塊和例項語句塊(擴充套件)

static(靜態的)關鍵字

  1. 所有static關鍵字修飾的都是類相關的,類級別的

  2. 都採用類名.的方式訪問

    Static修飾的變數:靜態變數

    Static修飾的方法:靜態方法

//靜態程式碼塊語法:
Static{
	Java語句;
	Java語句;
}
//特點:靜態程式碼塊在類載入時執行,並且只執行一次
//作用:記錄類載入的日誌資訊
Public class Test{
	//靜態程式碼塊
	Static{
		System.out.println(“A”);
	}
	//一個類當中可以編寫多個靜態程式碼塊
	Static{
		System.out.println(“B”);
	}
	//入口
	Public static void main(String[] args){
		System.out.println(“Hello World!”);
	}
	Static{
		System.out.println(“C”);
	}
}
//執行結果:A,B,C,Hell World!
//注意:靜態程式碼塊在main方法執行之前執行
//例項語句塊
//語法:
{
	Java語句;
	Java語句;
}
//只要是構造方法執行,必然在構造方法執行之前,自動執行“例項語句塊”中的程式碼

4.this關鍵字

  1. 一個物件一個this,this儲存在堆記憶體當中物件的內部

  2. this是一個變數,一個引用,this儲存當前物件的記憶體地址,指向自身

  3. this不能使用在靜態方法中,this只能使用在例項方法中,誰呼叫這個例項方法,this就是誰,所以this代表的是:當前物件

  4. 大部分情況下this可以省略