1. 程式人生 > >java面向物件(推薦看一本書java程式設計思想)

java面向物件(推薦看一本書java程式設計思想)

面向物件

回顧

今天任務

1. 面向物件
2. 面向過程
3. 類的建立
4. 物件的建立
5. 物件建立記憶體分析
6. 構造方法
7. this關鍵字

教學目標

1. 掌握面向物件思想
2. 掌握類和物件的建立
3. 掌握物件建立記憶體分析
4. 掌握構造方法
5. 掌握this關鍵字

第一節 : 面向物件的設計思想

1.1 什麼是面向物件

一種看待問題的思維方式,著眼於找到一個具有特殊功能的具體個體,然後委託這個個體去做某件事情,我們把這個個體就叫做物件
是一種更符合人類思考習慣的思想【懶人思想】,可以將複雜的事情簡單化,將程式設計師從執行者轉換成了指揮者
使用面向物件進行開發,先要去找具有所需功能的物件來用,如果該物件不存在,那麼建立一個具有所需功能的物件

1.2 面向過程

一種看待問題的思維方式,在思考問題的時候,著眼於問題是怎樣一步一步解決的,然後親力親為的去解決問題

1.3 面向物件和麵向過程的對比

面向物件是基於萬物皆物件這個哲學觀點

​ 舉例說明:

​ 案例一:我想要吃大盤雞​ 面向過程 面向物件​ 1.自己去買菜 1.委託一個會砍價的人幫忙去買菜​ 2.自己擇菜 2.委託一個臨時工幫忙擇菜​ 3.自己做菜 3.委託一個廚師幫忙做菜​ 4.自己開始吃 4.自己開始吃

​ 案例二:小明是一個電腦小白,想要配一臺電腦,買完零件後需要運到家裡,組裝完成後開啟電腦玩遊戲​ 面向過程 面向物件​ 1.小明補充電腦知識 1.委託一個懂電腦的朋友(老王)去幫忙買零件​ 2.小明去買零件 2.委託一個能跑腿的人去買零件​ 3.小明把零件帶回家裡 2.委託一個快遞小哥幫小明送到家裡​ 4.小明組裝電腦 3.委託一個會組裝電腦的人幫小明組裝電腦​ 5.小明開機玩電腦 4.小明自己開啟電腦,開始玩遊戲

1.4 區別總結

a.都是看待問題的一種思維方式,都能解決問題
b.面向過程著眼於所有的事情親力親為
c.面向物件著眼於找到一個具有特殊功能的物件,委託這個物件幫忙去做某件事情
注意:面向物件時一種思想,並不是一門程式語言

1.5 類的定義

一個具有特殊功能的實體的集合【群體】,類是Java語言的最基本單位

1.6 物件的定義

在一個類中,一個具有特殊功能的實體,能夠幫忙解決特定的問題,物件也被稱為例項

1.7 類與物件之間的關係

a.類是物件的抽象,物件是類的具體體現
b.Java中描述事物通過類的形式體現,類是具體事物的抽象,物件即是該類事物實實在在的個體

1.8 類的宣告

​ 語法:訪問許可權修飾符 class 類名 {

​ //類體​ }

​ 說明:a.訪問許可權修飾符:只能是public(可以被省略,省略後為default)​ b.類名只要是一個合法的識別符號即可,但是要求:首字母必須大寫,遵循駝峰命名法​ c.儘量使用單個或多個有意義的單詞連線而成​ ​ public class FirstDemo {

​ }

​ 注意:a.一個Java檔案中可以寫多個類,如果寫多個類,則編譯後會生成多個.class檔案​ b.一個Java檔案中最多隻能有一個被public修飾的類,這個類的類名必須和Java原始檔名保持一致​ c.一個Java檔案中如果只有一個類,並且這個類不用public修飾的話,類名和檔名可以不一樣,但習慣上,我們都會寫一樣

1.9 類中成員變數的定義

​ 成員變數:

​ a.成員變數其實就是全域性變數

​ b.成員變數也被稱為屬性​ c.分為靜態變數和非靜態變數​ d.在靜態方法中只能訪問靜態成員變數,在非靜態方法中可以訪問非靜態成員變數和靜態成員變數

​ 成員變數【全域性變數】和區域性變數的區別:​ a.定義的位置不同

成員變數:定義於類中,作用於整個類 區域性變數:定義於方法或者語句中,作用於該方法或者該語句。

​ b.記憶體中出現的時間和位置不同

成員變數:當物件被建立時,出現在堆記憶體當中。 區域性變數:所屬的區間被運算時,出現在棧記憶體當中。

​ c.生命週期不同

成員變數:隨著物件的出現而出現,隨著物件的消失而消失。 區域性變數:隨著所屬區間運算結束,它就被釋放。

​ d.初始化值不同

成員變數:成員變數因為在堆記憶體當中,所以他有預設的初始值 區域性變數:沒有預設的初始值

1.10 類中方法的定義

​ a.分為靜態方法和非靜態方法

​ b.在同一個類中,在靜態方法中只能呼叫靜態方法,在非靜態方法中可以呼叫非靜態方法和靜態方法

class TextDemo01
{
    //定義非靜態全域性變數
    String str;
​
    //定義靜態全域性變數
    static int num;
​
    //main是靜態函式
    public static void main(String[] args) 
    {
        show();
        //結論一:在同一個類中,在靜態函式中不能呼叫非靜態函式
        // 錯誤: 無法從靜態上下文中引用非靜態 方法 display()
        //display();
​
        //結論三:在同一個類中,在靜態函式中只能訪問靜態全域性變數
        // 錯誤: 無法從靜態上下文中引用非靜態 變數 str
        //System.out.println(str);
        System.out.println(num);//0
​
        //定義一個區域性變數
        //當全域性變數和區域性變數重名的時候,訪問的時候採用就近原則
        //儘量避免全域性變數和區域性變數重名
        int num = 10;
        System.out.println(num);
    }
​
    //靜態函式
    public static void show() {
        System.out.println("show");
    }
​
    //非靜態函式
    public void display() {
        System.out.println("display");
        //結論二:在同一個類中,非靜態函式可以呼叫靜態函式,也可以呼叫非靜態函式
        show();
        display11();
​
        //結論四:在同一個類中,非靜態函式可以訪問靜態全域性變數以及非靜態全域性變數
        System.out.println(str);
        System.out.println(num);
    }
​
    //非靜態函式
    public void display11() {
        System.out.println("display11");
    }
}

第二節:物件的建立以及記憶體分析

2.1 物件的建立

​ 物件的建立過程也被稱為物件的例項化過程

​ 語法:類名 識別符號 = new 類名();

//演示物件的建立,跨類進行呼叫成員方法以及訪問成員變數
//測試類:含有main函式得類被稱為測試類
public class TextDemo01 
{
    public static void main(String[] args) 
    {
        //1.建立物件
        //語法:類名 變數名稱  = new  類名();
        Person xiaoMing = new Person();
​
        //2.呼叫其他類中的非靜態方法和訪問其他類中非靜態成員變數
        //語法:物件.
        System.out.println(xiaoMing.name);
        //雖然是跨類進行訪問,Person類中成員變數仍然是一個變數,值可以隨時發生改變
        xiaoMing.name = "小明";
        System.out.println(xiaoMing.name);
        xiaoMing.age = 10;
        xiaoMing.gender = 'B';
​
        xiaoMing.eat();
​
        //3.呼叫其他類中的靜態方法和訪問其他類中靜態成員變數
        //語法:物件.    類名.
        System.out.println(Person.country);
        Person.country = "中國";
        System.out.println(Person.country);
​
        Person.run();
​
        xiaoMing.country = "China";
        System.out.println(Person.country);
        System.out.println(xiaoMing.country);
​
        xiaoMing.run();
​
        //4.同一個類可以建立多個物件
        Person xiaoLi = new Person();
    }
}
​
//實體類:表示具有某些特徵或者某些行為的類
//描述多個物件所具有的共同特徵和共同行為
//需求:人類,具有姓名,年齡,性別等的特徵,可以吃東西,可以奔跑,,,,
class Person
{
    //第一部分
    //成員變數:特徵【名詞】
    //非靜態成員變數
    String name;//null
    int age;//0
    char gender;//\u0000
​
    //靜態成員變數
    static String country;//null
​
    //第二部分
    //成員方法:行為【動詞】
    //非靜態成員方法
    public void eat() {
        System.out.println("eating~~~~");
    }
​
    //靜態成員方法
    public static void run() {
        System.out.println("running~~~~");
    }
}

總結:a.靜態方法和靜態成員變數都是屬於類的,需要訪問的時候用: 類名. 的方式來訪問

​ b.非靜態方法和非靜態成員變數是屬於物件的,需要訪問的時候用: 物件. 的方式來訪問​ c.開闢空間的時機不同

2.2 記憶體分析

​ 說明:程式中定義的Person型別的變數實際上是一個引用,它被存放在棧記憶體中,他指向實際的Person物件,而真正的Person物件則存放於堆記憶體中

2.3 練習

//測試類
class PracticeDemo01 
{
    public static void main(String[] args) 
    {
        //需求:開學了,王老師讓學生小明,小花,小麗做自我介紹
        //姓名,年齡,愛好,來一段才藝展示
        /*
        老師類
        特徵:姓名
        行為:讓學生做自我介紹
​
        學生類
        特徵:姓名,年齡,愛好
        行為:才藝展示
        */
        //1.建立一個老師的物件
        Teacher wang  = new Teacher();
        wang.name = "王老師";
​
        //2.建立一個學生物件
        Student xiaoming = new Student();
        //賦值
        xiaoming.name = "小明";
        xiaoming.age = 10;
        xiaoming.hobby = "吹牛逼";
​
        //3.老師執行自己的行為
        wang.letStuIntroduce(xiaoming);
​
​
        Student xiaohua = new Student();
        //賦值
        xiaohua.name = "小花";
        xiaohua.age = 10;
        xiaohua.hobby = "唱歌";
        wang.letStuIntroduce(xiaohua);
    }
}
​
//實體類
//老師類
class Teacher
{
    String name;
​
    //引數:學生,Student型別
    public void letStuIntroduce(Student stu) {
        System.out.println(name + "讓學生" + stu.name + "做自我介紹");
        
        stu.introduce();
​
        if(stu.name.equals("小麗")) {
            stu.dance();
        } else if(stu.name.equals("小花")) {
            stu.sing();
        } else {
            stu.lie();
        }
    }
}
​
//學生類
class Student
{
    String name;
    int age;
    String hobby;
​
    public void introduce() {
        System.out.println("我是" + name + "今年" +  age + "愛好:" + hobby);
    }
​
    public void dance() {
        System.out.println("跳一段廣場舞");
    }
​
    public void sing() {
        System.out.println("來一段freeStyle");
    }
​
    public void lie() {
        System.out.println("吹個牛逼");
    }
}

第三節:構造方法的定義

3.1 構造方法的定義

​ 構造方法也叫構造器,是指當例項化一個物件(建立一個物件)的時候,第一個被呼叫的方法

​ 語法:訪問許可權修飾符 類名() {​ //方法體​ }

​ 普通方法:​ 訪問許可權修飾符 其他的修飾符 返回值型別 函式名(引數列表) {

​ }

​ 說明:a.構造方法是在例項化物件的過程中自動呼叫的

​ b.系統會預設為我們提供一個無參的構造方法​ c.構造方法沒有返回值型別

3.2 構造方法的呼叫

//演示構造方法的使用
class TextDemo05 
{
    public static void main(String[] args) 
    {
        //1.系統會預設提供一個無參的構造方法
        Animal a = new Animal();
​
        Animal aa = new Animal("fadhbf");
        aa.show();
        aa.show();
        aa.show();
    }
}
​
class Animal
{
    //無參的構造方法
    //2.構造方法是在例項化物件的過程中被自動呼叫的,不需要手動呼叫
    
    public Animal(){
        System.out.println("無參的構造方法被呼叫");
    }
    
    //3.當手動新增一個有參的構造方法之後,系統將不再提供無參的構造方法
    //如果要使用無參的構造方法,只能手動新增
    public Animal(String str) {
        System.out.println("String構造方法被呼叫");
    }
​
    public void show() {
    }
}

3.3 構造方法和普通方法的區別

​ a.構造方法是在建立物件的過程中自動呼叫的,普通方法只能手動進行呼叫​ b.構造方法沒有返回值型別【注意區別返回值void】,普通方法的返回值型別要麼是確定的型別,要麼為void​ c.系統會預設為我們提供一個無參的構造方法,普通方法只能手動新增​ d.構造方法的方法名稱必須和對應的類名保持一致​ e.構造方法在建立物件的過程中就會執行,而且每個物件只執行一次,對於普通方法而言,只有在需要使用的時候才被執行,並且一個物件可以呼叫多次

注意​ a.如果沒有寫有參的構造方法,系統會預設提供一個無參的構造方法​ b.如果手動寫了有參的構造方法,系統將不再提供無參的構造方法,如果需要使用,則要手動新增(一般情況下,要求將無參的構造方法都寫上,哪怕方法裡面什麼都不寫)

3.4 構造方法過載

//演示構造方法的過載
//測試類
class TextDemo06 
{
    public static void main(String[] args) 
    {
        //直接賦值
        /*
        Dog maomao = new Dog();
        maomao.name = "毛毛";
        maomao.age = 3;
​
        maomao.lookHome();
        */
​
        //通過構造方法賦值
        Dog dahuang = new Dog("大黃",5);
        dahuang.lookHome();
    }
}
​
//實體類
class Dog
{
    //成員變數
    String name;
    int age;
​
    //構造方法
    public Dog() {}
    //有參的構造方法,引數一般設定為和成員變數有關的引數
    public Dog(String n,int a) {
        //給成員變數賦值
        name = n;
        age = a;
    }
    /*
    public Dog(String n) {
        name = n;
    }
    */
​
    //成員方法
    public void lookHome() {
        System.out.println(name + "看家");
    }
}

3.5 練習

//測試類
class PracticeDemo02 
{
    public static void main(String[] args) 
    {
        //場景:富二代王s聰開著新買的白色寶馬在馬路上奔跑,很自豪的向他的新女友炫耀
        /*
        富二代類
        特徵:姓名  有錢
        行為:開車,炫耀
​
        汽車類
        特徵:顏色,品牌
        行為:奔跑
​
        女友類
        特徵:姓名
        */
        //1.建立一個富二代的物件
        RichMan wang = new RichMan("王思聰",true);
​
        //2.建立一個汽車的物件
        Car BMW = new Car("白色","蘭博基尼");
​
        //3.建立一個女友的物件
        GirlFriend girl = new GirlFriend("鳳姐");
​
        //4.讓富二代執行自己的行為
        wang.drive(BMW);
        //wang.show(girl,BMW);
    }
}
​
/*
富二代類
        特徵:姓名  有錢
        行為:開車,炫耀車
*/
class RichMan
{
    //成員變數
    String name;
    boolean hasMuchMoney;
    
    //構造方法
    public RichMan() {}
    public RichMan(String n,boolean is) {
        name = n;
        hasMuchMoney = is;
    }
​
    //成員方法
    public void drive(Car c) {
        System.out.println(name + "開著豪車" + c.brand);
    }
​
    public void show(GirlFriend gf,Car c) {
​
        System.out.println(name + "向" + gf.name + "炫耀豪車" + c.brand);
    }
}
​
/*
汽車類
        特徵:顏色,品牌
        行為:奔跑
*/
class Car
{
    //成員變數
    String color;
    String brand;
​
    //構造方法
    public Car() {}
    public Car(String c,String b) {
        color = c;
        brand = b;
    }
​
    //成員方法
    public void run() {
        System.out.println("一輛" + color + "的" + brand + "在奔跑");
    }
}
​
/*
女友類
        特徵:姓名
*/
class GirlFriend
{
    //成員變數
    String name;
​
    //構造方法
    public GirlFriend(){}
    public GirlFriend(String n) {
        name = n;
    }
}

第四節:this關鍵字

4.1 this.屬性

訪問本類的成員屬性

​ 作用:為了區分成員變數和形參

4.2 this.方法

​ 訪問本類的成員方法

4.3 練習

//演示this的使用
class ThisUsageDemo01 
{
    public static void main(String[] args) 
    {
        //
        Cat maomao = new Cat("毛毛",10);
        maomao.setName("fhsdg");
​
        Cat xiaohei = new Cat("小黑",5);
        xiaohei.setName("hello");
​
        /*
        無參的構造方法被呼叫
        String int構造方法被呼叫
        無參的構造方法被呼叫
        String int構造方法被呼叫
​
        說明:每建立一個物件,只能自動的呼叫其中的一個構造方法,通過this()可以手動的去呼叫其他的構造方法
        */
​
        //物件.
        xiaohei.show3();
    }
}
​
class Cat
{
    String name;
    int age;
    int num;
    int num1;
​
    //3.this()
    public Cat() {
        System.out.println("無參的構造方法被呼叫");
    }
    //1.this.屬性
    public Cat(String name,int age) {
        //呼叫的是無參的構造方法
        this();
        this.name = name;
        this.age = age;
​
        System.out.println("String int構造方法被呼叫");
    }
    public Cat(String name,int age,int num,int num1) {
        //對this()的呼叫必須是構造方法中的第一個語句
        //this();
        //具體呼叫的是哪個構造方法,取決於所傳的引數
        this(name,age);
        //可以簡化程式碼
        //this.name = name;
        //this.age = age;
        this.num = num;
        this.num1 = num1;
​
        System.out.println("String int int int構造方法被呼叫");
    }
​
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
​
    //2.this.方法
    //普通方法
    public void show1() {
        //在本類中呼叫方法時,this可以省略
        this.show2();
        //在非靜態方法中呼叫靜態方法時,也可以使用this,this同樣可以省略
        this.show3();
    }
​
    public void show2() {
    }
​
    //靜態方法
    public static void show3() {
        //錯誤: 無法從靜態上下文中引用非靜態 變數 this
        //在靜態方法中不能使用this
        /*
        在測試類中的main函式使用xiaohei呼叫了show3方法,所以此處的this代表的就是xiaohei
        而xiaohei本身是一個引用性的變數,是非靜態的,所以在靜態函式中不能訪問非靜態變數
        */
        //this.show4();//錯誤演示
        show4();
    }
​
    public static void show4() {
    }
}

4.4 this()

​ 訪問本類中的建構函式

​ 注意:

​ a.必須出現在構造方法中​ b.訪問的是除了當前構造方法之外的其他構造方法​ c.具體訪問的是哪個構造方法,取決於所傳的引數​ d.只能書寫在構造方法的第一條語句​ e.this()在同一個構造方法中只能出現一次

class ThisUsageDemo02 
{
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }
}
class Dog
{
     String name;
     int age;
     int num;
     String hobby;
​
    //提高程式碼的可讀性,可維護性
    //構造方法
    public Dog() {
    }
    public Dog(String name) {
        this.name = name;
    }
    public Dog(int age) {
        this.age = age;
    }
​
    public Dog(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public Dog(String name,int age,int num,String hobby) {
        this(name,age);
        this.num= num;
        this.hobby = hobby;
    }
}

第五節:總結

第六節: 課前默寫

1.使用Arrays工具類完成下面操作

使用靜態初始化的方式初始化一個一維陣列

​ 升序排序 ​ 實現二分法查詢 ​ 將陣列轉化為字串表示形式

​ 遍歷出所有的元素

2.使用不定長引數自定義一個函式,函式主體部分實現只打印偶數的功能

第七節:作業

利用面向物件的思想寫下面的程式

1.小美在朝陽公園溜旺財【注:旺財是狗】

2.小明穿著白色的特步運動鞋在奧林匹克公園跑步

3.趙老師在講臺上講課,小剛認真的聽課做筆記

4.張阿姨和李阿姨在物美超市買紅富士

構造方法

1.定義一“圓”(Circle)類,圓心為“點”Point類,構造一圓,求圓的周長和麵積,並判斷某點與圓的關係

2.李曉在家裡開party,向朋友介紹家中的黃色的寵物狗【彩彩】具有兩條腿走路的特異功能。

3.王梅家的荷蘭寵物豬【笨笨】跑丟了,她哭著貼尋豬啟示。

4.富二代張三向女朋友李四介紹自己的新跑車:白色的賓利

第八節:面試題

1.什麼是面向物件?面向物件和麵向過程的區別是什麼

面向物件是基於面向物件的程式設計思想

面向過程強調的是每一個功能的實現,面向物件強調的是物件,然後用物件去呼叫功能。

2.構造方法與普通方法之間的區別

構造方法是一種特殊的方法,它是一個與類同名且返回值型別為同名類型別的方法。物件的建立就是通過構造方法來完成,其功能主要是完成物件的初始化。當類例項化一個物件時會自動呼叫構造方法。構造方法和其他方法一樣也可以過載。

3.this關鍵字的作用以及使用