大家好,我是白夜,今天和大家聊聊類與對象 一、初識面向對象(瞭解) 1.1、面向過程和麵向對象 面向過程編程 C 語言就是面向過程編程的,關註的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。 面向對象編程 JAVA 是基於面向對象的,關註的是對象,將一件事情拆分成不同的對象,靠對象之間的交 ...
大家好,我是白夜,今天和大家聊聊類與對象
一、初識面向對象(瞭解)
1.1、面向過程和麵向對象
面向過程編程
C 語言就是面向過程編程的,關註的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。
面向對象編程
JAVA 是基於面向對象的,關註的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成。
舉個例子,比如洗衣服
面向過程:1.拿桶 2.把衣服放桶里 3.接水 4.放洗衣服 5.搓 6.再接水 7.把衣服擰乾 8.曬衣服
面向對象:1.把衣服和洗衣粉放進洗衣機 2.打開洗衣機 3.把衣服拿出來晾乾
在這裡洗衣機就是一個對象,所以只要操作洗衣機所具備的功能,都要定義在對象中。
1.2、面向過程和麵向對象的區別
面向過程:註重的是過程,在整個過程中所涉及的行為,就是功能。
面向對象:註重的是對象,也就是參與過程所涉及到的主體。是通過邏輯將一個個功能實現連接起來
二、類與對象
什麼是類?
類是具備某些共同特征的實體的集合,是對所具有相同特征實體的抽象, 例如人類、車類、星球類,動物類, 豬類等
什麼是對象?
對象是類的實例,簡單的認為對象就是類中具體的個體。
用一個例子給你說明一下他們的關係:
比如“人類”就是一個類,那麼具體的某個人“張三”就是“人類”這個類的對象,而“名字、年齡”等信息就是對象的屬性,人的動作比如“吃飯、穿衣”等就是對象的方法
2.1、類的定義
語法:
class People{
//成員變數/欄位/屬性
//修飾符/數據類型/變數名
public String name ;
public String sex;
public int age;
//成員方法/行為
public void show(){
System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
}
}
要求:
- 類名,大駝峰,見名知意,不能以jdk中存在的類命名
- 成員變數名和方法名,小駝峰,見名知意
- 在類名、方法名、成員變數名上面寫文檔註釋
2.2、類的實例化
用類類型創建對象的過程,稱為類的實例化
我們已經知道通過class關鍵字來定義一個類了,而我們知道類只是相當於一個模板,所以我們要通過類來實例化對象,由類產生對象的過程叫做 實例化一個對象。
2.2.1、語法
class People{//類名大駝峰
//成員變數/欄位/屬性
public String name ;
public String sex;
public int age;
//成員方法/行為
public void show(){
System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
}
}
public class Test {
public static void main(String[] args) {
//我們通過 new 關鍵字來實例化一個對象
People p1 = new People();
//通過 new 關鍵字我們是可以實例化多個對象的
People p2 = new People();
People p3 = new People();
}
}
2.2.2、類在記憶體中的分析
每創建一個對象就會在記憶體中開闢一片空間,在棧上會開闢一個引用地址,會指向堆上的對象
p1 和p2 這些變數都是局部變數它們(對象)屬於引用
註意:類裡面的方法並不是是存在堆區的 ,方法本身是不占記憶體的,方法是存在方法區里的方法表中,在每個對象 new 好之後前面有幾個位元組存的就是方法表的地址,只有在調用這個方法時,會通過方法表的地址找到這個這個方法,然後在棧上為這個方法開闢棧幀。
2.2.3、訪問類的成員
成員變數的訪問:對象名 . 屬性名
成員方法的訪問:對象名 . 方法名
class People{
//成員變數/欄位/屬性
public String name ;
public String sex;
public int age;
//成員方法/行為
public void show(){
System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
}
}
public class Test {
public static void main(String[] args) {
People p1 = new People();
System.out.println(p1.name);
System.out.println(p1.sex);
System.out.println(p1.age);
p1.show();
}
}
註意:這裡的成員變數並沒有初始化,不同於局部變數不初始化會報錯。成員變數不初始化是其類型對應的0值。
2.3、類的成員
2.3.1、初始化成員變數
我們把定義在類的內部,方法的外部的變數叫“欄位”或者叫它成員變數有時候也叫它“屬性"。這三種叫法並沒有嚴格區分
public static void main(String[] args) {
People p1 = new People();
p1.name = "java";
p1.sex = "nan";
p1.age = 50;
p1.show();
}
}
還有一種就是在定義成員變數的時候賦值,但並不建議這樣寫,因為在實例化後還是能初始化,沒必要多此一舉。而且這個類是一個模板,把模板初始化也是不合適的。
class People{
//成員變數/欄位/屬性
public String name = "zhangsan" ;
public String sex = "lisi";
public int age = 22;
//成員方法/行為
public void show(){
System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
}
}
再來看一個代碼,這個代碼是什麼意思呢?
public static void main(String[] args) {
//p1和p2都指向了這個對象
People p1 = new People();
People p2 = p1;
}
就是我們曾經講過的方法,用於描述一個對象的行為.
class People{
//成員變數/欄位/屬性
public String name ;
public String sex;
public int age;
//成員方法/行為
public void show(){
System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
}
public void prt(){
System.out.println("愛java");
}
}
public class Test {
public static void main(String[] args) {
People p1 = new People();
p1.show();
p1.prt();
}
}
2.3、修飾符(瞭解)
對 Java 當中的,類,變數,方法,構造方法等等.....進行修飾,賦予被修飾內容特殊意義。
public(公共訪問控制符):它表示公共的意思,被public修飾的類、介面、方法和變數等成員都可以被任何其他類或對象所訪問。
private(私有訪問控制符):它表示私有的意思,只有在定義該成員的類內部才能被訪問。被private修飾的類、方法、變數或介面只能在自己的類中被調用,無法被同一個包內或者其他包中的其他類或對象所訪問。
protected(保護訪問控制符): 它表示受保護的意思。被protected修飾的類、方法、變數或者介面只能被相同包或其子類中的類或對象所訪問。
static(靜態修飾符):它可以用來修飾成員變數、成員方法和代碼塊。當一個變數或方法被聲明為
static
時,它就是一個靜態成員。final:有最終的、不可變更的意思,它可用於修飾類、變數和方法。用於表示它修飾的類、方法和變數不可改變。
native: 本地修飾符。指定此方法的方法體是用其他語言在程式外部編寫的
abstract: 將一個類聲明為抽象類,沒有實現的方法,需要子類提供方法實現。
transient(過度修飾符): 指定該變數是系統保留,暫無特別作用的臨時性變數。
volatile: 指定該變數可以同時被幾個線程式控制制和修改。
synchronize: 同步修飾符,在多個線程中,該修飾符用於在運行前,對他所屬的方法加鎖,以防止其他線程的訪問,運行結束後解鎖。
三、構造方法
3.1、構造方法的基本使用
構造方法是一種特殊方法, 使用關鍵字new實例化新對象時會被自動調用, 用於完成初始化操作 構造方法沒有返回值,且方法名和類名是相同的 構造方法是用來構造對象的(實例化對象)
new 執行過程
1.為對象分配記憶體空間
2.調用合適的構造方法
語法:
-
構造方法的名字和類名完全一致(包括大小寫完全一致)。
-
沒有返回值類型(void也不行)。
-
構造方法方法體不能返回任何的值(即不能在方法體中return 值)。
-
其他的和普通方法類似 ,可以有修飾符(public、protected、private、預設),可以有形參列表。
-
構造方法必須有方法體。
-
構造方法不能有任何非訪問性質的修飾符修飾,例如 static、final、synchronized、abstract等都不能修飾構造方法。
class People{
private String name ;
private int age;//普通成員變數
public static int cont;//靜態成員變數
public People(){
System.out.println("這是一個不帶有參數的構造方法");
}
}
public class Test {
public static void main(String[] args) {
People p = new People();
}
}
運行結果:
那麼為什麼我們前面示例化對象時為什麼沒有構造方法呢?
如果我們沒有寫構造方法,系統預設會有一個沒有參數且沒有任何內容的構造方法
特點:
- 每一個類中都至少有一個構造方法;
- 如果沒有看到(顯示的),那麼存在一個隱式的無參數的構造方法;
- 如果一個類中有顯示的構造方法,那麼隱式的無參的構造方法就不存在了;
3.2、構造方法的重載
構造方法和方法一樣是可以實現重載的, 由於需求不同,會創建多個構造方法
重載:
1.方法名要相同
2.參數列表不同(類型和個數)
3.返回值不做要求
class People{
private String name ;
private int age;//普通成員變數
public static int cont;//靜態成員變數
public People(){
System.out.println("這是一個不帶參的構造方法");
}
public People(String name){
System.out.println("這是一個帶有一個參數的構造方法");
}
public People(String name,String sex){
System.out.println("這是一個帶有兩個參數的構造方法");
}
}
public class Test {
public static void main(String[] args) {
People p = new People();
People p1 = new People("張三");
People p2 = new People("李四","男");
}
}
四、匿名對象(瞭解)
概念:
匿名對象,就是創建的時候沒有使用變數接收保存一個對象。但是匿名對象本質也是一個對象(具體的值)
作用:
可以節約資源,因為GC【垃圾回收器】會不定時回收匿名對象
使用場景
匿名對象一般用在:只需要使用一次的情況(如:調用一次非static修飾的普通方法、作為方法實參使用)
public class Main {
public static void main(String[] args) {
// 創建匿名對象並調用方法
new MyClass().doSomething();
// 在方法參數中使用匿名對象
printMessage(new Message("Hello, World!"));
}
static void printMessage(Message message) {
System.out.println(message.getText());
}
}
class MyClass {
void doSomething() {
System.out.println("Doing something...");
}
}
class Message {
private String text;
public Message(String text) {
this.text = text;
}
public String getText() {
return text;
}
}