1. 程式人生 > >初步學習JAVA面向對象初步認識及面向對象內存分析圖舉例說明

初步學習JAVA面向對象初步認識及面向對象內存分析圖舉例說明

多態 ... txt 事務 class void 內存模型 規模 println

  1. 說到面向對象, 一個繞不開的話題,就是面向過程.

  面向過程適合簡單、不需要協作的事務。 面向過程 = 分解問題 + 邏輯為先 = 先細節,再整體。

  對比面向過程, 面向對象是模塊化的, 當我們思考比較復雜的問題,比如“如何造車?”,就會發現列出1234這樣的步驟,是不可能的。那是因為,造車太復雜,需要很多協作才能完成。此時面向對象思想就應運而生了。面向對象 = 多態 + 繼承 = 先抽象,後具體.

  借參考資料描述對比:

  面向過程(Procedure Oriented)和面向對象(Object Oriented,OO)都是對軟件分析、設計和開發的一種思想,它指導著人們以不同的方式去分析、設計和開發軟件。早期先有面向過程思想,隨著軟件規模的擴大,問題復雜性的提高,面向過程的弊端越來越明顯的顯示出來,出現了面向對象思想並成為目前主流的方式。兩者都貫穿於軟件分析、設計和開發各個階段,對應面向對象就分別稱為面向對象分析(OOA)、面向對象設計(OOD)和面向對象編程(OOP)。

  面向對象具有三大特征:封裝性、繼承性和多態性,而面向過程沒有繼承性和多態性,並且面向過程的封裝只是封裝功能,而面向對象可以封裝數據和功能。所以面向對象優勢更明顯。

  2. 面向對象是具有模塊化, 也就是類.

  類就是一個模版, 一個集群事物的抽象集合.

  一個車類,所有車的抽象結合體,具體什麽類看怎麽區分. 車類的實體按照大小級別, 有轎車,面包車,火車,汽車等. 按照牌子分奔馳,奧迪,寶馬,沃爾沃等等.

  在java中, 共同抽象的叫類,class. 具體有類產生的實體叫對象. object.

  總結一下:類和對象之間關系: 類是用於描述同一類型的對象的一個抽象概念,類中定義了這一類對象所應具有的共同的屬性, 方法等.

  java類和對象例:

package cn.sxt.oop;

public class Test_s {
    int id;
    String name = "pikaqiu";
    double score;
    
    public static void main(String[] args) {
        System.out.println("面向對象的學習....");
        // 對於類,獲取對象
        Test_s stu = new Test_s();
        System.out.println(stu.name);
    }
}

  2. 類的屬性和方法

  類的屬性用於定義該類或者該類對象包含的數據或靜態特征. 屬性作用範圍是整個類.

  在定義成員變量時,可以對其初始化, 如果不對其初始化, java使用默認值對其初始化.

數據類型 默認值
整型 0
浮點型 0.0
字符型 ‘\u0000‘
布爾型 false
所有引用類型 null

  方法用於定義該類或者該類實例的行為特征和功能是想.  方法是類和對象行為特征對抽象.

  方法很類似於面向過程中對函數. 面向過程中, 函數是最基本單位, 整個程序由一個或者多個函數調用組成. 面向對象中, 整個程序對基本單位是類,方法是從屬於類和對象對.

  3. 面向對象對內存分析;

  Java虛擬機對內存可以分為三個區域: 棧stack, 堆heap, 方法區method area.

  棧對特點如下:

  (1). 棧描述對是方法執行對內存模型. 每個方法被調用都會創建一個棧楨(儲存局部變量,操作數,方法出口等)

  (2). JVM為每個線程創建一個棧,用於存放該線程執行方法都信息(實際參數,局部變量等)

  (3). 棧屬於線程私有, 不能實現線程間都共享

  (4). 棧都存儲特性是“先進後出,後進先出”

  (5). 棧是由系統自動分配,速度快. 棧是一個連續都內存空間.

  堆都特點如下:

  (1). 堆用於存儲創建好都對象和數組(數組也是對象)

  (2). JVM只有一個堆, 被所有線程共享

  (3). 堆是一個不連續都內存空間,分配靈活,速度慢.

  方法區(又叫靜態區)特點如下:

  (1). JVM只有一個方法區,被所有線程共享

  (2). 方法區實際也是堆, 只是用於存儲類,常量相關信息

  (3). 用來存放程序中永遠是不變或者唯一都內容. (類信息[class對象], 靜態變量static,字符串,方法等)

  例子一: Student類說明棧, 堆, 方法區  

package cd.bjtxt.array;

public class Student {
    String name;
    int id;
    int age;
    String gender;
    int weig?ht;
    static int number = 100; //靜態常量存儲在方法區
    
    public void study(){
        this.name = "高進";
        System.out.println(name+"正在學習中,請勿打擾...");
    }
    
    public void sayHello(String sname){
        System.out.println(name+"向"+sname+"問好");
    }
    
    public static void main(String[] args) {
        /*
         *    s1,s2是類構造等實例對象,它是一個指針,指向對中的一一對應對象
         *    name, id, age是實例對象的屬性
         *    study() 和 sayHello()是實例對象的方法
         */
        Student s1 = new Student();
        s1.study();
        s1.sayHello("Tom");
        
        System.out.println("####################");
        Student s2 = new Student();
        s2.name = "皮卡丘";
        s2.sayHello("小兒");
    }
}

  控制臺顯示舉例一打印結果

高進正在學習中,請勿打擾...
高進向Tom問好
####################3
皮卡丘向小兒問好

  參照舉例一畫的對應的面向對象內存分析圖

技術分享圖片 

 舉例二, 集合舉例一稍微改進, Student 和 Compuent類說明 棧, 堆, 方法區.

public class Student {
    String name;
    int id;
    int age;
    String gender;
    int weight;
    Computer comp; // 每人一臺電腦,一個類可以作為屬性
    
    public void study(){
        System.out.println("我們的學生學習都用"+comp.brand+" 電腦的cpu是" +comp.cpu);
    }
    
    public void sayHello(String sname){
        System.out.println(name+"向"+sname+"問好");
    }
    
    public static void main(String[] args) {
        Computer c = new Computer();
        c.brand = "聯想";
        c.cpu = 920;
        
        Student s1 = new Student();
        // Student具有Computer這個屬性
        s1.comp = c;
        s1.study();
        s1.sayHello("Tom");
        
        System.out.println("####################");
        Student s2 = new Student();
        s2.name = "皮卡丘";
        s2.sayHello("小兒");
    }
}

class Computer{
    String brand;
    int cpu;
}

  控制臺顯示舉例一打印結果

我們的學生學習都用聯想 電腦的cpu是920
null向Tom問好
####################
皮卡丘向小兒問好

   參照舉例二畫的對應的面向對象內存分析圖

技術分享圖片   

初步學習JAVA面向對象初步認識及面向對象內存分析圖舉例說明