天天看點

大資料必學Java基礎(三十三):面向對象介紹

文章目錄

​​面向對象介紹​​

​​一、面向過程和面向對象的差別​​

​​二、類和對象的關系​​

​​三、面向對象三個階段​​

​​四、局部變量和成員變量的差別​​

​​五、構造器​​

​​六、構造器的重載​​

面向對象介紹

一、面向過程和面向對象的差別

面向過程:當事件比較簡單的時候,利用面向過程,注重的是事件的具體的步驟/過程,注重的是過程中的具體的行為,以函數為最小機關,考慮怎麼做。

面向對象:注重找“參與者”,将功能封裝進對象,強調具備了功能的對象,以類/對象為最小機關,考慮誰來做。

案例:

人把大象裝進冰箱:

面向過程:

函數1:打開冰箱(){人站在冰箱前,打開冰箱,冰箱卡到30度角的時候,冰箱的燈打開了.........}

函數2:儲存大象(){大象先邁左腿,再邁右退,考慮冰箱能不能裝下......}

函數3:關閉冰箱(){人站在冰箱前,關閉冰箱,冰箱開到30度角的時候,冰箱的燈關閉了..........}

面向對象:

人{
  打開(冰箱){
     冰箱.打開();
  }
  存儲(大象){
        大象.進入();
    }
  關閉(冰箱){
      冰箱.關閉();
  }
}
冰箱{
  打開(){ 1.2.3.}
 關閉(){}
}
櫃子{
}
大象{
  進入(冰箱){
  }
}      

面向過程 ---> 面向對象 , 其實就是由執行者 ---> 指揮者的 一個過渡

面向過程:編年體

面向對象:紀傳體

二者相輔相成,并不是對立的。解決複雜問題,通過面向對象方式便于我們從宏觀上把握事物之間複雜的關系、友善我們分析整個系統;具體到微觀操作,仍然使用面向過程方式來處理

二、類和對象的關系

萬事萬物皆對象

對象:具體的事物,具體的實體,具體的執行個體,模闆下具體的産品

類:對對象向上抽取出像的部分,公共的部分,形成類,類是抽象的,是一個模闆

一般在寫代碼的時候先寫類,然後在根據類建立對應的對象。

三、面向對象三個階段

【1】面向對象分析OOA  --  Object Oriented Analysis

對象:張三,王五,朱六,你,我

抽取出一個類----》人類

類裡面有什麼:

動詞--》動态特性--》方法

名詞--》靜态特性--》屬性

【2】面向對象設計OOD  --  Object Oriented Design

先有類,再有對象:

類:人類: Person

對象:zhangsan ,lisi,zhuliu

【3】面向對象程式設計OOP  --  Object Oriented Programming

建立類:

(1)屬性(field 成員變量)

屬性用于定義該類或該類對象包含的資料或者說靜态特征。屬性作用範圍是整個類體。

屬性定義格式:

[修飾符]  方法傳回值類型  方法名(形參清單) {

        // n條語句

}

(2)方法

方法用于定義該類或該類執行個體的行為特征和功能實作。方法是類和對象行為特征的抽象。方法很類似于面向過程中的函數。面向過程中,函數是最基本機關,整個程式由一個個函數調用組成。面向對象中,整個程式的基本機關是類,方法是從屬于類和對象的。

方法定義格式:

[修飾符]  方法傳回值類型  方法名(形參清單) {

        // n條語句

}

void代表沒有傳回值;方法的作用:重用代碼,封裝功能,便于修改

代碼:

package com.lanson;

/**
 * @Auther: lanson
 * 建立類:人類
 */
public class Person {
    //名詞---》屬性---》成員變量---》放在類中方法外(注意:我們隻把有需要的内容寫到代碼裡,不相關的東西不要放在代碼中)
    int age ;//年齡
    String name;//姓名
    double height;//身高
    double weight;//體重

    //動詞---》方法
    //吃飯
    public void eat(){
        int num = 10;//局部變量:放在方法中
        System.out.println("我喜歡吃飯");
    }
    //睡覺:
    public void sleep(String address){
        System.out.println("我在"+address+"睡覺");
    }
    //自我介紹:
    public String introduce(){
        return "我的名字是:"+name+",我的年齡是:"+age+",我的身高是:"+height+",我的體重是:"+weight;
    }
}      

建立對象

package com.lanson;

/**
 * @Auther: lanson
 */
public class Test {//測試類

    //這是一個main方法,是程式的入口:
    public static void main(String[] args) {
        //建立一個人類的具體的對象/執行個體:
        //建立一個對象,對象的名字叫:zs
        //Person 屬于 引用資料類型
        //第一次加載類的時候,會進行類的加載,初始化建立對象的時候,對象的屬性沒有給指派,有預設的初始化的值。
        Person zs = new Person();
        zs.name = "張三";
        zs.age = 19;
        zs.height = 180.4;
        zs.weight = 170.4;

        //再建立一個對象:
        //再次建立類的時候,就不會進行類的加載了,類的加載隻在第一次需要的時候加載一次
        Person ls = new Person();
        ls.name = "李四";
        ls.age = 18;
        ls.height = 170.6;
        ls.weight = 160.5;

        //對屬性值進行讀取:
        System.out.println(zs.name);
        System.out.println(ls.age);

        //對方法進行操作:
        //不同的對象,屬性有自己的特有的值,但是方法都是調用類中通用的方法。
        //屬性:各個對象的屬性是獨立的,
        //方法:各個對象的方法是共享的。
        zs.eat();
        ls.eat();
        zs.sleep("教室");
        /*String str = zs.introduce();
        System.out.println(str);*/
        System.out.println(zs.introduce());
    }
}      

四、局部變量和成員變量的差別

差別1:代碼中位置不同

         成員變量:類中方法外定義的變量 

         局部變量:方法中定義的變量  代碼塊中定義的變量 

差別2:代碼的作用範圍 

         成員變量:目前類的很多方法 

         局部變量:目前一個方法(目前代碼塊)    

差別3:是否有預設值 

         成員變量:有 

         局部變量:沒有 

大資料必學Java基礎(三十三):面向對象介紹

引用資料類型: null

差別4:是否要初始化 

         成員變量:不需要,不建議初始化,後續使用的時候再指派即可 

         局部變量:一定需要,不然直接使用的時候報錯 

差別5:記憶體中位置不同 

         成員變量:堆記憶體 

         局部變量:棧記憶體    

差別6:作用時間不同 

         成員變量:目前對象從建立到銷毀 

         局部變量:目前方法從開始執行到執行完畢 

代碼:  

package com.lanson;

/**
 * @Auther: lanson
 */
public class Student {
    byte e;
    short s;
    int c ;//成員變量:在類中方法外
    long num2;
    float f ;
    double d;
    char ch;
    boolean bo;
    String name;
    public void study(){
        int num = 10 ; //局部變量:在方法中
        System.out.println(num);//10
        //int num ;重複命名,出錯了
        {
            int a;//局部變量:在代碼塊中
        }
        int a;
        if(1==3){
            int b;
        }
        System.out.println(c);
    }
    public void eat(){
        System.out.println(c);
    }

    //這是一個main方法,是程式的入口:
    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.c);
        System.out.println(s.bo);
        System.out.println(s.ch);
        System.out.println(s.d);
        System.out.println(s.e);
        System.out.println(s.f);
        System.out.println(s.name);
        System.out.println(s.num2);
        System.out.println(s.s);

        s.d = 10.4;
    }
}      

運作結果:

五、構造器

package com.lanson;

/**
 * @Auther: lanson
 */
public class Person {
    //構造器:沒有任何參數的構造器我們叫做:空參構造器--》空構造器
    public Person(){
        /*age = 19;
        name = "lili";
        height = 169.5;*/
    }
    //屬性:
    String name;
    int age;
    double height;
    //方法:
    public void eat(){
        System.out.println("我喜歡吃飯");
    }
}      
package com.lanson;

/**
 * @Auther: lanson
 */
public class Test {
    //這是一個main方法,是程式的入口:
    public static void main(String[] args) {
        //建立一個Person類的具體的對象/執行個體/實體:
        /*
        建立對象的過程:
        1.第一次遇到Person的時候,進行類的加載(隻加載一次)
        2.建立對象,為這個對象在堆中開辟空間
        3.為對象進行屬性的初始化動作

        new關鍵字實際上是在調用一個方法,這個方法叫構造方法(構造器)
        調用構造器的時候,如果你的類中沒有寫構造器,那麼系統會預設給你配置設定一個構造器,隻是我們看不到罷了。
        可以自己顯式 的将構造器編寫出來:
        構造器的格式:
        [修飾符] 構造器的名字(){

        }
        構造器和方法的差別:
        1.沒有方法的傳回值類型
        2.方法體内部不能有return語句
        3.構造器的名字很特殊,必須跟類名一樣

        構造器的作用:不是為了建立對象,因為在調用構造器之前,這個對象就已經建立好了,并且屬性有預設的初始化的值。
        調用構造器的目的是給屬性進行指派操作的。

        注意:我們一般不會在空構造器中進行初始化操作,因為那樣的話每個對象的屬性就一樣了。
        實際上,我們隻要保證空構造器的存在就可以了,裡面的東西不用寫
         */
        Person p = new Person();
        System.out.println(p.age);
        System.out.println(p.name);
        System.out.println(p.height);

        Person p2 = new Person();
        System.out.println(p2.age);
        System.out.println(p2.name);
        System.out.println(p2.height);
    }
}      

六、構造器的重載

package com.lanson;
/**
 * @Auther: lanson
 */
public class Person {

    //屬性:
    String name;
    int age;
    double height;

    //空構造器
    public Person(){

    }
    public Person(String name,int age,double height){
        //當形參名字和屬性名字重名的時候,會出現就近原則:
        //在要表示對象的屬性前加上this.來修飾 ,因為this代表的就是你建立的那個對象
        this.name = name;
        this.age = age;
        this.height = height;
    }
    public Person(String a,int b){
        name = a;
        age = b;
    }

    //方法:
    public void eat(){
        System.out.println("我喜歡吃飯");
    }
}      
/**
 * @Auther: lanson
 */
public class Test {
    //這是一個main方法,是程式的入口:
    public static void main(String[] args) {
        /*
        1.一般保證空構造器的存在,空構造器中一般不會進行屬性的指派操作
        2.一般我們會重載構造器,在重載的構造器中進行屬性指派操作
        3.在重載構造器以後,假如空構造器忘寫了,系統也不會給你配置設定預設的空構造器了,那麼你要調用的話就會出錯了。
        4. 當形參名字和屬性名字重名的時候,會出現就近原則:
        在要表示對象的屬性前加上this.來修飾 ,因為this代表的就是你建立的那個對象

         */

        Person p = new Person();
        /*p.age = 19;
        p.name = "lili";
        p.height = 180.4;*/

        Person p2 = new Person("lili",19,180.4);
        System.out.println(p2.age);
        System.out.println(p2.height);
        System.out.println(p2.name);

    }
}      
  • 📢歡迎點贊 👍 收藏 ⭐留言 📝 如有錯誤敬請指正!
  • 📢本文由 Lansonli 原創
  • 📢停下休息的時候不要忘了别人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活✨