06-Java面向對象

面向對象

面向對象的特徵
封裝(encapsulation)
繼承(inheritance)
多態(polymorphism)
類與對象的概述
  • 現實生活中如何描述事物
    • 屬性 就是該事物的描述信息
    • 行爲 該事物能夠做什麼
  • Java中最基本的單位是類,Java中用class描述事物
    • 成員變量 事物的屬性
    • 成員方法 事物的行爲
  • 定義類其實就是定義類的成員(成員變量和成員方法)
    • 成員變量 和以前定義變量一樣,只是位置發生了變化.在類中方法外
    • 成員方法 和以前定義方法一樣,只不過去掉了static
類和對象的概念
  • 類:是一組相關屬性和行爲的集合
  • 對象:是該類事物的具體體現
  • 舉例
    • 類:學生
    • 對象:具體某個學生
class Demo1_Student {
    public static void main
    (String[] args){
        //創建對象的格式: 類名 對象名=
        new 類名();
        //對象名:其實就是合法的標識符,如
        果一個單詞所有字母小寫,如果是多個
        單詞,從第二個單詞開始首字母大寫

        Student s=new Student();

        //如何使用成員變量? 對象名.變量名
        s.nema="張三";
        s.age=23;

        //如何使用成員方法? 
        對象名.方法名(...)
        s.study();
        s.sleep();
    }
}
class Student{
    String name;
    int age;
    String gender;

    public void study(){
        System.out.println("學生學習");
    }
    public void sleep(){
        System.out.println("學生睡覺");
    }
}
學生類的使 用
文件名問題
  • 在一個Java文件中寫兩個類:一個基本類,一個測試類.
  • 建議文件名和測試類一致
如何適用對象
  • 創建對象並使用
  • 格式: 類名 對象名 = new 類名();
如何使用成員變量
  • 對象名.變量名
如何使用成員方法
  • 對象名.方法名(…)
class Demo1_Car{
    public static void main(String[]
    args){
        Car c1=new Car();//創建對象
        //調用屬性並賦值
        c1.color="red";//爲車的輪胎數賦值
        c1.num=8;      //爲車的輪胎數賦值
        //調用行爲
        c1.run();
        Car c2=new Car();//創建對象
        c2.colar="black";//爲車的顏色賦值
        c2.num=4;        
        //爲車的輪胎數賦值
        //c2=null;  
        //用null把原來的地址值覆蓋掉
        //c2.run(); 
        //c2裏面的記錄是null,所以報出
        空指針異常
        Car c3=c2;
        c3.run();
    }
}
/*
車的屬性 車的顏色 車的輪胎數
車的行爲 車運行
*/
class Car{
    //成員變量
    String colar;         //車的顏色
    int num;              //車的輪胎數

    public void run(){    //車運行
        System.out.println(colar+"..."+num);
    }
}
  • 一個對象的內存圖
    一個對象的內存圖

  • 兩個對象的內存圖
    兩個對象的內存圖

  • 三個對象的內存圖
    這裏寫圖片描述

  • 匿名對象內存圖
    匿名對象內存圖

成員變量和局部變量的區別
在類中的位置不同
  • 成員變量:在類中方法外
  • 局部變量:在方法定義中或者方法聲明上
在內存中的位置不同
  • 成員變量:在對內存中(成員變量屬於對象,對象進堆內存)
  • 局部變量:在棧內存中(局部變量屬於方法,方法進棧內存)
生命週期不同
  • 成員變量:隨着對象的創建而存在,隨着對象的消失而消失
  • 局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
初始化值不同
  • 成員變量:有默認初始化值
  • 局部變量:沒有默認初始化值,必須定義,賦值,然後才能使用
注意事項
  • 局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,採用的是就近原則
  • 基本數據類型變量包括哪些:byte,short,int,long,float,double,boolean,char
  • 引用數據類型變量包括哪些:數組,類,接口,枚舉
class Demo2_Person{
    public static void main(String[] 
    args){
        Person p =new Person();
        p.speak();
    }
}
class Person{
        String name;        //成員變量
    int num;

    public void speak() {
        int num = 10;       
        //xnum都是局部變量
        System.out.println(name);
        System.out.println(num);
    }
}
方法的形式參數是類名的時候如何調用
  • 方法的參數是類名 public void print (Student s){}//print(new Student());
    • 一個方法的形式參數是一個類類型(引用類型),這裏其實需要的是該類的對象
匿名對象的概述和應用
class Demo1_Student {
    public static void main(String[] 
    args) {
        print(10);

    //創建對象,並將對象的地址值賦值給s
        Student s = new Student();

        print(s);
    }

    //基本數據類型當作形式參數
    public static void print(int x) {   
        System.out.println(x);
    }

    //引用數據類型當作形式參數
    public static void print(Student stu){  
        stu.name = "張三";
        stu.age = 23;
        stu.speak();
    }
}

/*
* A:方法的參數是類名public void print
(Student s){}//print(new Student());
* 如果你看到了一個方法的形式參數是一個類
類型(引用類型),這裏其實需要的是該類的對象
*/
class Student {
    String name;        //姓名
    int age;        //年齡

    public void speak() {
        System.out.println(name + "..." 
        + age);
    }
}
匿名對象:沒有名字的對象
匿名對象的應用場景
  • 場景:僅僅用一次的時候
  • 好處:節省代碼(多次調用的時候不合適,匿名對象調用完畢就是垃圾,可以被垃圾回收器回收)
  • 注意:調用多次的時候不適合.匿名對象調用完畢就是垃圾,可以被垃圾回收器回收
  • 匿名對象可以作爲實際參數傳遞
  • 案例演示
    • 匿名對象應用場景
class Demo2_Car {
    public static void main(String[] 
    args) {
        /*Car c1 = new Car();   
        //創建有名字的對象
        c1.run();
        c1.run();

        new Car().run();        
        //匿名對象調用方法
        new Car().run();    */
        /*匿名對象只適合對方法的一次調用,
        因爲調用多
        次就會產生多個對象,不如用有名字的
        對象*/    

        //匿名對象是否可以調用屬性並賦值?
        有什麼意義?
        /*
        匿名對象可以調用屬性,但是沒有意義
        ,因爲調用後就變成垃圾
        如果需要賦值還是用有名字對象
        */
        new Car().color = "red";
        new Car().num = 8;
        new Car().run();
    }
}

class Car {
    String color;       //顏色
    int num;        //輪胎數

    public void run() {
        System.out.println(color + "..." 
        + num);
    }
}

class Demo3_Car {
    public static void main(String[] 
    args) {
        //Car c1 = new Car();
        /*c1.color = "red";
        c1.num = 8;
        c1.run();*/
        //method(c1);

        method(new Car());

        //Car c2 = new Car();
        //method(c2);
        method(new Car());      
        //匿名對象可以當作參數傳遞
    }

    //抽取方法提高代碼的複用性
    public static void method(Car cc) { 
    //Car cc = new Car();
        cc.color = "red";
        cc.num = 8;
        cc.run();
    }
}

class Car {
    String color;       //顏色
    int num;        //輪胎數

    public void run() {
        System.out.println(color + "..."
        + num);
    }
}
封裝的概述
封裝概述
  • 封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問的方式
封裝的好處
  • 隱藏實現的細節,提供公共訪問方式
  • 提高代碼的複用性
  • 提高安全性
封裝原則
  • 將不需要對外提供的內容都隱藏起來
  • 把屬性隱藏,提供公共方法對其訪問
privite關鍵字的概述和特點
private關鍵字的特點
  • 是一個權限修飾符
  • 可以修飾成員變量和成員方法
  • 被其修飾的成員只能在本類中被訪問
案例演示
  • private僅僅是封裝的一種體現形式,不能說封裝就是privat
/*
* A:人類賦值年齡的問題
* B:private關鍵字特點
    * a:是一個權限修飾符
    * b:可以修飾成員變量和成員方法
    * c:被其修飾的成員只能在本類中被訪問
* C:案例演示
    * 封裝和private的應用:
    * A:把成員變量用private修飾
    * B:提供對應的getXxx()和setXxx()方法
    * private僅僅是封裝的一種體現形式,不
    能說封裝就是私有
*/
class Demo1_Person {
    public static void main(String[] 
    args) {
        Person p1 = new Person();
        p1.name = "張三"; 
        //調用姓名屬性並賦值
        //p1.age = -17;             
        //調用年齡屬性並賦值
        //p1.speak();   //調用行爲

        p1.setAge(-17);

        System.out.println(p1.getAge());
    }
}

class Person {
    String name;            //姓名
    private int age;        //年齡

    public void setAge(int a) { 
    //設置年齡
        if (a > 0 && a < 200) {
            age = a;
        }else {
            System.out.println(
            "請回火星吧,地球不適合你");
        }

    }

    public int getAge() {       
    //獲取年齡
        return age;
    }

    public void speak() {
        System.out.println(name + "..." 
        + age);
    }
}
this關鍵字的概述和應用
this關鍵字的特點
  • 代表對當前對象的引用
案例演示
  • this的應用場景
  • 用來區分成員變量和局部變量重名
/*
* A:this關鍵字特點
    * 代表當前對象的引用 
* B:案例演示
    * this的應用場景
    * 用來區分成員變量和局部變量重名
*/
class Demo1_This {
    public static void main(String[]
    args) {
        Person p1 = new Person();
        p1.setName("張三");
        p1.setAge(23);
        System.out.println(p1.getName() 
        + "..." + 
        p1.getAge());

        Person p2 = new Person();
        p2.setName("李四");
        p2.setAge(24);
        System.out.println(p2.getName()
        + "..." + 
        p2.getAge());
    }
}

class Person {
    private String name;            
    //姓名
    private int age;                
    //年齡

    public void setAge(int age) {   
    //設置年齡
        if (age > 0 && age < 200) {
            this.age = age;
            //System.out.println(age);
        }else {
            System.out.println(
            "請回火星吧,地球不適
            合你");
        }

    }

    public int getAge() {           
    //獲取年齡
        return age;
    }

    public void setName(String name) {  
    //設置姓名
        this.name = name;
        //System.out.println(name);
    }

    public String getName() {
        return name;
    }
}
class Demo2_Phone {
    public static void main(String[] 
    args) {
        Phone p1 = new Phone();
        p1.setBrand("三星");
        p1.setPrice(5288);

        System.out.println(p1.getBrand() 
        + "..." + p1.getPrice());
        p1.call();
        p1.sendMessage();
        p1.playGame();
    }
}
/*
手機類
    屬性:品牌brand,價格price
    行爲:打電話call,發短信sendMessage,玩
    遊戲,playGame
*/
class Phone {       //java bean
    private String brand;       
    //品牌
    private int price;
    //價格
    public void setBrand(String brand) {
    //設置品牌
        this.brand = brand;
    }

    public String getBrand() {
    //獲取品牌
        return this.brand;  
        //this.可以省略,你不加系統會默認
        給你加
    }

    public void setPrice(int price) {
    //設置價格
        this.price = price;
    }

    public int getPrice() { 
    //獲取價格
        return price;
    }

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

    public void sendMessage() {
    //發短信
        System.out.println("發短信");
    }

    public void playGame() {    
    //玩遊戲
        System.out.println("玩遊戲");
    }
}
發佈了1 篇原創文章 · 獲贊 0 · 訪問量 3295
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章