類和物件

瑪拉_以琳發表於2020-11-25

1. 類和物件

1.1 類和物件的理解

客觀存在的事物皆為物件 ,所以我們也常常說萬物皆物件。

    • 類的理解

      • 類是對現實生活中一類具有共同屬性和行為的事物的抽象
      • 類是物件的資料型別,類是具有相同屬性和行為的一組物件的集合
      • 簡單理解:類就是對現實事物的一種描述
    • 類的組成

      • 屬性:指事物的特徵,例如:手機事物(品牌,價格,尺寸)
      • 行為:指事物能執行的操作,例如:手機事物(打電話,發簡訊)
  • 類和物件的關係

    • 類:類是對現實生活中一類具有共同屬性和行為的事物的抽象
    • 物件:是能夠看得到摸的著的真實存在的實體
    • 簡單理解:類是對事物的一種描述,物件則為具體存在的事物

1.2 類的定義

類的組成是由屬性和行為兩部分組成

  • 屬性:在類中透過成員變數來體現(類中方法外的變數)
  • 行為:在類中透過成員方法來體現(和前面的方法相比去掉static關鍵字即可)

類的定義步驟:

①定義類

②編寫類的成員變數

③編寫類的成員方法

public class 類名 {
    // 成員變數
    變數1的資料型別 變數1;
    變數2的資料型別 變數2;
    …
    // 成員方法
    方法1;
    方法2;    
}

示例程式碼:

/*
    手機類:
        類名:
        手機(Phone)

        成員變數:
        品牌(brand)
        價格(price)

        成員方法:
        打電話(call)
        發簡訊(sendMessage)
 */
public class Phone {
    //成員變數
    String brand;
    int price;

    //成員方法
    public void call() {
        System.out.println("打電話");
    }

    public void sendMessage() {
        System.out.println("發簡訊");
    }
}

1.3 物件的使用

  • 建立物件的格式:

    • 類名 物件名 = new 類名();
  • 呼叫成員的格式:

    • 物件名.成員變數
    • 物件名.成員方法();
  • 示例程式碼
/*
    建立物件
        格式:類名 物件名 = new 類名();
        範例:Phone p = new Phone();

    使用物件
        1:使用成員變數
            格式:物件名.變數名
            範例:p.brand
        2:使用成員方法
            格式:物件名.方法名()
            範例:p.call()
 */
public class PhoneDemo {
    public static void main(String[] args) {
        //建立物件
        Phone p = new Phone();

        //使用成員變數
        System.out.println(p.brand);
        System.out.println(p.price);

        p.brand = "小米";
        p.price = 2999;

        System.out.println(p.brand);
        System.out.println(p.price);

        //使用成員方法
        p.call();
        p.sendMessage();
    }
}

1.4 學生物件-練習

  • 需求:首先定義一個學生類,然後定義一個學生測試類,在學生測試類中透過物件完成成員變數和成員方法的使用
  • 分析:

    • 成員變數:姓名,年齡…
    • 成員方法:學習,做作業…
  • 示例程式碼:
public class Student {
    //成員變數
    String name;
    int age;

    //成員方法
    public void study() {
        System.out.println("好好學習,天天向上");
    }

    public void doHomework() {
        System.out.println("鍵盤敲爛,月薪過萬");
    }
}
/*
    學生測試類
 */
public class StudentDemo {
    public static void main(String[] args) {
        //建立物件
        Student s = new Student();

        //使用物件
        System.out.println(s.name + "," + s.age);

        s.name = "林青霞";
        s.age = 30;

        System.out.println(s.name + "," + s.age);

        s.study();
        s.doHomework();
    }
}

2. 物件記憶體圖

2.1 單個物件記憶體圖

  • 成員變數使用過程

1.png

  • 成員方法呼叫過程

2.png

2.2 多個物件記憶體圖

  • 成員變數使用過程

3.png

  • 成員方法呼叫過程

4.png

  • 總結:

    多個物件在堆記憶體中,都有不同的記憶體劃分,成員變數儲存在各自的記憶體區域中,成員方法多個物件共用的一份

3. 成員變數和區域性變數

3.1 成員變數和區域性變數的區別

  • 類中位置不同:成員變數(類中方法外)區域性變數(方法內部或方法宣告上)
  • 記憶體中位置不同:成員變數(堆記憶體)區域性變數(棧記憶體)
  • 生命週期不同:成員變數(隨著物件的存在而存在,隨著物件的消失而消失)區域性變數(隨著方法的呼叫而存在,醉著方法的呼叫完畢而消失)
  • 初始化值不同:成員變數(有預設初始化值)區域性變數(沒有預設初始化值,必須先定義,賦值才能使用)

4. 封裝

4.1 封裝思想

  1. 封裝概述
    是物件導向三大特徵之一(封裝,繼承,多型)

    物件代表什麼,就得封裝對應的資料,並提供資料對應的行為

  2. 封裝程式碼實現
    將類的某些資訊隱藏在類內部,不允許外部程式直接訪問,而是透過該類提供的方法來實現對隱藏資訊的操作和訪問
    成員變數private,提供對應的getXxx()/setXxx()方法

4.2 private關鍵字

private是一個修飾符,可以用來修飾成員(成員變數,成員方法)

  • 被private修飾的成員,只能在本類進行訪問,針對private修飾的成員變數,如果需要被其他類使用,提供相應的操作

    • 提供“get變數名()”方法,用於獲取成員變數的值,方法用public修飾
    • 提供“set變數名(引數)”方法,用於設定成員變數的值,方法用public修飾
  • 示例程式碼:

    /*
        學生類
     */
    class Student {
        //成員變數
        String name;
        private int age;
    
        //提供get/set方法
        public void setAge(int a) {
            if(a<0 || a>120) {
                System.out.println("你給的年齡有誤");
            } else {
                age = a;
            }
        }
    
        public int getAge() {
            return age;
        }
    
        //成員方法
        public void show() {
            System.out.println(name + "," + age);
        }
    }
    /*
        學生測試類
     */
    public class StudentDemo {
        public static void main(String[] args) {
            //建立物件
            Student s = new Student();
            //給成員變數賦值
            s.name = "林青霞";
            s.setAge(30);
            //呼叫show方法
            s.show();
        }
    }

4.3 private的使用

  • 需求:定義標準的學生類,要求name和age使用private修飾,並提供set和get方法以及便於顯示資料的show方法,測試類中建立物件並使用,最終控制檯輸出  林青霞,30
  • 示例程式碼:

    /*
        學生類
     */
    class Student {
        //成員變數
        private String name;
        private int age;
    
        //get/set方法
        public void setName(String n) {
            name = n;
        }
    
        public String getName() {
            return name;
        }
    
        public void setAge(int a) {
            age = a;
        }
    
        public int getAge() {
            return age;
        }
    
        public void show() {
            System.out.println(name + "," + age);
        }
    }
    /*
        學生測試類
     */
    public class StudentDemo {
        public static void main(String[] args) {
            //建立物件
            Student s = new Student();
    
            //使用set方法給成員變數賦值
            s.setName("林青霞");
            s.setAge(30);
    
            s.show();
    
            //使用get方法獲取成員變數的值
            System.out.println(s.getName() + "---" + s.getAge());
            System.out.println(s.getName() + "," + s.getAge());
    
        }
    }

4.4 this關鍵字

  • this修飾的變數用於指代成員變數,其主要作用是(區分區域性變數和成員變數的重名問題)

    • 方法的形參如果與成員變數同名,不帶this修飾的變數指的是形參,而不是成員變數
    • 方法的形參沒有與成員變數同名,不帶this修飾的變數指的是成員變數
public class Student {
    private String name;
    private int age;

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

    public void show() {
        System.out.println(name + "," + age);
    }
}

5. 構造方法

5.1 構造方法概述

構造方法是一種特殊的方法

  • 作用:建立物件 Student stu = new Student();
  • 格式:

    public class 類名{

    ​ 修飾符 類名( 引數 ) {

    ​ }

    }

  • 功能:主要是完成物件資料的初始化
  • 示例程式碼:
class Student {
    private String name;
    private int age;

    //構造方法
    public Student() {
        System.out.println("無參構造方法");
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    測試類
 */
public class StudentDemo {
    public static void main(String[] args) {
        //建立物件
        Student s = new Student();
        s.show();
    }
}

5.2 構造方法的注意事項

  • 構造方法的建立

如果沒有定義構造方法,系統將給出一個預設的無引數構造方法
如果定義了構造方法,系統將不再提供預設的構造方法

  • 構造方法的過載

如果自定義了帶參構造方法,還要使用無引數構造方法,就必須再寫一個無引數構造方法

  • 推薦的使用方式

無論是否使用,都手工書寫無引數構造方法

  • 重要功能!

可以使用帶參構造,為成員變數進行初始化

  • 示例程式碼
/*
    學生類
 */
class Student {
    private String name;
    private int age;

    public Student() {}

    public Student(String name) {
        this.name = name;
    }

    public Student(int age) {
        this.age = age;
    }

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

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    測試類
 */
public class StudentDemo {
    public static void main(String[] args) {
        //建立物件
        Student s1 = new Student();
        s1.show();

        //public Student(String name)
        Student s2 = new Student("林青霞");
        s2.show();

        //public Student(int age)
        Student s3 = new Student(30);
        s3.show();

        //public Student(String name,int age)
        Student s4 = new Student("林青霞",30);
        s4.show();
    }
}

5.3 標準類製作

① 類名需要見名知意

② 成員變數使用private修飾

③ 提供至少兩個構造方法

  • 無參構造方法
  • 帶全部引數的構造方法

④ get和set方法

​ 提供每一個成員變數對應的setXxx()/getXxx()

⑤ 如果還有其他行為,也需要寫上

5.4 練習1

需求:

​ 定義標準學生類,要求分別使用空參和有參構造方法建立物件,空參建立的物件透過setXxx賦值,有參建立的物件直接賦值,並透過show方法展示資料。

  • 示例程式碼:
class Student {
    //成員變數
    private String name;
    private int age;

    //構造方法
    public Student() {
    }

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

    //成員方法
    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;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    建立物件併為其成員變數賦值的兩種方式
        1:無參構造方法建立物件後使用setXxx()賦值
        2:使用帶參構造方法直接建立帶有屬性值的物件
*/
public class StudentDemo {
    public static void main(String[] args) {
        //無參構造方法建立物件後使用setXxx()賦值
        Student s1 = new Student();
        s1.setName("林青霞");
        s1.setAge(30);
        s1.show();

        //使用帶參構造方法直接建立帶有屬性值的物件
        Student s2 = new Student("林青霞",30);
        s2.show();
    }
}

5.4 練習2

111.jpg

public class User {
    //1.私有化全部的成員變數
    //2.空參構造
    //3.帶全部引數的構造
    //4.針對於每一個私有化的成員變數都要提供其對應的get和set方法
    //5.如果當前事物還有其他行為,那麼也要寫出來,比如學生的吃飯,睡覺等行為

    private String username;//使用者名稱
    private String password;//密碼
    private String email;//郵箱
    private char gender;//性別
    private int age;//年齡

    //空參構造方法
    public User() {
    }

    //帶全部引數的構造
    public User(String username, String password, String email, char gender, int age) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.gender = gender;
        this.age = age;
    }

    //get和set

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

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

    public void eat(){
        System.out.println(username + "在吃飯");
    }
}

public class Test {
    public static void main(String[] args) {
        //寫一個標準的javabean類
        //我們們在課後只要能把這個標準的javabean能自己寫出來,那麼就表示今天的知識點就ok了


        //利用空參構造建立物件
        User u1 = new User();
        //如果利用空參建立物件,還想賦值只能用set方法賦值
        u1.setUsername("zhangsan");
        u1.setPassword("1234qwer");
        u1.setEmail("itheima@itcast.cn");
        u1.setGender('男');
        u1.setAge(23);
        //獲取屬性的值並列印
        System.out.println(u1.getUsername() + ", " + u1.getPassword()
                + ", " + u1.getEmail() + ", " + u1.getGender() + ", " + u1.getAge());
        u1.eat();

        System.out.println("=============================");

        //簡單的辦法
        //利用帶全部引數的構造來建立物件
        //快捷鍵:ctrl + p
        User u2 = new User("lisi","12345678","lisi@itcast.cn",'女',24);
        System.out.println(u2.getUsername() + ", " + u2.getPassword()
                + ", " + u2.getEmail() + ", " + u2.getGender() + ", " + u2.getAge());
        u2.eat();
    }
}

相關文章