天天看點

java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

目錄

第一章、對象和類

一、面向對象的程式設計

1.抽象的資料類型

2.什麼是類

3.總結

二.定義一個類

1.定義類的成員變量

2.定義類的成員的方法

3.類的成員變量和方法總結

4.建立并使用對象

第二章、方法

一.方法的重載

1.方法的辨別

2.方法的重載

3.通路重載方法

4.重載總結

二、構造方法

1.構造方法

2.構造方法的作用

3.規則

4.this關鍵字:

5.this();

第三章、數組

一、引用類型數組

1.數組是對象

2.引用類型數組的聲明

3.數組的初始化(重點)

4、數組的元素是基本類型數組(二維數組)

5.總結

第四章、對象記憶體管理(重點)

一、堆記憶體

1.對象存儲在堆中

2.成員變量的生命周期

3.垃圾回收機制(面試,建議研究)

4.記憶體洩漏

5.System.gc()方法

二、非堆-棧

1.棧存的是方法中的局部變量

2.局部變量的生命周期

3.成員變量和局部變量的差別

 三、非棧-方法區

1.存放類的資訊

2.方法隻有一份,唯一性

四、堆、棧、方法區的差別

第一章、對象和類

一、面向對象的程式設計

1.抽象的資料類型

  • 将不同類型的資料的集合組成的整體用來描述一種新的事物。
  • 人 : 包含了 (String name , int age ,char sex ,double salary) 4中不同類型的資料組成的整體
  • 學生 : 包含了(String name, double score,String grade) 也是不同類型的資料組成的整體
  • 思考 : 人把大象裝進冰箱分幾步?
  • 人 : 資料類型有(String name ,int age ....) 功能(人裝大象 打開冰箱門 關上冰箱門)行為
  • 大象 :資料類型( double weight ,String name) 行為(被人拿起,裝進冰箱)
  • 冰箱 : 資料類型( String singe) 行為(關門,開門)
  • 上面所出現的人、學生、大象、冰箱都是一種抽象資料類型----類!
  • 類是Java語言最基本機關。

2.什麼是類

類的成員:

  • 屬性(成員變量)
  • 方法(函數,成員的行為)
public class Person{//該類隻定義了4個成員變量
​
//成員變量 
String name; 
int age; 
char sex; 
double salary; }
           

3、類的轉化過程

  • 列印學生的第一個方法
/*
* 列印學生資訊的方法 
* 姓名、年齡、性别、學号 
*/ 
​
public static void sudentInfo(String name,int age,char sex,double number) {
    System.out.println("---------------"); 
    System.out.println("姓名: " + name); 
    System.out.println("年齡:" + age); 
    System.out.println("性别: " + sex); 
    System.out.println("學号:" + number); 
}
           

      參數中多種不同類型的資料,我們考慮采用抽象資料類型-類來替換參數類型

  • 列印學生資訊的第二種方式
package com.hqyj.oop.classes;
//學生類
public class Student {
​
    String name;
    int age;
    double score;
​
    //列印學生基本資訊的方法--資料和操作資料的行為統\
    public  void studentInfo (Student student) {
        System.out.println("姓名:" + student.name) ;
        System.out.println("年齡:" + student.age);
        System.out.println("分數:" + student.score);
    }
​
}
           

     列印學生資訊方法隻能針對Student資料操作,是屬于Student自身方法,是以沒有實作資料與操作資料的行為統一

  • 列印學生資訊的第三種方法
package com.hqyj.oop.classes;
//學生類
public class Student {
​
    //屬性
    String name;
    int age;
    double score;
​
    //列印學生基本資訊的方法--資料和操作資料的行為統\
    //方法:
    public  void studentInfo (Student student) {
        System.out.println("姓名:" + student.name) ;
        System.out.println("年齡:" + student.age);
        System.out.println("分數:" + student.score);
    }
    public static void main(String[] args) { 
        Student stu = new Student(); 
        stu.sudentInfo(); 
    }
    
}
           

      Student列印學生的資訊方法隻針對與Student操作,是Student内部的方法。

類的組成:屬性(資料本身)和方法(操作資料的行為)

3.總結

  • 類是一種抽象的資料類型
  • OOP(Object Oriented Programming)面向對象程式設計實際是分類型思想。将過程種出現的資料泛化稱為類。
  • 類的組成:屬性和方法
  • main方法也屬于類的方法

二.定義一個類

1.定義類的成員變量

  • 用于描述該類型對象共同的資料結構
    public class Student {
    ​
        //屬性
        String name;
        int age;
        double score;
     }
               
  • 成員變量如果不賦初始值時,則系統會提供預設的初始值
  1. 整型(byte short int long): 預設值為0
  2. 浮點型(float double): 預設為0.0
  3. 字元型(char):預設為空字元
  4. 布爾型(boolean):預設為false

2.定義類的成員的方法

  • 用于描述對象的行為,封裝對象的功能。
public class Person { 
//成員方法 !!!main方法也時類的組成元素之一 
     public void show() { 
       System.out.println("show....") 
    } 
 }
           

3.類的成員變量和方法總結

  • 1.定義列印學生資訊的方法,然後以name、age、score作為參數
  • 2.name、age、score是屬于學生類的,是以可以使用參數為Student student
  • 3.列印學生資訊的方法屬于學生的行為,放在學生類中
  • 4.使用Student類,采用new Student;方式
  • 5.發現new Student();不能同時為同一個對象設定多個屬性值
  • 6.采用引用的概念,Student s = new Student();
  • 7.通過引用打點的方式,通路定義在類中的屬性和方法,--->s.name = "zhangsan",s.studentInfo();
  • 8.類是一個資料類型

4.建立并使用對象

 4.1通過使用new() 關鍵字建立對象

  • 通過 new 類名(); 表示建立了該類的對象,也叫做!類的執行個體化(instantiation)!
new Person();//執行個體化人類對象
           
java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

4.2 引用類型變量

  • 為了能夠對執行個體化的對象進行通路控制,需要使用一個特殊的變量--引用
Person p = new Person(); //p:指向對象的引用
           
  • 引用存儲的是對象的位址資訊,"指向對象的引用"。
  • 可以通過引用采用打點的形式通路對象的成員。
  • 在Java中,除了8種基本類型外,其他類型都為引用資料類型--且預設值為null
Person p = new Person();//執行個體化人類對象 
p.name = "zhang3";//引用通路屬性 
p.age = 16; 
p.show();//引用通路方法 
​
Person p1 = p; 
Person p2 = new Person(); 
p2.name = "zhang3"; 
p2.age = 16; 
p2.show(); 
​
System.out.println(p == p1);//t p和p1由同樣的位址值 System.out.println(p == p2);//f p和p2兩個new關鍵字。隻要new就會建立對象,位址就 不一樣
           

4.3引用類型變量的指派傳遞:

  • 相同類型之間引用互相指派
  • 引用類型之間的指派不會建立新的對象,但有可能會使兩個引用指向同一對象
Person p1 = new Person();
Person p2 = new Person();
Person p3 = p2;
​
System.out.println(p1);//classes.Person@  1540e19d--->散列碼(位址)
System.out.println(p2);//classes.Person@  677327b6--->散列碼(位址)
​
System.out.println(p3 == p2);   //true
System.out.println(p2 == p1);   //false
           

4.4 null和nullPointerException

空指針異常:

  • 對于引用類型變量可以指派為null,null的含義為“空”,表示沒有指向任何對象。
  • 當引用的值為null時,再去調用其成員會抛出nullPointerException
//5.空指針異常
p3 = null;   //斬斷p3的聯系,引用p3沒有任何指向
p3.name = "zhangs";  //沒有編譯錯誤,但邏輯不對
// ava.lang.NullPointerException發現運作時異常,空指針異常
//解決空指針異常-->使用者輸出語句列印目前對象,發現其值是不是為null
           

4.5總結

  • 1.不同類型組成的抽象!資料類型!---類
  • 2.類的組成有屬性和方法
  • 3.屬性是成員變量,成員變量有預設的初始值
  • 4.通過new關鍵字執行個體化對象
  • 5.通過Person p = new Person();中引用P打點通路定義在類中的屬性和方
  • 6.引用資料類型:出了八大基本類型以外,其他所有的類型都為引用資料類型,且預設值為null
  • “在java中凡是以大駝峰命名法命名的,都為類。都為引用資料類型,且預設值都為null
  • 7.引用存儲的是對象的位址值,多個引用可以指向同一個對象
  • 8.一個引用沒有任何指向時,即引用的值為null時,再通過引用通路屬性和方法會産生異常--空指針異常

第二章、方法

一.方法的重載

1.方法的辨別

  • 方法的唯一辨別就是: 方法的名字 和 參數清單
  • 一個類中不能出現兩個方法的辨別完全一樣的方法

2.方法的重載

  • 方法名相同但參數清單不同稱為方法的重載
public void show(){} 
//互相構成重載 
public void show(int i) {}
public class Person {
        //屬性
        String name;
        int age;
        double salary;
        //方法
    public void show() {
        System.out.println("show.......");
    }
    public void show(int x) {
        System.out.println("show.......");
    }
​
}
           

3.通路重載方法

  • 編譯器在編譯時會根據方法的辨別調用不同的方法
java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

4.重載總結

  • 1.方法的唯一辨別(方法的簽名):方法名和參數清單
  • 2.一個類中不能出現兩個方法簽名完全相同的方法
  • 3.但是可以出現方法名相同,但參數清單不同的兩個方法互相構成重載 ​

二、構造方法

1.構造方法

  • 方法的名字與類名相同
  • 不寫傳回值類型
  • 在new Person()中執行Person的構造方法
ublic class Person {
        //屬性
        String name;
        int age;
        double salary;
        //構造方法
    /*
    1.方法的名字與類名相同 2.不寫傳回值類型
     */
    public Person() {
        System.out.println("Person...constructor...");
    }
    }
​
}
           

2.構造方法的作用

  • 能夠建立一個具備初始屬性的對象
  • 給對象屬性進行初始化的

3.規則

  • 當沒有顯式的定義構造方法,系統會提供一個預設的無參構造
  • 當顯式的寫出了一個任意的構造方法,系統就不預設提供無參構造了
  • 構造方法的重載,提供初始化的屬性不一緻
public Person() {
        System.out.println("Person...constructor...");
    }
    //構造方法的重載
​
    public Person(String name,int age,double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
           

4.this關鍵字:

    區分屬性和參數

  • 為了增加代碼的可讀性,構造方法的參數名字和屬性名應保持一緻,
  • 為了區分構造方法的參數和屬性同名問題,是以使用this
  • this;指目前對象,誰調用了屬性或者方法,this就指誰!!!
public Person(String name,int age,double salary) {
   
    this.name = name;
    this.age = age;
    this.salary = salary;
​
}
           

5.this();

  • ---1.必須放在構造方法的第一行!
  • ---2.等同于調用了對應參數的無參構造方法
  • ---3.隻能用在目前類對象中
public Person(String name,int age,double salary) {
    this();
    this.name = name;
    this.age = age;
    this.salary = salary;
​
}
           

第三章、數組

一、引用類型數組

1.數組是對象

  • 數組是引用資料類型
  • 數組對象在堆中建立,聲明的變量是引用類型,引用存儲的是數組對象的位址值,指向數組對象
  • 可以将數組中的元素看成對象的成員變量,隻不過類型完全一緻而已。

2.引用類型數組的聲明

  • 數組的元素可以為任意類型,當然也可以為引用類型。
  • 引用類型數組元素存儲的不是對象本身,而是存儲元素對象的引用

3.數組的初始化(重點)

  • 數組元素的預設值都為null。
  • 如果希望每個元素都指向具體的對象,則需要對每一個元素都使用new建立執行個體。
//1.person數組---引用類型
Person[] person = new Person[3];
System.out.println(Arrays.toString(person));
​
//2.對引用類型少數組指派
person[0] = new Person("zhang2",25,10000);
person[1] = new Person("liu6",22,8000);
person[2] = new Person("wang2",23,10000);
           
java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

4、數組的元素是基本類型數組(二維數組)

//1.二維數組----數組的元素為基本類型數組
//一維數組:
int[] arr1 = new int[3];
int[] arr2 = {1,2,3};
int[] arr3 = new int[]{1,2,3};
​
//二維數組
int[][] arrs1 = {new int[]{1,2},new int[]{2,3},new int[] {4,5,6}};
int[][] arrs2 = new int[][]{new int[]{1,2},new int[]{2,3},new int[] {4,5,6}};
//3種
//兩個長度都寫:
int[][] arrs3 = new int[3][2];
//隻寫一個長度
int[][] arrs4 = new int[3][];
arrs4[0] = new int[]{1,2,3};
arrs4[1] = new int[]{4,2,5};
arrs4[2] = new int[]{2,2,3};
System.out.println(arrs4);    //位址值
​
//周遊二維數組
for (int i = 0; i < arrs4.length; i++) {
    for (int j = 0; j < arrs4[i].length; j++) {
        System.out.print(arrs4[i][j]);
    }
    System.out.println();
           

5.總結

  • 1.引用類型數組的概念:除了基本類型的其他類型數組,都能叫做引用類型數組
  • 2.數組是對象,數組的元素可以看成對象的成員變量
  • 3.數組的引用存儲的是數組的對象的位址值
  • 4.對應引用類型數組,數組元素存儲的是對象的位址,而不是對象本身“數組持有對象的引用”
  • 5.person[0]\person[1]\person[2]等價于Person p =new Person()中的P,沒有差別
  • 6.二維數組----數組的元素為基本類型數組

第四章、對象記憶體管理(重點)

一、堆記憶體

1.對象存儲在堆中

  • JVM分為三個區域 : 堆(heap) 、棧(stack)、方法區(method)
  • JVM為Java程式提供并管理所需要的記憶體空間。
  • 堆中存儲使用new關鍵字建立的對象---數組、String、Person等等。
java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

          通過new建立的對象,在堆中。

2.成員變量的生命周期

  • 當一個引用值為null時,該對象沒有任何引用指向,則該對象被視為廢棄對象,屬于被回收(GC線 程)範圍。
  • 成員變量的生命周期: 從對象在堆中建立,到對象從堆中被回收為止。

3.垃圾回收機制(面試,建議研究)

  • 垃圾回收器(Garbage Collection ,GC),是JVM自帶的一個線程(自動運作的),用于回收沒有任何引用指向的對象。
  • 垃圾回收器會自動幫Java程式員處理垃圾。
  • 在main函數下面,有一個線程自動回收不用的對象,叫做守護線程。

4.記憶體洩漏

  • 記憶體洩漏: 不再使用的對象沒有被及時回收,積攢過多導緻程式奔潰。

5.System.gc()方法

  • GC線程不會剛發現無用對象就會回收,如果需要強制回收,則使用System.gc()方法
  • 這個方法強制排程GC線程回收無用對象。

二、非堆-棧

類中的變量叫:成員變量;方法中的變量叫:局部變量

1.棧存的是方法中的局部變量

java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

2.局部變量的生命周期

  • 生命周期: 棧幀被建立開始-方法執行完畢棧幀被銷毀結束,局部變量也随之銷毀。
  • 棧幀中存儲的是: 局部變量和參數等。

3.成員變量和局部變量的差別

java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

 三、非棧-方法區

1.存放類的資訊

java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)
java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

2.方法隻有一份,唯一性

 當類的資訊加載到方法區時,類中的類方法的定義也被加載在方法區中。

無論建立多少對象,所有的對象是公用方法區中一個方法的定義。

四、堆、棧、方法區的差別

           堆存的是成員變量

           棧存的是局部變量

           方法區存的是類資訊

java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)

五、繪制下列代碼記憶體區域圖:

public class HomeWork1 { 
      String a = "java"; 
      String b = "c++"; 
      public void showInfo(String res) { 
          String c = res + a +"."+ b ; 
          System.out.println(c); 
       }
       public static void main(String[] args) { 
          HomeWork1 hw = new HomeWork1(); 
          hw.showInfo("程式設計語言:"); 
          } 
     }
           
java 面向對象程式設計——簡介第一章、對象和類第二章、方法第三章、數組第四章、對象記憶體管理(重點)