大家好,我是白夜,今天和大家聊聊類與對(duì)象
一、初識(shí)面向?qū)ο螅私猓?/h2>
1.1、面向過程和面向?qū)ο?/h3>
面向過程編程
C 語言就是面向過程編程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題。
面向?qū)ο缶幊?/strong>
JAVA 是基于面向?qū)ο蟮?,關(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完成。
舉個(gè)例子,比如洗衣服
面向過程:1.拿桶 2.把衣服放桶里 3.接水 4.放洗衣服 5.搓 6.再接水 7.把衣服擰干 8.曬衣服
面向?qū)ο螅?.把衣服和洗衣粉放進(jìn)洗衣機(jī) 2.打開洗衣機(jī) 3.把衣服拿出來晾干
在這里洗衣機(jī)就是一個(gè)對(duì)象,所以只要操作洗衣機(jī)所具備的功能,都要定義在對(duì)象中。
1.2、面向過程和面向?qū)ο蟮膮^(qū)別
面向過程:注重的是過程,在整個(gè)過程中所涉及的行為,就是功能。
面向?qū)ο螅鹤⒅氐氖?strong>對(duì)象,也就是參與過程所涉及到的主體。是通過邏輯將一個(gè)個(gè)功能實(shí)現(xiàn)連接起來
二、類與對(duì)象
什么是類?
? 類是具備某些共同特征的實(shí)體的集合,是對(duì)所具有相同特征實(shí)體的抽象, 例如人類、車類、星球類,動(dòng)物類, 豬類等
什么是對(duì)象?
對(duì)象是類的實(shí)例,簡單的認(rèn)為對(duì)象就是類中具體的個(gè)體。
用一個(gè)例子給你說明一下他們的關(guān)系:
比如“人類”就是一個(gè)類,那么具體的某個(gè)人“張三”就是“人類”這個(gè)類的對(duì)象,而“名字、年齡”等信息就是對(duì)象的屬性,人的動(dòng)作比如“吃飯、穿衣”等就是對(duì)象的方法
2.1、類的定義
語法:
class People{
//成員變量/字段/屬性
//修飾符/數(shù)據(jù)類型/變量名
public String name ;
public String sex;
public int age;
//成員方法/行為
public void show(){
System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
}
}
要求:
- 類名,大駝峰,見名知意,不能以jdk中存在的類命名
- 成員變量名和方法名,小駝峰,見名知意
- 在類名、方法名、成員變量名上面寫文檔注釋
2.2、類的實(shí)例化
用類類型創(chuàng)建對(duì)象的過程,稱為類的實(shí)例化
我們已經(jīng)知道通過class關(guān)鍵字來定義一個(gè)類了,而我們知道類只是相當(dāng)于一個(gè)模板,所以我們要通過類來實(shí)例化對(duì)象,由類產(chǎn)生對(duì)象的過程叫做 實(shí)例化一個(gè)對(duì)象。
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 關(guān)鍵字來實(shí)例化一個(gè)對(duì)象
People p1 = new People();
//通過 new 關(guān)鍵字我們是可以實(shí)例化多個(gè)對(duì)象的
People p2 = new People();
People p3 = new People();
}
}
2.2.2、類在內(nèi)存中的分析
每創(chuàng)建一個(gè)對(duì)象就會(huì)在內(nèi)存中開辟一片空間,在棧上會(huì)開辟一個(gè)引用地址,會(huì)指向堆上的對(duì)象
p1 和p2 這些變量都是局部變量它們(對(duì)象)屬于引用
注意:類里面的方法并不是是存在堆區(qū)的 ,方法本身是不占內(nèi)存的,方法是存在方法區(qū)里的方法表中,在每個(gè)對(duì)象 new 好之后前面有幾個(gè)字節(jié)存的就是方法表的地址,只有在調(diào)用這個(gè)方法時(shí),會(huì)通過方法表的地址找到這個(gè)這個(gè)方法,然后在棧上為這個(gè)方法開辟棧幀。
2.2.3、訪問類的成員
成員變量的訪問:對(duì)象名 . 屬性名
成員方法的訪問:對(duì)象名 . 方法名
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();
}
}
注意:這里的成員變量并沒有初始化,不同于局部變量不初始化會(huì)報(bào)錯(cuò)。成員變量不初始化是其類型對(duì)應(yīng)的0值。
2.3、類的成員
2.3.1、初始化成員變量
我們把定義在類的內(nèi)部,方法的外部的變量叫“字段”或者叫它成員變量有時(shí)候也叫它“屬性"。這三種叫法并沒有嚴(yán)格區(qū)分
public static void main(String[] args) {
People p1 = new People();
p1.name = "java";
p1.sex = "nan";
p1.age = 50;
p1.show();
}
}
還有一種就是在定義成員變量的時(shí)候賦值,但并不建議這樣寫,因?yàn)樵趯?shí)例化后還是能初始化,沒必要多此一舉。而且這個(gè)類是一個(gè)模板,把模板初始化也是不合適的。
class People{
//成員變量/字段/屬性
public String name = "zhangsan" ;
public String sex = "lisi";
public int age = 22;
//成員方法/行為
public void show(){
System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
}
}
再來看一個(gè)代碼,這個(gè)代碼是什么意思呢?
public static void main(String[] args) {
//p1和p2都指向了這個(gè)對(duì)象
People p1 = new People();
People p2 = p1;
}
就是我們?cè)?jīng)講過的方法,用于描述一個(gè)對(duì)象的行為.
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、修飾符(了解)
對(duì) Java 當(dāng)中的,類,變量,方法,構(gòu)造方法等等.....進(jìn)行修飾,賦予被修飾內(nèi)容特殊意義。
public(公共訪問控制符):它表示公共的意思,被public修飾的類、接口、方法和變量等成員都可以被任何其他類或?qū)ο笏L問。
private(私有訪問控制符):它表示私有的意思,只有在定義該成員的類內(nèi)部才能被訪問。被private修飾的類、方法、變量或接口只能在自己的類中被調(diào)用,無法被同一個(gè)包內(nèi)或者其他包中的其他類或?qū)ο笏L問。
protected(保護(hù)訪問控制符): 它表示受保護(hù)的意思。被protected修飾的類、方法、變量或者接口只能被相同包或其子類中的類或?qū)ο笏L問。
static(靜態(tài)修飾符):它可以用來修飾成員變量、成員方法和代碼塊。當(dāng)一個(gè)變量或方法被聲明為?
static
?時(shí),它就是一個(gè)靜態(tài)成員。final:有最終的、不可變更的意思,它可用于修飾類、變量和方法。用于表示它修飾的類、方法和變量不可改變。
native: 本地修飾符。指定此方法的方法體是用其他語言在程序外部編寫的
abstract: 將一個(gè)類聲明為抽象類,沒有實(shí)現(xiàn)的方法,需要子類提供方法實(shí)現(xiàn)。
transient(過度修飾符): 指定該變量是系統(tǒng)保留,暫無特別作用的臨時(shí)性變量。
volatile: 指定該變量可以同時(shí)被幾個(gè)線程控制和修改。
synchronize: 同步修飾符,在多個(gè)線程中,該修飾符用于在運(yùn)行前,對(duì)他所屬的方法加鎖,以防止其他線程的訪問,運(yùn)行結(jié)束后解鎖。
三、構(gòu)造方法
3.1、構(gòu)造方法的基本使用
構(gòu)造方法是一種特殊方法, 使用關(guān)鍵字new實(shí)例化新對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用, 用于完成初始化操作 構(gòu)造方法沒有返回值,且方法名和類名是相同的 構(gòu)造方法是用來構(gòu)造對(duì)象的(實(shí)例化對(duì)象)
new 執(zhí)行過程
1.為對(duì)象分配內(nèi)存空間
2.調(diào)用合適的構(gòu)造方法
語法:
-
構(gòu)造方法的名字和類名完全一致(包括大小寫完全一致)。
-
沒有返回值類型(void也不行)。
-
構(gòu)造方法方法體不能返回任何的值(即不能在方法體中return 值)。
-
其他的和普通方法類似 ,可以有修飾符(public、protected、private、默認(rèn)),可以有形參列表。
-
構(gòu)造方法必須有方法體。
-
構(gòu)造方法不能有任何非訪問性質(zhì)的修飾符修飾,例如 static、final、synchronized、abstract等都不能修飾構(gòu)造方法。
class People{
private String name ;
private int age;//普通成員變量
public static int cont;//靜態(tài)成員變量
public People(){
System.out.println("這是一個(gè)不帶有參數(shù)的構(gòu)造方法");
}
}
public class Test {
public static void main(String[] args) {
People p = new People();
}
}
運(yùn)行結(jié)果:
那么為什么我們前面示例化對(duì)象時(shí)為什么沒有構(gòu)造方法呢?
如果我們沒有寫構(gòu)造方法,系統(tǒng)默認(rèn)會(huì)有一個(gè)沒有參數(shù)且沒有任何內(nèi)容的構(gòu)造方法
特點(diǎn):
- 每一個(gè)類中都至少有一個(gè)構(gòu)造方法;
- 如果沒有看到(顯示的),那么存在一個(gè)隱式的無參數(shù)的構(gòu)造方法;
- 如果一個(gè)類中有顯示的構(gòu)造方法,那么隱式的無參的構(gòu)造方法就不存在了;
3.2、構(gòu)造方法的重載
構(gòu)造方法和方法一樣是可以實(shí)現(xiàn)重載的, 由于需求不同,會(huì)創(chuàng)建多個(gè)構(gòu)造方法
重載:
1.方法名要相同
2.參數(shù)列表不同(類型和個(gè)數(shù))
3.返回值不做要求
class People{
private String name ;
private int age;//普通成員變量
public static int cont;//靜態(tài)成員變量
public People(){
System.out.println("這是一個(gè)不帶參的構(gòu)造方法");
}
public People(String name){
System.out.println("這是一個(gè)帶有一個(gè)參數(shù)的構(gòu)造方法");
}
public People(String name,String sex){
System.out.println("這是一個(gè)帶有兩個(gè)參數(shù)的構(gòu)造方法");
}
}
public class Test {
public static void main(String[] args) {
People p = new People();
People p1 = new People("張三");
People p2 = new People("李四","男");
}
}
四、匿名對(duì)象(了解)
概念:
? 匿名對(duì)象,就是創(chuàng)建的時(shí)候沒有使用變量接收保存一個(gè)對(duì)象。但是匿名對(duì)象本質(zhì)也是一個(gè)對(duì)象(具體的值)
作用:
? 可以節(jié)約資源,因?yàn)镚C【垃圾回收器】會(huì)不定時(shí)回收匿名對(duì)象
使用場(chǎng)景文章來源:http://www.zghlxwxcb.cn/news/detail-844581.html
? 匿名對(duì)象一般用在:只需要使用一次的情況(如:調(diào)用一次非static修飾的普通方法、作為方法實(shí)參使用)文章來源地址http://www.zghlxwxcb.cn/news/detail-844581.html
public class Main {
public static void main(String[] args) {
// 創(chuàng)建匿名對(duì)象并調(diào)用方法
new MyClass().doSomething();
// 在方法參數(shù)中使用匿名對(duì)象
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;
}
}
到了這里,關(guān)于Java面向?qū)ο?1——類與對(duì)象的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!