1. 程式人生 > >修飾符-包-內部類-代碼塊執行順序

修飾符-包-內部類-代碼塊執行順序

ng- text 默認方法 space stat this 理解 objects cte


1.訪問權限修飾符
從大到小的順序為:public--protected--default--private
private--只能在同一類中使用;
default--不用寫出來,默認不加.可以被同一包中的類使用
protected--可以被不同包的子類使用
public--可以被不同包的其它類使用

2.各種修飾符的修飾對象(可修飾哪些:類/接口/方法/屬性)(多個修飾符連用是可以沒有順序的!)
1)訪問權限修飾符:public/default---可修飾類/接口/方法/屬性,default不用寫出來;
補充:default還可用於修飾接口中的默認方法,必須標明,且不能與static共存.默認方法由實現類的實例對象調用(java8新特性);
2)靜態修飾符:static --修飾屬性/方法/代碼塊/類(只能是內部類);
---abstract與static不能共存(理解:被static修飾後的方法可與類同時初始化,被全局使用;而abstract修飾後需覆寫後方可使用,時間上矛盾!)
---abstract與final不能共存(理解:被final修飾的方法不可覆寫,被abstract修飾的方法需要被覆寫,矛盾!所以無法共存)
補充:static還可修飾接口中的類方法,必須標明,且不能與default共存,類方法由接口直接調用(java8新特性);
---abstract與private不能共存(方法若被private修飾不可更改,abstract需要被覆寫,矛盾!)
3)final--修飾類/屬性/方法/方法中的參數(修飾後可被局部內部類訪問);
4)abstract--修飾類/接口/方法;

3.關於修飾符的默認情況:
1)接口默認為 default;只能在本包中訪問
接口中的變量默認為 public static final(即常量,命名時需全部大寫,三個修飾符沒有順序,實際開發中通常不在接口中寫變量);
接口中的方法/內部類/內部接口/內部枚舉默認為 public abstract;
2)類中方法的權限修飾符若不寫,則默認為default:舉例如下:

  1  interface IA{
  2                  void show();//編譯後:public abstract void show();
  3
} 4 class A implements IA{ 5 void show(){//類中方法的權限修飾符若不寫,則默認為default.重寫錯誤:這裏使用的默認的訪問修飾符 ,比父類的訪問修飾符小了,這是不允許的。 6 System.out.println("Hello"); 7 } 8 } 9 m ain(){ 10 new
A().show(); 11 }


補充:
1)關於接口的默認訪問權限:
1)接口修飾符無論加與不加,始終為public <開發實戰經典>P192
2)如果標明為public,則為public,如果不寫,則默認為包的訪問權限(僅可在本包中實現) <java瘋狂講義 第三版>P191
操作:包1中創建接口A(不加public),包1和包2中分別實現該接口,包1中實現類報錯(導包後也報錯,提示不可見).
包1中創建接口A(加public),包1和包2中分別實現該接口,包1中需導包.
結論:<瘋狂講義>中的理解正確.
2)接口名稱前的修飾符:可以使用abstract修飾.

==========================================================================================

3.包
java中的包,其實就是電腦中的文件夾,包中存放的是.class文件,當class文件很多的時候,采用多個包進行存放,稱之為分包管理.
1).使用的類與當前類在一個包中,無需導包;
2).使用的類在java.lang中無需導包;
3).其它情況必須導包;
4).java常用系統包:
java.lang--基本包,自動導入,String等都在此包中;
java.lang.reflect--反射機制的包,java.lang的子包;
java.util--工具包,常用類庫/日期操作等
java.text--文本的處理類庫
java.sql--數據庫操作包,提供各類數據庫操作的類和接口
java.net--網絡編程相關
java.io--輸入/輸出處理
java.awt--構成抽象窗口工具集的多個類,這些類用來構建和管理GUI
javax.swing--建立圖形用戶界面

5).目前為止用到的包總結:
java.lang--String System StringBuffer StringBuilder 包裝類 Thread
java.util--Scanner Random ArrayList Arrays Date objects
java.io--BufferdReader BufferedWriter FileReader FileWriter
java.math--BigDecimal BigInteger
========================================================================================================================

4.內部類--成員內部類-局部內部類-匿名內部類
1)內部類也稱為嵌套類(官方說法),是寫在類中的類.分為成員內部類(寫在成員變量位置)和局部內部類(寫在方法裏,很少用).匿名內部類是局部內部類的一種.
2)內部類中可以直接訪問外部類中的所有成員
3)關於對局部變量/內部類成員變量/外部類成員變量的訪問

  1   public class Outer {
  2              int a = 100;
  3              class Inner{
  4                  int a = 200;
  5                  public void printA(){
  6                      int a = 300;
  7                      System.out.println("局部變量a="+a);//300
  8                      System.out.println("內部類的變量a="+this.a);//200
  9                      System.out.println("外部類的變量a="+Outer.this.a);//100
 10                  }
 11              }
 12          }


4)匿名內部類是創建某個類型子類對象的快捷方式,因此匿名內部類的前提是有父類或接口.
==============================================================================================
5.代碼塊的執行順序
代碼塊的執行順序:
根據所處位置不同,代碼塊分為4種--普通代碼塊/構造塊/靜態代碼塊/同步代碼塊
代碼塊:使用{}括起來的程序片段;
普通代碼塊:直接在方法或語句中定義的代碼塊;
構造塊:直接寫在類中的代碼塊;構造塊中不允許定義方法;
靜態代碼塊:使用static聲明的代碼塊;(註:靜態代碼塊不能寫在main方法中);
同步代碼塊:使用用synchronized修飾的代碼塊;

構造塊優先於構造方法執行,且每次實例化對象均會執行,執行多次;父類優先於子類執行;
靜態代碼塊優先於主方法執行,且類中定義的靜態代碼塊會優先於構造塊執行,僅執行一次;父類優先於子類執行;
主方法中的構造塊執行順序與其位置有關,按存在位置從前往後執行;且主方法中不存在靜態代碼塊;

修飾符-包-內部類-代碼塊執行順序