1. 程式人生 > 實用技巧 >8.4 學習日記

8.4 學習日記

8.4 學習日記

KVM

KVM 是 Linux 的一部分。Linux 也是 KVM 的一部分。Linux 有的,KVM 全都有。然而,KVM 的某些特點讓它成為了企業的首選虛擬機器監控程式。

靜態類:

所謂靜態,指以static關鍵字修飾的,包括類,方法,塊,欄位。

靜態類和非靜態類之間的區別

1.內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用

2.非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員

3.一個非靜態內部類不能脫離外部類實體被建立,一個非靜態內部類可以訪問外部類的資料和方法,因為他就在外部類裡面

4.其實就是靜態類不用先建立外部類。可以靜態類看做外部類的靜態變數,使用就不要外部類例項;而非靜態就必須先例項化。

package com.example.mybatisplus.controller;

/**
 * @ClassName: OutClass
 * @Description:
 * @Author: xf
 * @Date: 19.6.27 10:59
 * @Version: 1.0
 */
public class OutClass {

    /**
     *  全域性靜態變數
     */
    private static final String msg = "i love java";
     // 建立靜態類
    public static class staticInnerClass{
         public void showMsg() {
             System.out.println("靜態內部類展示資訊:"+msg);
         }

    }
    // 建立非靜態內部類
    public class InnerClass{
        public void disPlayMsg() {
            System.out.println("非靜態內部類展示資訊:"+msg);
        }
    }

    public static void main(String[] args) {
        // 建立靜態內部類例項
        staticInnerClass sic = new OutClass.staticInnerClass();
        sic.showMsg();

        // 建立非靜態內部類例項,需要先建立外部類的例項 OutClass().new
        InnerClass ic = new OutClass().new InnerClass();
        ic.disPlayMsg();

    }
}

匿名類兩種

1、與子類有關的匿名類

2、與介面有關的匿名類

// 子類有關的匿名類
// 介面相關的匿名類 則是把class Polygon替換為interface Polygon,同時方法不用進行實現

class Polygon {
   public void display() {
      System.out.println("在 Polygon 類內部");
   }
}

class AnonymousDemo {
   public void createClass() {

      // 建立的匿名類繼承了 Polygon 類
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("在匿名類內部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
       AnonymousDemo an = new AnonymousDemo();
       an.createClass();
   }
}

內部類

在 Java 中,可以將一個類定義在另一個類裡面或者一個方法裡面,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這四種:成員內部類、區域性內部類、匿名內部類和靜態內部類。下面就先來了解一下這四種內部類的用法。
1.成員內部類
成員內部類是最普通的內部類,它的定義為位於另一個類的內部,形如下面的形式:

class Circle {
    double radius = 0;
     
    public Circle(double radius) {
        this.radius = radius;
    }
     
    class Draw {     //內部類
        public void drawSahpe() {
            System.out.println("drawshape");
        }
    }
}

這樣看起來,類Draw像是類Circle的一個成員,Circle稱為外部類。成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。

class Circle {
    private double radius = 0;
    public static int count =1;
    public Circle(double radius) {
        this.radius = radius;
    }
     
    class Draw {     //內部類
        public void drawSahpe() {
            System.out.println(radius);  //外部類的private成員
            System.out.println(count);   //外部類的靜態成員
        }
    }
}

不過要注意的是,當成員內部類擁有和外部類同名的成員變數或者方法時,會發生隱藏現象,即預設情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:

外部類.this.成員變數
外部類.this.成員方法

雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這麼隨心所欲了。在外部類中如果要訪問成員內部類的成員,必須先建立一個成員內部類的物件,再通過指向這個物件的引用來訪問:

class Circle {
    private double radius = 0;
 
    public Circle(double radius) {
        this.radius = radius;
        getDrawInstance().drawSahpe();   //必須先建立成員內部類的物件,再進行訪問
    }
     
    private Draw getDrawInstance() {
        return new Draw();
    }
     
    class Draw {     //內部類
        public void drawSahpe() {
            System.out.println(radius);  //外部類的private成員
        }
    }
}

成員內部類是依附外部類而存在的,也就是說,如果要建立成員內部類的物件,前提是必須存在一個外部類的物件。建立成員內部類物件的一般方式如下:

public class Test {
    public static void main(String[] args)  {
        //第一種方式:
        Outter outter = new Outter();
        Outter.Inner inner = outter.new Inner();  //必須通過Outter物件來建立
         
        //第二種方式:
        Outter.Inner inner1 = outter.getInnerInstance();
    }
}
 
class Outter {
    private Inner inner = null;
    public Outter() {
         
    }
     
    public Inner getInnerInstance() {
        if(inner == null)
            inner = new Inner();
        return inner;
    }
      
    class Inner {
        public Inner() {
             
        }
    }
}

內部類可以擁有 private 訪問許可權、protected 訪問許可權、public 訪問許可權及包訪問許可權。比如上面的例子,如果成員內部類 Inner 用 private 修飾,則只能在外部類的內部訪問,如果用 public 修飾,則任何地方都能訪問;如果用 protected 修飾,則只能在同一個包下或者繼承外部類的情況下訪問;如果是預設訪問許可權,則只能在同一個包下訪問。這一點和外部類有一點不一樣,外部類只能被 public 和包訪問兩種許可權修飾。我個人是這麼理解的,由於成員內部類看起來像是外部類的一個成員,所以可以像類的成員一樣擁有多種許可權修飾。

2.區域性內部類
區域性內部類是定義在一個方法或者一個作用域裡面的類,它和成員內部類的區別在於區域性內部類的訪問僅限於方法內或者該作用域內。

class People{
    public People() {
         
    }
}
 
class Man{
    public Man(){
         
    }
     
    public People getWoman(){
        class Woman extends People{   //區域性內部類
            int age =0;
        }
        return new Woman();
    }
} 

注意: 區域性內部類就像是方法裡面的一個區域性變數一樣,是不能有 public、protected、private 以及 static 修飾符的。

3.匿名內部類
上面已經介紹過了
分為關於子類的或者關於介面使用部分

4.靜態內部類
上面已介紹

常見題目型別:https://www.runoob.com/w3cnote/java-inner-class-intro.html

異常丟擲:

總結存在3中異常類

  1. Error
  2. Exception(非RuntimeException)
  3. RuntimeException

注意事項:

  • Error一般用在永遠不會出現的錯誤
  • RuntimeException一般用於表示由於程式設計漏洞產生的錯誤
  • Exception(非RuntimeException)表示流程類的錯誤類
  • 所以在我們的日常使用中可以使用Exception(非RuntimeException)的情況會居多

一般的寫法為:

實現Exception過載的幾種建構函式即可

編寫error與RuntimeException也差不多

// 程式碼示例
public class ExportException extends Exception {
 
    public ExportException() {
        super();
    }
 
    public ExportException(String message) {
        super(message);
    }
 
    public ExportException(String message, Throwable cause) {
        super(message, cause);
    }
 
    public ExportException(Throwable cause) {
        super(cause);
    }
 
    protected ExportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

Cloneable clone()

如果物件implement Cloneable介面的話,需要覆蓋clone方法(因為OBject類的clone方法是protected,需要覆蓋為public)

程式碼示例:

那些年拷貝的物件
/**
     * Test類重寫clone方法
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        
        Test cloned=(Test) super.clone();
        
        cloned.date=(Date) date.clone();
        
        return cloned;
    }