eightDay_java final與內部類
1、final關鍵字
final:不可變的,最終的 常見的四種用法:
1> 用來修飾一個類
2> 用來修飾一個方法
3> 用來修飾區域性變數
4> 用來修飾成員變數
2、修飾類
*final 用來修飾一個類的時候
格式:public final class 類名稱(){ .... }
含義:當前這個類不能有任何子類(太監類,可以有父類但不能有子類)
3、修飾方法
當用final修飾一個方法的時候,這個方法是最終類,不能被覆蓋重寫
格式:public final 返回值型別 方法名稱(引數列表){...}
注意事項:abstract與final不能同時寫,二者互相矛盾。
4、修飾區域性變數
一次賦值,終生不變 對於基本變數,不可變的是變數裡的資料 對於引用變數,不可變的是變數裡的地址值
public static void main(String[] args) {
final int num;
num=90;//或者直接 final int num=90;
//num=80;//錯誤寫法 num變數中的資料不可變
final StudentFinal stu =new StudentFinal("張三");
System.out.println(stu.getName());//張三
// stu=new StudentFinal("lisi");//錯誤,stu裡的地址值不可變 但是儲存的”張三“資料可以變
}
5、修飾成員變數
一次賦值,終生不變
但是成員變數具有預設值,故一定要手動先賦值
賦值方法 直接賦值 private final String name="張三";
通過構造方法進行賦值,然後把set方法去掉
final String name;
public StudentFinal(String name) {
this.name = name;
}
public StudentFinal() {
name="李四";
}
6、許可權修飾符作用範圍
public >protected>(default)>private
-
同一個類(A類)中,無論哪種修飾符修飾成員變數都可被訪問
-
A類與B類在同一個包中,除private修飾的變數或方法不能被訪問,其他都可
-
A類與B類不在同一包中,B類繼承A類,除private,default,其餘都可
-
A類與B類不在同一個包中,無繼承關係,除public修飾的可被訪問,其餘不可。
7、內部類
一個類包含另一個類,如:身體與心臟 分類:
1>、成員內部類
2>、區域性內部類(包含匿名內部類)
8、成員內部類
格式: 修飾符 class 外部類名稱{
修飾符 class 內部類名稱{...}
...
}
//外部類
public class body {
//內部類
public class head{
//內部類方法
public void beat() {
System.out.println("心臟跳動!");
//訪問外部類私有變數
System.out.println(num);
}
}
//外部類變數
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
//外部類方法
public void method(){
System.out.println("外部類方法!");
}
}
9、訪問內部類方式、
1>、間接方式,在外部類方法中使用內部類,然後main呼叫外部類方法
body mybody=new body(); mybody.method();
2>、直接呼叫 外部類名稱.內部類名稱 物件名=new 外部類名稱().new 內部類名稱();
body.head myhead=new body().new head();
10、內部類的同名變數的訪問
public void beat() {
int num=10;
System.out.println("心臟跳動!");
//訪問外部類私有變數
System.out.println(num);//訪問本方法的num
System.out.println(this.num);//訪問內部類的num
System.out.println(body.this.num);//訪問外部類的num
}
11、區域性內部類
格式:
許可權修飾符 class 外部類名稱{
許可權修飾符 返回值型別 外部類方法名稱(){
class 內部類名稱{
....
}
內部類名稱 內部類物件=new 內部類名稱();
內部類物件.內部類方法/變數;
}
}
使用方法:
建立外部類物件.外部類方法名稱
//外部類
public class Outer {
//外部類方法
public void method(){
//區域性類定義
class inner{
//區域性類方法
public void inMethod(){
System.out.println("內部類方法");
}
}
//建立區域性類物件
inner in=new inner();
in.inMethod();
}
}
注意事項: 定義一個類的時候,許可權修飾符規則
1> 外部類:可以寫 public/(default)
2> 成員內部類:可以寫 public/protected/(default)/private
3> 區域性內部類:什麼都不寫
12、區域性類訪問所在方法的區域性變數
//區域性變數
int num=100;//final int num=100;
//區域性類定義
class inner{
//區域性類方法
public void inMethod(){
System.out.println("內部類方法"+num);
}
}
區域性內部類,如果希望訪問所在方法的區域性變數,則區域性變數一定是有效的final
備註:從Java8開始,只要區域性變數不變,那麼final可以省略
原因:new出來的物件是存在堆裡面的,成員方法是在棧裡面的,成員方法的區域性變數跟隨著方法,用完即滅。
而在堆裡面的物件要等待垃圾回收機制處理,生命週期比變數長,故當變數消失,物件依舊需要變數的值,所以變數必須是final的。
13、匿名內部類
如果介面的實現類只需要寫一次,則可以使用匿名內部類
格式: 介面名稱 物件名 =new 介面名稱(){ //重寫所有抽象類 };
程式碼:
//介面MyInterface與MyInterfaceImpl實現類
public interface MyInterface {
void method();//抽象方法
}
public class MyInterfaceImpl {
public static void main(String[] args) {
MyInterface obj=new MyInterface() {
@Override
public void method() {
System.out.println("匿名內部類");
}
};
}
}