1. 程式人生 > 其它 >eightDay_java final與內部類

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("匿名內部類");
}
};
}
}