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