類與對象、封裝、構造方法

1.1面向對象思想概述

  • java語言是一種面向對象的程序設計語言,而面向對象思想是一種程序設計思想,這裏的對象泛指現實中的一切事物,每種事物都具備自己的屬性和行爲
  • 特點:面向對象思想是一種更符合我們思考習慣的思想,它可以將簡單的事情複雜化,並將我們從執行者變成指揮者。
  1. 面向過程:把衣服脫下來-->找一個盆-->放點洗衣粉-->加點水-->浸泡10分鐘-->揉一揉-->清洗衣服-->擰乾-->晾
    起來
  2. 面向對象:把衣服脫下來-->打開全自動洗衣機-->扔衣服-->按鈕-->晾起來
  • 面向過程:強調步驟。
  • 面向對象:強調對象,這裏的對象就是洗衣機。
  • 面向對象的語言中,包含了三大基本特徵,即封裝、繼承和多態。 

1.2 類與對象

  • 類:是一組相關屬性和行爲的集合。可以看成是一類事物的模板,使用事物的屬性特徵和行爲特徵來描述該類事物。
  • 現實中,描述一類事物:
  1. 屬性:就是該事物的狀態信息。
  2. 行爲:就是該事物能夠做什麼。
  • 舉例:貓
  1. 屬性:名字、體重、年齡、顏色。
  2. 行爲:走、跑、叫。
  • 對象:是一類事物的具體體現。對象是類的一個實例,必然具備該事物的屬性和行爲。
  • 現實中,一類事物的一個實例:一隻小貓。
  • 舉例:一隻小貓。
  1. 屬性:jack、10kg、1years、yellow
  2. 行爲:溜牆根走、蹦躂的跑、喵喵叫

1.3 類與對象的關係

  • 類是對一類事物的描述,是抽象的
  • 對象是一類事物的實例,是具體的
  • 類是對象的模板,對象是類的實體

 1 .4類的定義

  • 現實世界中的一類事物:

       屬性:事物的狀態信息。 行爲:事物能夠做什麼。

  • java中用class描述事物也是如此:

       成員變量:對應事物的屬性。 成員方法:對應事物的行爲。

  • 類的定義格式:

        public class 類名{

             //成員變量

             //成員方法

         }

  • 定義類:就是定義類的成員,包括成員變量和成員方法
  • 成員變量:和以前定義變量幾乎是一樣的,只不過是位置發生了改變。在類中,方法外
  • 成員方法:和以前定義方法幾乎是一樣的,只不過把static去掉
public class Student {
    //成員變量
    private String name;
    private int age;
    private double score;

    //成員方法
    public void eat(){
        System.out.println("吃個蛋炒飯");
    }

    public void sleep(){
        System.out.println("學習java累了要睡覺");
    }
}

1.5 對象的使用

對象的使用格式

創建對象: 類名   對象名=new 類名();

使用對象訪問類中的成員:

對象名.成員變量;

對象名.成員方法;

 

public class Student_Test01 {
    public static void main(String[] args) {
        //創建對象
        Student s = new Student();
        System.out.println("s:"+s);

        //直接輸出成員變量的值
        System.out.println("姓名:"+s.name);
        System.out.println("年齡:"+s.age);
        System.out.println("-------------");

        //給成員變量賦值
        s.name="馬雲";
        s.age=19;

        System.out.println("姓名:"+s.name);
        System.out.println("年齡:"+s.age);
        //調用成員方法
        s.eat();
        s.sleep();
    }
}

1.6 成員變量的默認值

  數據類型 默認值
基本數據類型 整型(byte,short,int,long) 0
  浮點數(float,double) 0.0
  字符(char) '\u0000'
  布爾(boolean) false
引用數據類型 數組,類,接口 null

2.1成員變量和局部變量的區別

public class Car {
   int x;//類中方法外的變量是成員變量
    
    public void run(int speed){
        int a=10;//方法中或參數上的變量都是局部變量
    }
}
  • 什麼是成員變量:放在類中方法外的變量
  • 什麼是局部變量:放在方法中或參數上的變量
  • 成員變量和局部變量的區別
  • (在類中的位置不同)
  1. 成員變量:放在類中方法外
  2. 局部變量:放在方法中或參數上的變量
  • (作用範圍不一樣)
  1. 成員變量:類中都可以使用
  2. 局部變量:本方法中能用
  • (初始化值不同)
  1. 成員變量:有默認值
  2. 局部變量:沒有默認值,不賦值不能用
  • (在內存中的位置不同)
  1. 成員變量:堆內存
  2. 局部變量:棧內存
  • (生命週期不同)
  1. 成員變量:隨着對象的創建而存在,隨着對象的消失而消失
  2. 局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失

3.1 面向對象三大特性:封裝、繼承、多態

  •  封裝
  • 人的屬性:姓名,年齡,身高,性別,三圍,銀行卡密碼,錢包等。
  • 人有很多屬性,但是有些屬性是隱私的,不能暴露出來。
  • 封裝的原則(步驟):
  1. 將隱私的內容私有。
  2. 提供get/set方法(get表示獲取/set表示修改)
  • 如何將成員變量私有
  1. 使用private關鍵字。
  2. private表示私有,只有本類可以使用。
  3. private可以修飾成員變量和成員方法。
  • private修飾成員變量格式
  1. private 數據類型  變量名(如:private  String name)
  • 封裝的好處:提高代碼的安全性。

4.1 this關鍵字: 

  • 成員變量和局部變量重名了(就近原則),使用局部變量。
  • this關鍵字的作用:用來區分局部變量和成員變量
  • this.變量名    表示成員變量
  • this到底是什麼東西呢?誰調用方法,this就是誰
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        name = name;
        age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        age = age;
    }
}





public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(18);
        p.setName("馬雲");
        System.out.println("姓名:"+p.getName()+"年齡:"+p.getAge());
    }
}
  • 雖然使用了p.setAge和p.setName給成員變量賦值了,但是打印出來結果還是姓名:null年齡:0  。這是因爲get/set方法中name/age還是局部變量,並沒有賦值給成員變量。需要加上this關鍵字解決,this.name代表成員變量的name,則this.name=name,這樣就將值賦給成員變量了。
  • 成員變量賦值失敗了,也就是說,在修改了setXxx() 的形參(方法小括號中的String name爲形參)變量名後,方
    法並沒有給成員變量賦值!這是由於形參變量名(name)與成員變量名(name)重名,導致成員變量名被隱藏,方法中的變量名,無法訪問到成員變量,從而賦值失敗。所以,我們只能使用this關鍵字解決問題。

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("this="+this);
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}




public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println("p="+p);
        p.setAge(18);
        p.setName("馬雲");
        System.out.println("姓名:"+p.getName()+"年齡:"+p.getAge());
    }
}
  •  輸出結果:
p=Test.Person@58ceff1 
this=Test.Person@58ceff1
姓名:馬雲年齡:18

在上面的代碼中,我們把對象p和this打印出來,發現p和this的地址值是一樣 的,都是 @58ceff1,說明是同一個對象,p調用了setName方法 ,setName中的this地址和p一樣,所以,誰調用了方法,this就是誰


 5.1 構造方法

  • 什麼是構造方法:構造方法也是一個方法,在創建對象的時候執行一次(早)
  • 構造方法的作用:在創建對象的時候給成員變量賦值(給對象初始化)
  • 構造方法格式:
  • public 類名(){ 
        
    }
    
  •  特點:
  1. 沒有返回值,連void都不能寫。
  2. 構造方法名稱和類名一致。
  3. 一個類不寫構造方法,java會默認贈送一個無參構造。
  4. 當我們自己添加了構造方法,就沒有默認的無參構造方法了。
  5. 構造方法可以重載。
  •  構造方法什麼時候調用:
  • 類名   對象名  = new 類名();

        Person p = new Person

        new  :表示在堆中申請一塊內存空間

        類名():表示調用構造方法

public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println("p="+p);
        /*
            問題1:如果代碼太多,可能會忘記賦值,最終沒值
            問題2:如果有50個成員變量賦值,需要寫50個set方法,麻煩
            有沒有什麼辦法一創建出對象,成員變量就有值了,後面直接使用
            這時就需要使用有參構造方法
         */
        p.setAge(18);
        p.setName("馬雲");
        System.out.println("姓名:"+p.getName()+"年齡:"+p.getAge());

        System.out.println("-------------------------");
        //創建對象,使用有參構造
        Person p2 = new Person("馬化騰",19);
        System.out.println("姓名:"+p2.getName()+"年齡:"+p2.getAge());
    }
}





public class Person {
    private String name;
    private int age;

    public Person() {
        System.out.println("我是無參構造");
    }

    public Person(String name, int age) {
        System.out.println("我是有參構造");
        this.name = name;//將參數賦值給成員變量
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("this="+this);
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

構造方法可以給成員變量賦值,set方法也可以給成員變量賦值,他們的區別是

  • 構造方法會在創建對象的時候走一次,一個對象只能執行一次構造方法。
  • set方法是在對象創建好之後,通過對象調用set方法,一個對象可以多次調用set方法,這樣就可以修改值。(比如年齡今年是18歲,過了一年變成19,那麼就需要通過set方法去修改值)

版權申明:本文爲博主原創文章,轉載請註明出處https://blog.csdn.net/Huangyuhua068/article/details/81417223

歡迎交流學習,聯繫郵箱:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章