1. 程式人生 > >java面向對象基礎

java面向對象基礎

特殊方法 等等 java語言 pan 創建對象 2個 overload 內存溢出 return

一.面向對象思想

萬物皆對象
計算機中的對象是對現實中的對象個體的一個完全的模擬
1 軟件開發目的
利用計算機的高效運算來改造世界,為生活中的問題提供解決方案,提高工作效率

2 分析與設計軟件的思維方式
分析問題--》設計程序
1)面向過程 (c語言)
2)面向對象 (c++,C#,java語言)

3 面向過程(OPP) vs 面向對象(OOP)
裝配電腦過程 - 事事親力親為 (面向過程)
買組裝機,或者叫朋友幫忙組裝 --> 調用(面向對象)


ps: 面向過程一開始就考慮實現的流程和細節,面向對象一開始考慮的是有哪些類型和對象在相互協作
面向對象的思維是最接近人類自然的思維方式

二.面向對象抽象步驟

(1)找出類

1 何為類
類型的類,歸類的類
就是人在認識分析世界中對具有相同特點的事物一個總稱,它就是一個概念來的
就是存在於人腦中的一個概念,在分析過程中,經常叫它為概念模型
類:就是某類對象的抽象,是某類對象的集合。

2 分析得到類的過程

技術分享圖片

3 類的示例

class Person{
int eyes = 2;//2個眼睛
int hands = 2;//2只手
int legs = 2;//2條腿

//直立行走()
void walk(){
System.out.println("直立行走");
}
//吃()
void eat(){
System.out.println("吃");
}
//睡() void sleep(){ System.out.println("睡"); } //思考() void think(){ System.out.println("思考"); } }


(2)找出屬性

1 何為屬性
一類事物都有相同的一些靜態特征(狀態),例如人都有年齡,我們將這個靜態特征(狀態)寫到類裏,這個特征(狀態)就叫做類的屬性,或者叫成員變量,也叫實例(對象)變量,字段等等。
雖然人都有年齡這個屬性,它的取值是可以不一樣,每個個體(對象)的年齡可以賦一個不同值

2 實例變量的默認值
實例(成員)變量,編譯器在編譯的時後會給它賦默認值
不同的類型,編譯器會賦上不同類型的默認值
引用類型 --> null
byte -->0
short -->0
int --> 0
long -->0
float -->0.0
double -->0.0
char -->‘\u0000‘
boolean --> false

3 全局變量 vs 局部變量
1)位置不同
實例變量是在類裏面、方法外面
局部變量定義在方法內或者局部代碼塊內
2)是否需要顯式初始化
局部變量沒有初始化之前是不能使用的(編譯器),先賦值後使用
實例變量可以直接使用,不賦值時會有賦以相應類型的默認值
3)生命周期及作用域
局部變量:只在方法體或者語句塊中
實例變量:與對象的生命周期相同
4)在內存的位置
局部變量在方法棧中
實例變量在對象堆中

(3)找出方法

1 何為方法
方法就是某類事物共同的行為,功能,也就是動態特征。

2 方法的基本格式
[修飾符…] 返回類型 方法名([形參列表...]){語句塊;}
用helloworld程序的main方法幫助記憶。
void : 表示不需要返回值
1)無參方法
有返回值的無參方法
無返回值的無參方法。
2)有參方法
有返回值的有參方法
無返回值的有參方法。
方法的參數列表可以有多個,可以是基本數據類和引用類型

3 形參和實參
聲明的時候叫形參,就是一個占位符
發生調用的時候,傳入的實際叫是實參

4 註意
形參是局部變量
形參作為局部變量,是不需要賦值就可以使用

(4)優化設計

繼承的使用。

三.對象

1 何為對象
計算機程序類,是創建計算機中對象的模板或者說藍本
類 - 》設計圖紙
對象就是實際存在的個體,也叫實體。可以是看得到,也可以是看不到(比如一個創意)
萬物皆對象
計算機中的對象是對現實中的對象個體的一個完全的模擬

2 創建對象
使得new關鍵來創建
Person p = new Person();
p.walk();//.調用運算符s
p.sleep();
p.eat();

四.引用變量

1 何為引用變量
除去基本數據類型的變量,剩下的都引用變量
int a;//基本數據類型變量
String s;//引用變量
Person p;//引用變量
引用變量問題試圖去牽引著另一個存在的對象個體。

2 註意事項
引用變量牽引一個對象,並不是裝著一個對象
基本數據類型的變量裝的是值本身,引用類型變量裝的是對象的起始地址
一個對象就像一個氣球,氣球可以用多根繩子牽引著,同理一個對象也可以被多個變量引用
Person p2 = p;

技術分享圖片


ps:
1 一個對象可以被多個引用變量引用,如果沒有任何變量引用該對象時,該對象會被垃圾回收器回收
2 在一個空引用上訪問屬性或調用方法,會拋出空指針異常(NullPointException)
Exception in thread "main" java.lang.NullPointerException

五.方法棧與對象堆

1 jvm的內存分布
技術分享圖片


2 各部分介紹
1)棧
方法棧,程序在運行會將所有調用的方法都壓入棧。保存局部變量的值,包括:1.用來保存基本數據類型的值;2.保存類的實例即堆區對象的引用(指針)。也可以用來保存加載方法時的幀,FILO(first in last out 先進後出)

2)堆
對象堆(垃圾堆),用來存放動態產生的數據,比如new出來的對象。註意創建出來的對象只包含屬於各自的成員變量,並不包括成員方法。因為同一個類的對象擁有各自的成員變量,存儲在各自的堆中,但是他們共享該類的方法,並不是每創建一個對象就把成員方法復制一次
3) 常量池
JVM為每個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、字段的符號引用(1)。池中的數據和數組一樣通過索引訪問。由於常量池包含了一個類型所有的對其他類型、方法、字段的符號引用,所以常量池在Java的動態鏈接中起了核心作用。常量池存在於堆中
4) 代碼段
用來存放從硬盤上讀取的二進制字節碼
5)數據段
用來存放static定義的靜態成員

技術分享圖片


六.傳參方式

1 java的傳參方式
1)值傳遞 - 基本數據類型傳遞數據值本身
2)引用傳遞 - 傳遞對象地址值

ps:嚴格意義上來說,都是值傳遞

2 引用傳遞註意事項
引用a的值傳遞給引用b,此時通過b去改變對象的內容,通過a訪問到的內容是b改變後的內容

七.構造方法

1 何為構造方法
構造方法是一種特殊方法,也叫構造函數,或構造器
名字必須和類名相同,並且沒有返回類型
2 構造方法作什麽用
用來初始化成員變量
提供了一個機會給開發者,讓開發者有一個時機介入到對象的構建過程中

3 構造方法的語法
1)如果一個類沒有定義構造方法,編譯器會提供一個默認的構造方法(無參)
2)構造方法可以有多個,構成重載
3)如果類已經提供了一個構造方法,編譯器不會提供默認的構造方法
4)好的建議:如果我們定義了有參數的構造方法,一般情況下會同時提供一個無參的構造方法

4 構造方法在什麽時候調用
Cat c = new Cat();
1)在棧中創建c變量
2)在堆中分分配對象內存
3)調用該對象的構造方法
4)默認初始該對象成員變量,對象創建成功。
5)把對象地址賦值給c變量

八.this引用

(1)解決命名沖突

當成員變量(實例變量)和局部變量重名時,局部變量優先,成員變量會被局部變量覆蓋,此時用this來解決

//有參的構造方法
public Cat(String name,int age,String color){
this.name = name;
this.age = age;
this.color = color;
}

技術分享圖片

(2)調用重載的構造方法

九.垃圾回收

1 什麽是垃圾回收器(Garbage collection)
jvm運行的時候會在後臺運行一個低優先級線程,它會不間斷的去掃描內存的使用情況,當發現堆中對象沒任何一個引用變量牽引時,就把這個對象視為垃圾,該線程就會回收這個對象,然後釋放這個對象占用的內存。

2 為什麽需要垃圾回收器
C++的程序員使用內存都是自己分配的,使用完後也是由自己回收。這樣子很容易造成疏忽,忘記釋放。當內存不斷的分配使用,就會消耗掉所有內存,這時就會出現內存溢出或者其它的問題。
java為了防止由於開發者疏忽造成的內存溢出的這種現象,提供了垃圾回收器來自動的回收不用對象釋放占用的內存。
即使有垃圾回收器,jvm內存仍然可以耗盡。

3 垃圾回收器的回收時機
回收的時機是不確定,跟實現它的算法有關系,垃圾回收的算法有很多,不同的jdk可能采用的算法不一樣。
開發者可以調用以下方法來建議垃圾回收器回收,但不能保證回收器會立即回收(像麥當勞的服務員)
System.gc();
Runtime.getRuntime().gc()
開發者可以主動將引用變量置null,垃圾回收器就可以掃描並回收它
Person p = new Person();
//調用p做事
p = null;

十.方法重載

1 何為方法重載(Overload)
定義:在同一個類中,方法名相同,參數列表不同, 與返回類型和修飾符無關的方法,叫方法重載,是一種靜態多態性的表現。
2 重載的三個要素
1)在同一個類中
2)方法名相同,與返回類型和修飾符無關
3)參數列表不同(個數,順序,類型)

3 重載調用
首先會找參數類型最接近的方法去執行

package com.tocean.ch06;
public class TestOverload2{
public static void main(String[] args){
A a = new A();
a.add(2,3);//編譯出錯
//a.add(2,3.0);
}
}
class A{
/*
public double add(int a ,int b){
System.out.println("----------add(int a ,int b)------------");
return a+b;
}*/
public double add(double a ,int b){
System.out.println("----------add(double a ,int b)------------");
return a+b;
}
public double add(int a ,double b){
System.out.println("----------(int a ,double b)------------");
return a+b;
}
}


十一.返回值

1 返回值
返回值是一個方法執行後需要返回的結果,
如果一個方法需要返回給調用者執行結果,就必須先在聲明該方法時要聲明返回該結果類型
如果不需要返回,返回類型用void表示

2 註意
返回值可以是返回類型(大類型)兼容的小類型
參數也是一樣,可以傳遞參數類型(大類型)兼容的小類型

java面向對象基礎