JavaSE基础知识(5)—面向对象(5.2类的成员)
一、屬性
1、語法
數(shù)據(jù)類型 屬性名 【= 屬性值】;
2、特點
①屬性的數(shù)據(jù)類型可以為任意類型,包含基本類型或引用類型
②屬性可以不用手動賦值,有默認(rèn)值
int——0
double——0.0
char——\u0000
boolean——false
引用類型——null
③屬性伴隨著對象存放在堆中,不同對象的屬性相互獨立,互不影響
④變量根據(jù)作用域不同,分為以下兩類
全局變量:又稱為屬性,定義在類體中,作用域為整個類體以及其他類
局部變量:定義在方法或某個代碼塊內(nèi),作用域為所在的方法或代碼塊
3、局部變量和全局變量的區(qū)別:★
| ? | 作用域 | 生命周期 | 存儲位置 | 訪問修飾符 | 默認(rèn)值 | 重命名 |
| 局部變量 | 定義變量的方法或某個代碼塊中 | 隨著方法或代碼塊的執(zhí)行而創(chuàng)建 隨著執(zhí)行的結(jié)束而消亡 | 基本類型:棧 引用類型:對象名存在棧,對象存在堆 | ?× | ?× | ?兩個局部作用域有交集時,不可以重名 |
| 全局變量 | 整個類體及其他類 | 隨著對象的創(chuàng)建而創(chuàng)建 隨著對象的消亡而消亡 | ?堆 | ?√ | ?√ | ?一個全局和一個局部,可以重名,默認(rèn)遵循就近原則 |
二、方法
1、概念
理解:用于描述類或?qū)ο蟮男袨榛蚬δ?#xff0c;定義在類體中,屬于類的成員
2、好處
1、提高代碼的重用性和維護性
2、從調(diào)用層面上,調(diào)用者不用關(guān)心方法的內(nèi)部實現(xiàn)細(xì)節(jié),調(diào)用比較簡單。只需要知道:
叫什么(方法名)
干什么(方法功能)
3、定義語法 ★
[修飾符]?返回類型?方法名(參數(shù)列表){
方法體
}
4、方法五要素
(1)修飾符
特點:可選
public 公共的,任意類都可以調(diào)用該方法
(2)返回類型
說明:某些行為或功能執(zhí)行結(jié)束后需要返回給調(diào)用方一個具體的值,則將值的類型標(biāo)注成返回類型,如果行為或功能執(zhí)行結(jié)束后沒有返回值,則返回類型寫成void即可
特點:
①一個方法至多有一個返回值,要求返回值的類型和返回類型一致或兼容
?、诜祷仡愋涂梢詾槿我忸愋?#xff0c;包含基本或引用
?、廴绻椒ㄓ蟹祷刂?#xff0c;則方法體中要求必須有return語句,而且return的值的類型必須和返回類型一致或兼容
如果方法沒有返回值,則方法體不用加return語句,如果非加,則寫成 return;
④如果方法有返回值,則必須保證所有路徑下都可以return值;
public int m(int i){
if(i>5)
return 10;
return 99;
}
(3)方法名
遵循標(biāo)識符的命名規(guī)則和規(guī)范(同變量的規(guī)范):見名知義,且遵循駝峰命名法
(4)參數(shù)列表
說明:某些方法的執(zhí)行需要調(diào)用方傳遞源數(shù)據(jù),否則無法執(zhí)行。我們把這些源數(shù)據(jù)稱為參數(shù)
特點:
?、賲?shù)可以為多個,語法如下:
(類型 參數(shù)名1,類型 參數(shù)名1,...,類型 參數(shù)名n)
②參數(shù)類型可以為任意類型,包含基本類型或引用類型
?、蹍?shù)的本質(zhì)就是一個局部變量,也必須賦值后才能使用,但這個賦值一般是隱式賦值的(傳參時)
④方法定義時的參數(shù)稱為形式參數(shù),簡稱形參;方法調(diào)用時的參數(shù)稱為實際參數(shù),簡稱實參
形參和實參的類型、個數(shù)必須一致,參數(shù)名無要求
(5)方法體
可以包含0條或任意多條邏輯語句。
形式:輸入、輸出、變量、運算、分支、循環(huán)、方法調(diào)用
5、調(diào)用語法 ★
1、本類內(nèi)方法調(diào)用:方法名(實參列表);
2、跨類中方法調(diào)用:對象或類名.方法名(實參列表);
注意:
如果待調(diào)用的方法有返回值,則最好用變量接受或做其他處理
如果待調(diào)用的方法沒有返回值,則不能當(dāng)成表達式做任何處理
6、調(diào)用機制 √
每次方法調(diào)用,都伴隨“入棧”的操作
每次調(diào)用結(jié)束,都伴隨“出?!钡牟僮?/p>
7、方法的傳參 ★
特點:
java中方法按“值”傳遞。
參數(shù)類型為基本類型,則值代表元素內(nèi)容,傳遞是一個拷貝,形參的改變不影響實參
參數(shù)類型為引用類型,則值代表地址,傳遞是一個地址(引用),形參的改變影響實參
示例:
public static void main(String[] args){
int[] arr = {1,2,3};
update(arr);
print(arr);//1 2 3
}
public static void update(int[] arr){
arr = new int[3];
arr[0]=100;
print(arr);//100 0 0
}
public static void print(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
8、方法的重載
1、定義:java中提供了一種機制,允許同一個類中多個同名但參數(shù)列表不同的方法存在
2、好處:
①解決了起名問題
②解決了記名麻煩問題
3、要求:
①同一個類中
②方法名必須相同
③參數(shù)列表必須不同(參數(shù)類型、個數(shù)或順序至少有一樣不同)
④返回類型無要求
⑤修飾符無要求
9、可變參數(shù)的方法
1、理解:jdk5.0出現(xiàn)的新特性。java中允許將一個類中同名,同參數(shù)類型、同返回的多個方法抽取成一個可變參數(shù)的方法
2、語法:
修飾符 返回類型 方法名(參數(shù)類型...參數(shù)名){
//參數(shù)當(dāng)做數(shù)組類型去使用
}
3、好處:
?、偬岣咧赜眯?br /> ②提高維護性和擴展性
4、特點:
①可變參數(shù)的實參允許0個或多個參數(shù)
②可變參數(shù)的實參允許數(shù)組類型
③可變參數(shù)可以和普通類型的參數(shù)同時出現(xiàn)在一個形參列表,但要求可變參數(shù)必須放在最后
④一個形參列表中最多有一個可變參數(shù)
⑤可變參數(shù)的方法、普通類型參數(shù)的方法實現(xiàn)了重載(注:不可以和同一類型的數(shù)組參數(shù)方法構(gòu)成重載),傳參時:
遵循:先找一致類型——>兼容類型——>可變參數(shù)
A a = new A();
a.m(10);//執(zhí)行方法1
pubic class A{
public void m(int a){ }? ?//方法1
public void m(double a){ }??//方法2
public void m(int... a){}//方法3
}
三、構(gòu)造器
1、理解
構(gòu)造器又稱為構(gòu)造方法,屬于類中的第三大成員。
本質(zhì)上同"方法",只是沒有返回類型,且對于一個對象來講,只調(diào)用一次,并且不是通過對象或類顯示調(diào)用
2、語法
[修飾符] 構(gòu)造器名 (參數(shù)列表){
//構(gòu)造器體
}
注意:
①構(gòu)造器名與類名一致!
②沒有返回類型
3、好處
①用于創(chuàng)建對象
②可以進行初始化的操作,從一定程度上提高代碼的重用性!
4、特點
①每一個類都有構(gòu)造器,如果沒有顯式聲明,系統(tǒng)將默認(rèn)提供一個無參構(gòu)造器
②如果顯式聲明了構(gòu)造器,則系統(tǒng)將不再提供構(gòu)造器
③構(gòu)造器可以重載
④對于一個對象來講,構(gòu)造器只調(diào)用一次
注意:構(gòu)造器的調(diào)用語法
方式一: 創(chuàng)建一個新對象
new 構(gòu)造器名(參數(shù)列表);?
方式二:為了進行初始化(注:this或super調(diào)用構(gòu)造器,只能放在構(gòu)造器的而第一句,而且只能有一個)
this(參數(shù)列表);
super(參數(shù)列表)
?
四、初始化塊
1、理解
初始化塊又稱為代碼塊,屬于類中的成員,本質(zhì)上同方法。但沒有方法名、沒有參數(shù)和返回類型,只有方法體,而且不是顯式調(diào)用的,是創(chuàng)建對象或加載類時隱式調(diào)用
2、語法
[static]{
方法體
}
使用static修飾的,稱為靜態(tài)代碼塊
沒有用static修飾的,稱為普通代碼塊
3、好處
①用于初始化信息,相當(dāng)于構(gòu)造器的補充
②當(dāng)構(gòu)造器重載時,如果里面有重復(fù)的語句,為了提高代碼的重用性,往往將重復(fù)的語句提到初始化塊中
4、特點 ★
(1)調(diào)用時機
靜態(tài)代碼塊?是當(dāng)加載類時,被隱式調(diào)用,而且只調(diào)用一次
普通代碼塊?是當(dāng)對象創(chuàng)建時,被隱式調(diào)用,而且可以加載多次
【補充】類的加載時機
①創(chuàng)建對象
②調(diào)用靜態(tài)成員
③加載子類
④反射
(2)順序(靜態(tài)代碼塊和普通代碼塊)
如果:一個類中可以有多個靜態(tài)代碼塊和多個普通代碼塊
靜態(tài)代碼塊的? 執(zhí)行? 優(yōu)先于? ?普通代碼塊
注意:同一個類別的代碼塊的執(zhí)行順序取決于定義的先后順序
(3)順序(靜態(tài)代碼塊、普通代碼塊、屬性初始化、構(gòu)造器)
如果:一個類中有多個靜態(tài)代碼塊和多個普通代碼塊、屬性初始化、構(gòu)造器
靜態(tài)代碼塊|靜態(tài)屬性——>普通代碼塊|普通屬性——>構(gòu)造器
注意:同一個類別的代碼塊的執(zhí)行順序取決于定義的先后順序
(4)順序(父子類中靜態(tài)代碼塊、普通代碼塊、屬性初始化、構(gòu)造器)
如果:父子類中都有多個靜態(tài)代碼塊和多個普通代碼塊、屬性初始化、構(gòu)造器
父類靜態(tài)代碼塊|靜態(tài)屬性——>子類靜態(tài)代碼塊|子類靜態(tài)屬性
——>父類普通代碼塊|普通屬性——>父類構(gòu)造器
——>子類普通代碼塊|普通屬性——>子類構(gòu)造器
注意:同一個類別的代碼塊的執(zhí)行順序取決于定義的先后順序
(5)靜態(tài)成員的特點
靜態(tài)代碼塊中只能直接訪問靜態(tài)成員,不能直接訪問普通成員
?
五、內(nèi)部類
1、理解
一個類體中又完整的嵌套了另一個完整的類結(jié)構(gòu),被嵌套在里面的類,稱為內(nèi)部類。
嵌套其他類的類,稱為外部類。
其他類,稱為外部其他類。
2、好處
?可以直接訪問外部類的私有成員
3、分類
按定義位置不同:
定義在成員位置上
成員內(nèi)部類(無static修飾)
靜態(tài)內(nèi)部類(有static修飾)
定義在局部位置上
局部內(nèi)部類
匿名內(nèi)部類
4、內(nèi)部類之成員內(nèi)部類
(1)語法
class Outer{
class Inner{
}
}
(2)特點
①成員內(nèi)部類中可以有五大成員,但不能有靜態(tài)成員。原因:靜態(tài)成員的加載時機早于成員內(nèi)部類!
②成員內(nèi)部類可以添加訪問修飾符,訪問權(quán)限遵循修飾符的限定
③互訪原則:
成員內(nèi)部類——>外部類 ★
直接訪問,因為里面隱含著一個Outer.this的引用。
注意:當(dāng)成員內(nèi)部類和外部類的成員重名時,默認(rèn)訪問的是內(nèi)部類的成員,如果想訪問外部類的成員,可以通過Outer.this.成員的方式訪問
外部類——>成員內(nèi)部類
通過創(chuàng)建對象,去訪問
語法:new Inner().成員
外部其他類——>成員內(nèi)部類
通過創(chuàng)建對象,去訪問
語法:Outer.Inner member = new Outer().new Inner(); member.成員?
成員內(nèi)部類——>外部其他類
通過創(chuàng)建對象,去訪問
語法:new Other().成員
5、內(nèi)部類之靜態(tài)內(nèi)部類
(1)語法
class Outer{
static class Inner{
}
}
(2)特點
1、靜態(tài)內(nèi)部類中可以有所有五大成員,包含普通的和靜態(tài)的
2、靜態(tài)內(nèi)部類可以添加訪問修飾符,當(dāng)然也要遵循訪問修飾符的權(quán)限限定
3、互訪原則
靜態(tài)內(nèi)部類——>外部類 ★
直接訪問外部類中的靜態(tài)成員,包含私有的。但不能直接訪問外部類的普通成員(遵循靜態(tài)成員的特點)
注意:如果外部類和靜態(tài)內(nèi)部類中有同名成員,訪問時遵循就近原則,如果非要訪問外部類的成員,則通過 (外部類名.成員 )方式訪問
外部類——>靜態(tài)內(nèi)部類
情況1:如果訪問里面的靜態(tài)成員,則直接通過靜態(tài)內(nèi)部類名去訪問
情況2:如果訪問里面的普通成員,則通過創(chuàng)建靜態(tài)內(nèi)部類對象去訪問。
語法:new Inner().成員
外部其他類——>靜態(tài)內(nèi)部類
通過創(chuàng)建對象去訪問
語法:Outer.Inner member = new Outer.Inner();
靜態(tài)內(nèi)部類——>外部其他類
注意:和普通兩個類之間的互訪一樣
通過創(chuàng)建對象或類名的方式去訪問
6、內(nèi)部類之局部內(nèi)部類
(1)語法
public void method(){
for(int i=1;i<10;i++){
class Inner3{
}
}
}
(2)特點
①里面可以有五大普通成員,但不能有靜態(tài)成員。原因:靜態(tài)成員的加載時機早于局部內(nèi)部類!
②不能添加訪問修飾符
③作用域:比較小,僅僅在定義它的方法或代碼塊中有效,而且遵循前向引用
④互訪原則
局部內(nèi)部類——>外部類 ★
情況1:可以訪問同一個作用域的局部變量,但不能更新。因為默認(rèn)是final修飾(jdk8,final是系統(tǒng)自動提供的;jdk8之前,final是手動加入)
為什么里面只能訪問局部常量?
局部變量的消亡時機早于局部內(nèi)部類,所以局部內(nèi)部類中使用的僅僅是局部變量的拷貝。如果備份可以更新,則會導(dǎo)致數(shù)據(jù)不一致。
為了避免這種現(xiàn)象,只能讀取,不能更新!
情況2:直接訪問外部類的所有成員,包含私有的
注意:如果外部類和內(nèi)部類的成員同名,則默認(rèn)遵循就近原則,如果非要訪問外部類的成員,則通過(外部類.this.成員 )方式訪問
外部類——>局部內(nèi)部類
創(chuàng)建對象并訪問
7、內(nèi)部類之匿名內(nèi)部類
(1)語法
new 父類或接口名(){
//類體
};
(2)特點
①匿名內(nèi)部類中可以有屬性、方法、內(nèi)部類、初始化塊,但不能有構(gòu)造器和靜態(tài)成員
②不能添加修飾符
③作用域比較小,僅僅在定義它的方法或代碼塊中。
注意:匿名內(nèi)部類的對象只有一個,可以直接拿著對象調(diào)用里面的成員或為對象起一個引用名,使用引用名調(diào)用通用的成員!
④互訪原則
匿名內(nèi)部類——>外部類
情況1:訪問外部類中同一個作用域的局部變量,但要求局部變量使用final修飾(jdk8之前,final是需要手動添加;jdk8時,final是系統(tǒng)自動添加,不用手動添加)
原因:匿名內(nèi)部類的消亡時機晚于局部變量的消亡時機,所以匿名內(nèi)部類中使用的是局部變量的備份!為了避免數(shù)據(jù)不一致,所以只能讀取不能更新
情況2:可以直接訪問外部類中的成員
如果出現(xiàn)重名問題,則默認(rèn)訪問內(nèi)部類的成員,如果非要訪問外部類的成員,需要通過(外部類名.this.成員) 方式訪問
外部類——>匿名內(nèi)部類
new 類名(){}.成員
(3)應(yīng)用場景 ★
當(dāng)做實參傳遞給形參類型為接口的方法!
轉(zhuǎn)載于:https://www.cnblogs.com/truthseeking/p/9513507.html
總結(jié)
以上是生活随笔為你收集整理的JavaSE基础知识(5)—面向对象(5.2类的成员)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux时间同步+国内常用的NTP服务
- 下一篇: Java学习之路-4_集合知识总结