6 面向對象之類和對象
1 面向對象和面向過程的區別
兩者都是軟件開發思想,先有面向過程,後有面向對象。在大型項目中,針對面向過程的不足推出了面向對象開發思想。
區別:
1)編程思路不同: 面向過程以實現功能的函數開發為主,而面向對象要首先抽象出類、屬性及其方法,然後通過實例化類、執行方法來完成功能。
2)封裝性:都具有封裝性,但是面向過程是封裝的是功能,而面向對象封裝的是數據和功能。
3)面向對象具有繼承性和多態性,而面向過程沒有繼承性和多態性,所以面向對象優勢是明顯。
2 類和對象
對象:客觀存在的實體(一個具體的事物)。
類:具有相同特征和共同行為對象的集合。是人類腦海中一個抽象的概念,代表的是一種"共性".
類中的成員:1.成員屬性(描述外部特征) 2.成員方法(描述功能行為)
3 定義和訪問類
1)定義一個類:
[修飾符] class 類名{
//1.屬性的定義:與定義變量類似
[修飾符] 數據類型 屬性名;
//2.方法的定義
[修飾符] 返回值類型 方法名(形參列表){
//方法體;
}
}
2)訪問類中成員
a.訪問屬性:
創建對象(創建實例):類名 對象名 = new 類名();
賦值: 對象名.屬性=值;
屬性
b.調用方法
靜態方法(使用static修飾的方法):類名.方法名()
普通方法(非static修飾的方法):對象名.方法名();
4 變量的作用域
變量聲明的位置不同會導致其作用域不同。
局部變量:在方法內部聲明的變量,其作用域僅限於當前方法使用。
成員變量:在類中聲明的屬性,其作用域可以在當前類中使用。
區別:
1.作用域不同:成員變量的作用域是在整個類體,局部變量的作用域在當前方法
2.是否有默認初始值:成員變量是有默認的初始值,局部變量沒有默認初始值。
eg:int類型默認初始值為0 double類型默認初始值為0.0 boolean類型默認為false String默認為null
3.是否能使用修飾符(public/private/protected/默認):成員變量:可以添加public等修飾符,局部變量不能。
4.在內存中保存的位置不同:成員變量保存到堆中,局部變量保存到棧。
5構造方法
構造方法(構造器):是一種特殊的方法,主要用於為成員變量初始化(為成員變量賦初始值)。
特征:
1.方法名必須與類名相同。
2.沒有返回值類型。void也是一種返回值類型。
構造的作用:為成員變量賦初始化值。
語法: [修飾符] 類名([形參列表]){
}
構造方法使用new關鍵字進行調用。
如果沒有顯式定義構造方法,虛擬機會自動添加無參構造,但是一旦顯式定義了構造方法,虛擬機在編譯時將不同添加無參構造(默認無參構造失效),如果需要調用無參構造就必須自己定義。
構造方法是可以重載(方法名相同,參數列表不同)。
6 this關鍵字
this關鍵字:代表當前對象本身
1)用於區分成員變量和局部變量。
2)可以使用this訪問當前對象的成員變量和成員方法(可以使用this調用屬性和方法) this.方法名()或this.屬性
3)可以使用this調用構造方法,必須作為構造方法的第一行語句。
public Dog(String name,String bland,int age){
this.name=name;
this.bland=bland;
this.age=age;
}
public void test(){
}
this.name ;訪問屬性
this.test(); 調用方法
7 值傳遞和引用傳遞
數據類型可以分為基本數據類型和引用數據類型
如果將基本類型作為方法參數屬於值傳遞:方法執行結束後不會保留執行結果。
如果將引用數據類型作為方法參數,屬於引用傳遞,方法執行結束後會保留執行結果。
8 內存結構
1)棧
在方法中聲明的局部變量保存在棧中,方法執行結束後棧中數據會被回收
2)堆
堆中保存的是對象的信息,使用new關鍵字創建的對象信息。堆中信息會被java的垃圾回收器回收。
3)方法區
保存的是類的信息(代碼)、靜態(static)變量、字符串常量等。
9 static關鍵字
1)static修飾的變量為靜態變量,類變量
訪問方式: 類名.變量名(推薦) 對象名.變量名
①成員變量和全局變量的區別:
a.在計算機內存中保存的位置不同:
成員變量保存在堆中,全局變量保存在方法區
b.保存的份數不同
成員變量每new一次都開辟空間,保存多份。
全局變量只有1份
c.訪問方式不同
成員變量: 對象名.屬性,可以使用this關鍵字。
全局變量: 類名.屬性(推薦) 對象名.屬性
d.創建時間不同:
成員變量:只有使用new關鍵字創建對象時才會在堆中為其分配空間
全局變量:在類加載時在方法區中分配空間。
2)使用static關鍵字可以修飾方法:靜態方法或類方法
特點:靜態方法中無法訪問非靜態的成員變量或方法;但非靜態的方法中是可以訪問靜態的成員
訪問方式: 類名.方法名(推薦) 對象名.方法名
3)使用static修飾代碼塊,靜態代碼塊
語法:static{
//代碼
}
執行過程:在類加載時執行靜態代碼塊。靜態代碼塊>普通代碼塊>構造方法。只會執行1次。
代碼塊:使用花括號包含的代碼。使用比較少。不需要顯式調用。
代碼塊的執行順序:在創建實例時執行。代碼塊在構造方法之前執行,並且按照順序執行,每創建一個對象就會執行1次。執行多次。
類中代碼的執行順序: 靜態代碼塊>代碼塊>構造方法>靜態方法或實例方法。
靜態的方法中只能訪問靜態變量, 非靜態的方法可以訪問靜態或非靜態的變量
10 package和import關鍵字
1)package關鍵字主要用於聲明包。
java中的包:類似文件夾
作用:1.分門別類進行存放數據,方便分類和管理。2.避免命名沖突。
包的命名規範:所有字母都是小寫,多級包名之間利用.進行分割
java中常見的包: java.lang包之外的其他包下的類,使用時需要導包。
* java.lang包:java核心類庫,String,System,Math... 該包下的類可以直接使用,無需導包。
* java.util包:工具類。 Arrays,Scanner...
* java.io包:i(input)/o(output)和java中流的輸入和輸出相關的類庫。
* java.net包:網絡編程相關的類庫。
* java.sql包:與數據庫操作相關的類庫。
* java.text包:國際化或格式化輸出相關的類庫。
* java.awt包/javax.swing包:圖形化界面相關的類庫
* 聲明包:使用package關鍵字,必須放在該類的第一行。
* 語法: package 包名; eg:cn.zzsxt.oop7;
2)導入包: import關鍵字,在使用非當前包下的其他包下的類時需要導包
方式一: import 包名.*;將整個包導入。 eg: import cn.zzsxt.oop6.*;
方式二(推薦): import 包名.類名; eg:import cn.zzsxt.oop6.TestStatic;
*直接使用全類名進行訪問: 包名.類名;
cn.zzsxt.oop6.TestStatic testStatic = new cn.zzsxt.oop6.TestStatic();
*特殊場景:不同的包下存在相同的類名。
import java.util.*;
import java.sql.*;
java.util.Date date = new java.util.Date();
3)靜態導入
package cn.zzsxt.oop7;
import static java.lang.Math.*;
import static java.lang.Math.PI;
import static java.lang.Math.random;
靜態導入:JDK1.5之後的新增特性。
語法: import static 包名.類名;
作用:如果使用靜態導入某個類或類中屬性和方法,可以直接使用該類中的靜態屬性或靜態方法。
System.out.println(Math.PI);
double rand = Math.random();
System.out.println(rand);
System.out.println(PI);//使用java.lang.Math類中的靜態屬性
System.out.println(random());//使用java.lang.Math中的靜態方法
}
6 面向對象之類和對象