Java學習 DAY07 物件和類

2020-08-10 08:39:12

物件導向的引入

物件導向本質是一種程式設計範式(思考方式)
程序導向:關注的是程式碼的實現細節
物件導向:先把程式碼實現細節整合到物件中,找到這個物件就能擁有物件的功能
物件導向基於程序導向,物件導向優於程序導向?如果我們場景比較簡單優先推薦程序導向,如果場景很複雜優先推薦物件導向
在这里插入图片描述在这里插入图片描述

物件和類之間的關係
對一類物件來進行抽取,把共有的特徵資訊抽取成了屬性,把共有的行爲資訊抽取成了方法,把這一類物件抽取成了類。類是對物件的概括,物件是對類的具體實現。
在这里插入图片描述

構造方法

a.構造方法
b.1.與類同名 2.沒有返回值型別
c.有參構造用於屬性初始化,支援構造方法過載
d.當類中沒有定義任何形式的構造方法jvm會在底層預設新增無參構造,如果類中已經定義構造方法那麼底層就不會再新增無參構造
e.類中至少含有一個構造方法

public class MethodDemo2 {
    public static void main(String[] args) {
        //建立person類物件p
        //構造方法---構建物件
        Person p = new Person("tom");
        //給物件的屬性進行賦值
        //.代表「的」的意思
        p.gender = '男';
        p.age = 66;
        //輸出
        System.out.println(p.name + "," + p.gender + "," + p.age);
        //呼叫方法
        p.sleep();
        p.eat();


        //建立person類物件
        Person p1 = new Person();
        //給物件的屬性進行賦值
        p1.name = "heh";
        p1.gender = '女';
        p1.age = 55;
        //輸出
        System.out.println(p1.name + "," + p1.gender + "," + p1.age);
        //呼叫方法
        p1.sleep();
        p1.eat();
    }
}


//代表人的類
class Person{
    //特徵---屬性
    //不加static的屬性就是非靜態屬性
    //成員變數
    String name;
    char gender;
    int age;


    //當類中沒有定義任何形式的構造方法jvm預設在底層新增無參構造
    //當類中定義構造方法底層就不會預設新增無參構造
    //無參構造
    //1.沒有返回值型別  2.與類同名
    public  Person(){}
    //普通方法可以與類同名
    //public void Person(){}

    //有參構造---物件屬性初始化
    //java支援構造方法過載
    public Person(String name){//方法有就近原則
        //this代表我們當前類的物件
        this.name = name;

    }

    //行爲---方法---成員方法

    public void eat() {
        int age = 1;//區域性變數

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

        System.out.println(name + "在睡覺...");
    }
}

java中所有的非靜態屬性和方法要由物件呼叫

this

a.關鍵字,代表當前類的物件
b.可以代表當前類還沒有產生的物件,代表當前類剛建立的物件,代表當前類正在使用的物件。this是靈活的指代(虛擬),可以指代成當前類正在活動的物件
c.this語句—在同一個類中的構造方法裡呼叫別的構造方法,首行

public class ThisDemo {
    public static void main(String[] args) {
        //常見物件
        Student s1 = new Student();
        //this可以代表當前類剛建立物件
        System.out.println("s1:" + s1);
        //建立物件
        Student s2 = new Student("tom");
        //this是一個靈活的指代
        System.out.println("s2:" + s2);
        //this指代成當前類正在使用的物件
        s1.study();
        s2.study();

    }
}


//代表學生的類
class Student{
    //屬性
    String name;
    int age;
    char gender;


    //無參構造
    public  Student(){
        System.out.println("this:" + this);
    }


    //有參構造
    public Student(int age){
        this();
    }

    //有參構造
    public  Student(String name){
        //呼叫別的構造方法
        //Student();呼叫不到
        //this語句---呼叫別的構造方法   要在首行
        this(1);
        this.name = name;
        System.out.println("this:" + this);
    }

    //方法
    public void study(){
        //this可以代表當前類還沒有建立物件
        System.out.println(this.name + "在學習...");
        //
        System.out.println("this:" + this);
    }

}

構造程式碼塊
a.在方法外類內{}
b.屬性初始化
c.優先於所有的構造方法先執行

區域性程式碼塊
a.方法內{}
b.控制變量的生命週期,提供記憶體利用率

public class ObjectDemo2 {
    public static void main(String[] args) {
        //
        Baby b = new Baby();
        //
        System.out.println(b.name + "," + b.age);
    }
}


//代表嬰兒的類---建立物件就是真是的嬰兒
//要求:不管怎麼出生,嬰兒的名字叫莉莉,年齡是一歲
class Baby{
    //屬性
    String name;
    int age;
    char gender;



    //構造程式碼塊
    //優先於所有的構造方法先執行
    //屬性初始化
    {
        this.name = "莉莉";
        this.age = 1;
    }

    //無參構造---嬰兒沒有名字沒有年齡
    public Baby(){
        /*this.name = "莉莉";
        this.age = 1;*/
    }


    //有參構造----嬰兒出生時有名字
    public  Baby(String name){
        //this.name = name;

         /* this.name = "莉莉";
        this.age = 1;*/
    }

    //嬰兒出生時有名字也有年齡
    public  Baby(String name,int age){
      /*  this.name = name;
        this.age = age;*/

       /* this.name = "莉莉";
        this.age = 1;*/
    }



    //方法
    public void cry(){
        System.out.println(name + "在嗷嗷的哭......");
    }
}

成員變數與區域性變數的區別

  1.位置
          成員變數:方法外類內
          區域性變數:方法內
  2.適用範圍
          成員變數:整個類
          區域性變數:整個方法
  3.記憶體
          成員變數:堆
          區域性變數:棧
  4.生命週期
          成員變數:隨着類建立物件而出現,隨着物件被揮手而消失
          區域性變數:當方法被呼叫時纔出現,隨着方法執行結束而消失

物件導向的特徵
封裝、繼承、多型(抽象)

封裝

體現形式—方法,屬性私有化並且提供公共的存取方式來進行正常取值和賦值,提高程式碼數據安全性。

public class FZDemo {
    public static void main(String[] args) {
        //建立代表人的類的物件
        Person p = new Person();
        //給物件屬性賦值
        p.setName("heh");
        //呼叫方法間接給私有化屬性進行賦值
        p.setAge(-10);
        p.setGender('男');
        //呼叫方法間接給私有化屬性進行取值
        System.out.println(p.getName() + "," + p.getAge() + "," + p.getGender());
    }
}

//代表人的類
class  Person{
    //屬性
    private  String name;
    //私有化屬性,只能在我們的本類中直接使用
    private int age;
    private char gender;

    //Alt+Insert---Generate

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

    public void setAge(int age) {
        if (age < 0) {
            System.out.println("數據有誤!!!");
        }else{
            this.age = age;
        }
    }

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public char getGender() {
        return gender;
    }


    /*//定義方法間接的給私有化屬性進行賦值
    public void setAge(int age){
        if (age < 0) {
            System.out.println("數據有誤!!!");
        }else{
            this.age = age;
        }
    }

    //間接定義方法給私有化屬性進行取值
    public int getAge() {
        return age;
    }*/

    /*//有參構造
    public Person(int age){
        if (age < 0) {
            System.out.println("數據有誤!!!");
        }else{
            this.age = age;
        }
    }*/
}