Java零基礎(chǔ)手把手保姆級(jí)教程_類和對(duì)象(超詳細(xì))
1. 類和對(duì)象
1.1 類和對(duì)象的理解
客觀存在的事物皆為對(duì)象 ,所以我們也常常說(shuō)萬(wàn)物皆對(duì)象。
-
類
- 類的理解
- 類是對(duì)現(xiàn)實(shí)生活中一類具有共同屬性和行為的事物的抽象
- 類是對(duì)象的數(shù)據(jù)類型,類是具有相同屬性和行為的一組對(duì)象的集合
- 簡(jiǎn)單理解:類就是對(duì)現(xiàn)實(shí)事物的一種描述
- 類的組成
- 屬性:指事物的特征,例如:手機(jī)事物(品牌,價(jià)格,尺寸)
- 行為:指事物能執(zhí)行的操作,例如:手機(jī)事物(打電話,發(fā)短信)
- 類的理解
-
類和對(duì)象的關(guān)系
- 類:類是對(duì)現(xiàn)實(shí)生活中一類具有共同屬性和行為的事物的抽象
- 對(duì)象:是能夠看得到摸的著的真實(shí)存在的實(shí)體
- 簡(jiǎn)單理解:類是對(duì)事物的一種描述,對(duì)象則為具體存在的事物
1.2 類的定義
類的組成是由屬性和行為兩部分組成
- 屬性:在類中通過(guò)成員變量來(lái)體現(xiàn)(類中方法外的變量)
- 行為:在類中通過(guò)成員方法來(lái)體現(xiàn)(和前面的方法相比去掉static關(guān)鍵字即可)
類的定義步驟:
①定義類,類名注意采用大駝峰定義
②編寫(xiě)類的成員變量
③編寫(xiě)類的成員方法
public class 類名 {
// 成員變量
變量1的數(shù)據(jù)類型 變量1;
變量2的數(shù)據(jù)類型 變量2;
…
// 成員方法
方法1;
方法2;
}
示例代碼:
/*
手機(jī)類:
類名:
手機(jī)(Phone)
成員變量:
品牌(brand)
價(jià)格(price)
成員方法:
打電話(call)
發(fā)短信(sendMessage)
*/
public class Phone {
//成員變量
String brand;
int price;
//成員方法
public void call() {
System.out.println("打電話");
}
public void sendMessage() {
System.out.println("發(fā)短信");
}
}
注意事項(xiàng):
- 類名注意采用大駝峰定義
- 成員前寫(xiě)法統(tǒng)一為 public ,后面會(huì)詳細(xì)解釋
- 此處寫(xiě)的方法不帶 static 關(guān)鍵字 . 后面會(huì)詳細(xì)解釋
- 一般一個(gè)文件當(dāng)中只定義一個(gè)類
- main方法所在的類一般要使用public修飾(注意:Eclipse默認(rèn)會(huì)在public修飾的類中找main方法)
- public 修飾的類必須要和文件名相同
- 不要輕易去修改 public 修飾的類的名稱,如果要修改,通過(guò)開(kāi)發(fā)工具修改 。Refactor-Rename
- 同級(jí)目錄底下,類名不能重復(fù)
1.3 對(duì)象的使用
- 創(chuàng)建對(duì)象的格式:
- 類名 對(duì)象名 = new 類名();
- 調(diào)用成員的格式:
- 對(duì)象名.成員變量
- 對(duì)象名.成員方法();
- 示例代碼
/*
創(chuàng)建對(duì)象
格式:類名 對(duì)象名 = new 類名();
范例:Phone p = new Phone();
使用對(duì)象
1:使用成員變量
格式:對(duì)象名.變量名
范例:p.brand
2:使用成員方法
格式:對(duì)象名.方法名()
范例:p.call()
*/
public class PhoneDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Phone p = new Phone();
//使用成員變量
System.out.println(p.brand);
System.out.println(p.price);
p.brand = "小米";
p.price = 2999;
System.out.println(p.brand);
System.out.println(p.price);
//使用成員方法
p.call();
p.sendMessage();
}
}
1.4 學(xué)生對(duì)象-練習(xí)
- 需求:首先定義一個(gè)學(xué)生類,然后定義一個(gè)學(xué)生測(cè)試類,在學(xué)生測(cè)試類中通過(guò)對(duì)象完成成員變量和成員方法的使用
- 分析:
- 成員變量:姓名,年齡…
- 成員方法:學(xué)習(xí),做作業(yè)…
- 示例代碼:
class Student {
//成員變量
String name;
int age;
//成員方法
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
public void doHomework() {
System.out.println("鍵盤(pán)敲爛,月薪過(guò)萬(wàn)");
}
}
/*
學(xué)生測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s = new Student();
//使用對(duì)象
System.out.println(s.name + "," + s.age);
s.name = "林青霞";
s.age = 30;
System.out.println(s.name + "," + s.age);
s.study();
s.doHomework();
}
}
1.5測(cè)測(cè)你掌握了沒(méi)?
1.引用可以指向引用嗎?
不可以,引用只能指向?qū)ο?/strong>
上述代碼:dog2這個(gè)引用指向了dog1這個(gè)引用所指向的對(duì)象, 兩個(gè)引用同時(shí)指向一個(gè)對(duì)象,而不是指向了dog1這個(gè)引用
2.一個(gè)引用能不能同時(shí)指向多個(gè)對(duì)象?
不可以,最后dog1這個(gè)引用只會(huì)存儲(chǔ)一個(gè)對(duì)象的地址
2. 對(duì)象內(nèi)存圖
2.1 單個(gè)對(duì)象內(nèi)存圖
- 成員變量使用過(guò)程
- 成員方法調(diào)用過(guò)程
2.2 多個(gè)對(duì)象內(nèi)存圖
- 成員變量使用過(guò)程
- 成員方法調(diào)用過(guò)程
-
總結(jié):
多個(gè)對(duì)象在堆內(nèi)存中,都有不同的內(nèi)存劃分,成員變量存儲(chǔ)在各自的內(nèi)存區(qū)域中,成員方法多個(gè)對(duì)象共用的一份
2.3 多個(gè)對(duì)象指向相同內(nèi)存圖
-
總結(jié)
當(dāng)多個(gè)對(duì)象的引用指向同一個(gè)內(nèi)存空間(變量所記錄的地址值是一樣的)
只要有任何一個(gè)對(duì)象修改了內(nèi)存中的數(shù)據(jù),隨后,無(wú)論使用哪一個(gè)對(duì)象進(jìn)行數(shù)據(jù)獲取,都是修改后的數(shù)據(jù)。
3. 成員變量和局部變量
3.1 成員變量和局部變量的區(qū)別
- 類中位置不同:成員變量(類中方法外)局部變量(方法內(nèi)部或方法聲明上)
- 內(nèi)存中位置不同:成員變量(堆內(nèi)存)局部變量(棧內(nèi)存)
- 生命周期不同:成員變量(隨著對(duì)象的存在而存在,隨著對(duì)象的消失而消失)局部變量(隨著方法的調(diào)用而存在,醉著方法的調(diào)用完畢而消失)
- 初始化值不同:成員變量(有默認(rèn)初始化值)局部變量(沒(méi)有默認(rèn)初始化值,必須先定義,賦值才能使用)
4. 封裝
4.1 private關(guān)鍵字
private是一個(gè)修飾符,可以用來(lái)修飾成員(成員變量,成員方法)
-
被private修飾的成員,只能在本類進(jìn)行訪問(wèn),針對(duì)private修飾的成員變量,如果需要被其他類使用,提供相應(yīng)的操作
- 提供“get變量名()”方法,用于獲取成員變量的值,方法用public修飾
- 提供“set變量名(參數(shù))”方法,用于設(shè)置成員變量的值,方法用public修飾
-
示例代碼:
/* 學(xué)生類 */ class Student { //成員變量 String name; private int age; //提供get/set方法 public void setAge(int a) { if(a<0 || a>120) { System.out.println("你給的年齡有誤"); } else { age = a; } } public int getAge() { return age; } //成員方法 public void show() { System.out.println(name + "," + age); } } /* 學(xué)生測(cè)試類 */ public class StudentDemo { public static void main(String[] args) { //創(chuàng)建對(duì)象 Student s = new Student(); //給成員變量賦值 s.name = "林青霞"; s.setAge(30); //調(diào)用show方法 s.show(); } }
4.2 private的使用
-
需求:定義標(biāo)準(zhǔn)的學(xué)生類,要求name和age使用private修飾,并提供set和get方法以及便于顯示數(shù)據(jù)的show方法,測(cè)試類中創(chuàng)建對(duì)象并使用,最終控制臺(tái)輸出
林青霞,30
-
示例代碼:
/* 學(xué)生類 */ class Student { //成員變量 private String name; private int age; //get/set方法 public void setName(String n) { name = n; } public String getName() { return name; } public void setAge(int a) { age = a; } public int getAge() { return age; } public void show() { System.out.println(name + "," + age); } } /* 學(xué)生測(cè)試類 */ public class StudentDemo { public static void main(String[] args) { //創(chuàng)建對(duì)象 Student s = new Student(); //使用set方法給成員變量賦值 s.setName("林青霞"); s.setAge(30); s.show(); //使用get方法獲取成員變量的值 System.out.println(s.getName() + "---" + s.getAge()); System.out.println(s.getName() + "," + s.getAge()); } }
4.3 this關(guān)鍵字
- this修飾的變量用于指代成員變量,其主要作用是(區(qū)分局部變量和成員變量的重名問(wèn)題)
- 方法的形參如果與成員變量同名,不帶this修飾的變量指的是形參,而不是成員變量
- 方法的形參沒(méi)有與成員變量同名,不帶this修飾的變量指的是成員變量
public class Student {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
4.4 this內(nèi)存原理
-
this代表當(dāng)前調(diào)用方法的引用,哪個(gè)對(duì)象調(diào)用的方法,this就代表哪一個(gè)對(duì)象
-
示例代碼:
public class StudentDemo { public static void main(String[] args) { Student s1 = new Student(); s1.setName("林青霞"); Student s2 = new Student(); s2.setName("張曼玉"); } }
-
圖解:
4.5 this特性
當(dāng)new了一個(gè)對(duì)象,就會(huì)調(diào)用構(gòu)造方法
創(chuàng)建對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,并且在對(duì)象的生命周期內(nèi)只調(diào)用一次
構(gòu)造方法至少有一個(gè), 也就是說(shuō), 當(dāng)你沒(méi)有寫(xiě)任何構(gòu)造方法時(shí), 編譯器/java會(huì)自帶一個(gè)不帶參數(shù)的構(gòu)造方法, 只不過(guò)默認(rèn)的這個(gè)構(gòu)造方法沒(méi)有具體的實(shí)現(xiàn)任何功能.
注意:一旦用戶定義了任意一種構(gòu)造方法,編譯器則不再生成不帶參數(shù)的構(gòu)造方法。
- 構(gòu)造方法可以重載(用戶根據(jù)自己的需求提供不同參數(shù)的構(gòu)造方法) ,所以可以用構(gòu)造方法對(duì)對(duì)對(duì)象進(jìn)行初始化.
- 構(gòu)造方法中,可以通過(guò)this調(diào)用其他構(gòu)造方法來(lái)簡(jiǎn)化代碼
- 絕大多數(shù)情況下使用public來(lái)修飾,特殊場(chǎng)景下會(huì)被private修飾
4.6 封裝思想
- 封裝概述
是面向?qū)ο笕筇卣髦唬ǚ庋b,繼承,多態(tài))
是面向?qū)ο缶幊陶Z(yǔ)言對(duì)客觀世界的模擬,客觀世界里成員變量都是隱藏在對(duì)象內(nèi)部的,外界是無(wú)法直接操作的 - 封裝原則
將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問(wèn),而是通過(guò)該類提供的方法來(lái)實(shí)現(xiàn)對(duì)隱藏信息的操作和訪問(wèn)
成員變量private,提供對(duì)應(yīng)的getXxx()/setXxx()方法 - 封裝好處
通過(guò)方法來(lái)控制成員變量的操作,提高了代碼的安全性
把代碼用方法進(jìn)行封裝,提高了代碼的復(fù)用性
5. 構(gòu)造方法
5.1 構(gòu)造方法概述
構(gòu)造方法是一種特殊的方法,該方法沒(méi)有返回值, 名字必須與類名相同,在創(chuàng)建對(duì)象時(shí),由編譯器自動(dòng)調(diào)用,并且 在整個(gè)對(duì)象的生命周期內(nèi)只調(diào)用一次
-
作用:創(chuàng)建對(duì)象 Student stu = new Student();
-
格式:
public class 類名{
? 修飾符 類名( 參數(shù) ) {
? }
}
-
功能:主要是完成對(duì)象數(shù)據(jù)的初始化
-
示例代碼:
class Student {
private String name;
private int age;
//構(gòu)造方法
public Student() {
System.out.println("無(wú)參構(gòu)造方法");
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s = new Student();
s.show();
}
}
5.2 構(gòu)造方法的注意事項(xiàng)
- 構(gòu)造方法的創(chuàng)建
如果沒(méi)有定義構(gòu)造方法,系統(tǒng)將給出一個(gè)默認(rèn)的無(wú)參數(shù)構(gòu)造方法
如果定義了構(gòu)造方法,系統(tǒng)將不再提供默認(rèn)的構(gòu)造方法
- 構(gòu)造方法的重載
如果自定義了帶參構(gòu)造方法,還要使用無(wú)參數(shù)構(gòu)造方法,就必須再寫(xiě)一個(gè)無(wú)參數(shù)構(gòu)造方法
- 推薦的使用方式
無(wú)論是否使用,都手工書(shū)寫(xiě)無(wú)參數(shù)構(gòu)造方法
- 重要功能!
可以使用帶參構(gòu)造,為成員變量進(jìn)行初始化
- 示例代碼
/*
學(xué)生類
*/
class Student {
private String name;
private int age;
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s1 = new Student();
s1.show();
//public Student(String name)
Student s2 = new Student("林青霞");
s2.show();
//public Student(int age)
Student s3 = new Student(30);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("林青霞",30);
s4.show();
}
}
5.3 標(biāo)準(zhǔn)類制作
- 需求:定義標(biāo)準(zhǔn)學(xué)生類,要求分別使用空參和有參構(gòu)造方法創(chuàng)建對(duì)象,空參創(chuàng)建的對(duì)象通過(guò)setXxx賦值,有參創(chuàng)建的對(duì)象直接賦值,并通過(guò)show方法展示數(shù)據(jù)。
- 示例代碼:
class Student {
//成員變量
private String name;
private int age;
//構(gòu)造方法
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//成員方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
/*
創(chuàng)建對(duì)象并為其成員變量賦值的兩種方式
1:無(wú)參構(gòu)造方法創(chuàng)建對(duì)象后使用setXxx()賦值
2:使用帶參構(gòu)造方法直接創(chuàng)建帶有屬性值的對(duì)象
*/
public class StudentDemo {
public static void main(String[] args) {
//無(wú)參構(gòu)造方法創(chuàng)建對(duì)象后使用setXxx()賦值
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
s1.show();
//使用帶參構(gòu)造方法直接創(chuàng)建帶有屬性值的對(duì)象
Student s2 = new Student("林青霞",30);
s2.show();
}
}
5.4 標(biāo)準(zhǔn)JavaBean
JavaBean:可以理解為實(shí)體類,對(duì)象可以在程序中封裝數(shù)據(jù)
標(biāo)準(zhǔn)JavaBean需要滿足的要求:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-745765.html
1.成員變量Private修飾
2.提供無(wú)參構(gòu)造器
3.提供getter和setter方法文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-745765.html
到了這里,關(guān)于Java零基礎(chǔ)手把手保姆級(jí)教程_類和對(duì)象(超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!