1. 程式人生 > 其它 >java的final,許可權、內部類的用法(一)

java的final,許可權、內部類的用法(一)

技術標籤:javajava

一、final關鍵字代表最終、不可改變的。

常見四種用法:

  1. 可以用來修飾一個類
  2. 可以用來修飾一個方法
  3. 還可以用來修飾一個區域性變數
  4. 還可以用來修飾一個成員變數

一旦使用final用來修飾區域性變數,那麼這個變數就不能進行更改。
“一次賦值,終生不變”
對於基本型別來說,不可變說的是變數當中的資料不可改變
對於引用型別來說,不可變說的是變數當中的地址值不可改變
例子:

package cn.itcast.day11.demo01;

public class Student {

    private String name;

    public Student
() { } public Student(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } }

main函式:

package cn.itcast.day11.demo01;

public class Demo01Final {

    public static void
main(String[] args) { int num1 = 10; System.out.println(num1); num1 = 20; System.out.println(num1); //一旦使用final用來修飾區域性變數,那麼這個變數就不能進行更改 // "一次賦值,終生不變" final int num2 = 200; System.out.println(num2); // num2 = 250 // 錯誤寫法,不能改變 // 正確寫法!只要保證唯一一次賦值即可
final int num3; num3 = 30; // 對於基本型別來說,不可變指的是變數當中的資料不可變 // 對於引用型別來說,不可變說的是變數當中的地址值不可變 Student stu1 = new Student("趙麗穎"); System.out.println(stu1); System.out.println(stu1.getName()); stu1 = new Student("霍建華"); System.out.println(stu1); System.out.println(stu1.getName()); System.out.println("=============="); final Student stu2 = new Student("高圓圓"); // 錯誤寫法!final的引用型別變數,其中的地址不可變 //stu2 = new Student("趙又廷"); System.out.println(stu2.getName()); stu2.setName("高圓圓圓圓"); System.out.println(stu2.getName()); } } package cn.itcast.day11.demo01; public class Demo01Final { public static void main(String[] args) { int num1 = 10; System.out.println(num1); num1 = 20; System.out.println(num1); //一旦使用final用來修飾區域性變數,那麼這個變數就不能進行更改 // "一次賦值,終生不變" final int num2 = 200; System.out.println(num2); // num2 = 250 // 錯誤寫法,不能改變 // 正確寫法!只要保證唯一一次賦值即可 final int num3; num3 = 30; // 對於基本型別來說,不可變指的是變數當中的資料不可變 // 對於引用型別來說,不可變說的是變數當中的地址值不可變 Student stu1 = new Student("趙麗穎"); System.out.println(stu1); System.out.println(stu1.getName()); stu1 = new Student("霍建華"); System.out.println(stu1); System.out.println(stu1.getName()); System.out.println("=============="); final Student stu2 = new Student("高圓圓"); // 錯誤寫法!final的引用型別變數,其中的地址不可變 //stu2 = new Student("趙又廷"); System.out.println(stu2.getName()); stu2.setName("高圓圓圓圓"); System.out.println(stu2.getName()); } }

執行結果:
在這裡插入圖片描述

當final關鍵字用來修飾一個方法的時候,這個方法就是最終方法,也就是不能被覆蓋重寫。
格式:
修飾符 final 返回值型別 方法名稱(引數列表) {
// 方法體
}

注意事項:
對於類、方法來說,abstract關鍵字和final關鍵字不能同時使用,因為矛盾。
例子:
父類方法

package cn.itcast.day11.demo01;

public class Student {

    private String name;

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

子類方法

package cn.itcast.day11.demo01;

public class Zi extends Fu{
    @Override
    public void methodAbs() {

    }

    // 錯誤寫法!不能覆蓋重寫父類當中final的方法
//    @Override
//    public void method() {
//        System.out.println("子類覆蓋重寫父類的方法!");
//    }
}

對於成員變數來說,如果使用final關鍵字修飾,那麼這個變數也照樣是不可變。

  1. 由於成員變數具有預設值,所以用了final之後必須手動賦值,不會再給預設值了。
  2. 對於final的成員變數,要麼使用直接賦值,要麼通過構造方法賦值。二者選其一。
  3. 必須保證類當中所有過載的構造方法,都最終會對final的成員變數進行賦值。
    例子:
package cn.itcast.day11.demo01;

public class Person {

   private final String name /*= "鹿晗"*/;
   public Person(){
       name = "關曉彤";
   }

   public Person(String name){
       this.name = name;
   }

   public String getName(){
       return name;
   }
}

當final關鍵字用來修飾一個類的時候,格式:
public final class 類名稱 {
// …
}

含義:當前這個類不能有任何的子類。(太監類)
注意:一個類如果是final的,那麼其中所有的成員方法都無法進行覆蓋重寫(因為沒兒子。)
例子:

package cn.itcast.day11.demo01;

public final class MyClass {

    public void method(){
        System.out.println("方法執行!");
    }
}

二、Java中有四種許可權修飾符:

public > protected > (default) > private
同一個類(我自己) YES YES YES YES
同一個包(我鄰居) YES YES YES NO
不同包子類(我兒子) YES YES NO NO
不同包非子類(陌生人) YES NO NO NO

注意事項:(default)並不是關鍵字“default”,而是根本不寫。
不同包的子類或者陌生人,public修飾的成員變數也可以訪問

public修飾符的用法:

同一個包中的public成員變數可以相互訪問
MyClass類

package cn.itcast.day11.demo02;

public class MyClass {

    public int num = 10;

    public void methhod(){
        System.out.println(num);
    }
}

MyAnother類

package cn.itcast.day11.demo02;

public class MyAnother {

    public void anotherMethod() {
//        System.out.println(new MyClass().num);
    }

}

內部類

如果一個事物的內部包含另一個事物,那麼這就是一個類內部包含另一個類。
例如:身體和心臟的關係。又如:汽車和發動機的關係。

分類:

  1. 成員內部類
  2. 區域性內部類(包含匿名內部類)

成員內部類的定義格式:
修飾符 class 外部類名稱 {
修飾符 class 內部類名稱 {
// …
}
// …
}

注意:內用外,隨意訪問;外用內,需要內部類物件。

==========================
如何使用成員內部類?有兩種方式:

  1. 間接方式:在外部類的方法當中,使用內部類;然後main只是呼叫外部類的方法。
  2. 直接方式,公式:
    類名稱 物件名 = new 類名稱();
    【外部類名稱.內部類名稱 物件名 = new 外部類名稱().new 內部類名稱();】

例子:

package cn.itcast.day11.demo03;

public class Body { // 外部類

    public class Heart{// 成員內部類

        // 內部類的方法
        public void beat(){
            System.out.println("心臟跳動:蹦蹦蹦");
            System.out.println("我叫:" + name);


        }

    }

    // 外部類的成員變數
    public String name;

    // 外部類的方法
    public void methodBody(){
        System.out.println("外部類的方法");

        new Heart().beat();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

main函式:

package cn.itcast.day11.demo03;

public class Demo01InnerClass {

    public static void main(String[] args) {
        Body body = new Body();

        // 通過外部類的物件,呼叫外部類的方法,裡面間接在使用內部類Heart
        body.methodBody();
        System.out.println("===========");

        // 按照公式寫
        Body.Heart heart = new Body().new Heart();
        heart.beat();
    }
}

結果:
在這裡插入圖片描述
如變量出現了重名現象,那麼格式是:外部類名稱.this.外部類成員變數名

package cn.itcast.day11.demo03;

public class Outer {


    int num = 10;// 外部類的成員變數

    public class Inner{
        int num = 20;

        public void methodInner(){
            int num = 30;// 內部類方法的區域性變數
            System.out.println(num); // 區域性變數,就近原則
            System.out.println(this.num); // 內部類的成員變數
            System.out.println(Outer.this.num); // 外部類的成員變數

        }
    }
}

main函式

package cn.itcast.day11.demo03;

public class Demo02InnerClass {

    public static void main(String[] args) {
        // 外部類名稱.內部類名稱 物件名 = new 外部類名稱().new 內部類名稱();
        Outer.Inner obj = new Outer().new Inner();
        obj.methodInner();
    }

}

結果
在這裡插入圖片描述