目錄
第一章、對象和類
一、面向對象的程式設計
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; }
- 成員變量如果不賦初始值時,則系統會提供預設的初始值
- 整型(byte short int long): 預設值為0
- 浮點型(float double): 預設為0.0
- 字元型(char):預設為空字元
- 布爾型(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();//執行個體化人類對象
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.通路重載方法
- 編譯器在編譯時會根據方法的辨別調用不同的方法
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);
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等等。
通過new建立的對象,在堆中。
2.成員變量的生命周期
- 當一個引用值為null時,該對象沒有任何引用指向,則該對象被視為廢棄對象,屬于被回收(GC線 程)範圍。
- 成員變量的生命周期: 從對象在堆中建立,到對象從堆中被回收為止。
3.垃圾回收機制(面試,建議研究)
- 垃圾回收器(Garbage Collection ,GC),是JVM自帶的一個線程(自動運作的),用于回收沒有任何引用指向的對象。
- 垃圾回收器會自動幫Java程式員處理垃圾。
- 在main函數下面,有一個線程自動回收不用的對象,叫做守護線程。
4.記憶體洩漏
- 記憶體洩漏: 不再使用的對象沒有被及時回收,積攢過多導緻程式奔潰。
5.System.gc()方法
- GC線程不會剛發現無用對象就會回收,如果需要強制回收,則使用System.gc()方法
- 這個方法強制排程GC線程回收無用對象。
二、非堆-棧
類中的變量叫:成員變量;方法中的變量叫:局部變量
1.棧存的是方法中的局部變量
2.局部變量的生命周期
- 生命周期: 棧幀被建立開始-方法執行完畢棧幀被銷毀結束,局部變量也随之銷毀。
- 棧幀中存儲的是: 局部變量和參數等。
3.成員變量和局部變量的差別
三、非棧-方法區
1.存放類的資訊
2.方法隻有一份,唯一性
當類的資訊加載到方法區時,類中的類方法的定義也被加載在方法區中。
無論建立多少對象,所有的對象是公用方法區中一個方法的定義。
四、堆、棧、方法區的差別
堆存的是成員變量
棧存的是局部變量
方法區存的是類資訊
例
五、繪制下列代碼記憶體區域圖:
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("程式設計語言:");
}
}