一些關於Java的瑣碎知識點

1、對於類中的final類型屬性,一般在聲明的時候直接寫final int a =1;

  但也可以在構造函數中進行賦值,如:

final int a;
A{}( a =1;)

  但要注意:需要每一個構造函數都賦值,且不能嵌套。

  而如果想寫static final int a;則必須在聲明時進行初始化,static final int a = 1;因爲靜態的也是不屬於類。

  2、繼承中要注意的問題:子類對父類中構造方法的問題。

  父類的中構造方法不能被繼承,故

class A{}
class B extends A{ A();} //是錯的,只能用super關鍵字

  如果子類中沒有顯示的調用super,則系統會加上,super();注意即是找父類中無參數的構造方法,所以,如果父類自己寫了構造方法而導致無參數的已經不存在了,則會出錯.

  3、靜態方法:只屬於類本身,而不是某個對象。它是在類加載的時候,就已經爲之分配好內存了。這時,並沒有產生這個的對象。而對象只有在new時候纔會出現。所以只能把這個變量加個static.這也叫做類變量,與之對應的叫做實例變量。

  4、main是靜態的,因爲它不是屬於某個類的,而是全局的。因此在執行時直接找到main,而不是針對某個類的對象。如果不是static,則會先產生類的對象。

  public:由於其是虛擬機調用,因此必須是public的。

  static:由於其不必產生對象,因此是static的。

  5、對於主類的修飾符是default時:表示在同一個包中可以被訪問。

  6、final類不能被繼承。

  7、private的方法,只要出了類就不能被訪問,不管是在同一個包中,還是繼承關係。默認的訪問權限都是在這個包中,被繼承也不能被訪問。

  protected方法對以上均適用,但和public方法也有區別

  在於:對於不同包中,沒有繼承關係的兩個類而言,在一個類中使用了另一個類的對象,則只有public方法可以被訪問,而protected方法不能被訪問。

  8、抽象方法的聲明:abstract void proMethod(); //不要加大括號

  看一個類是否被實現,不是看{}裏面有沒有代碼,而是看有沒有{}

  9、JNI(Java Native Interface),它允許Java虛擬機(JVM)內部運行的Java代碼能夠與用其它編程語言(如c、c++、彙編語言)編寫的應用程序和庫進行互操作。

  JNI可以理解爲Java和本地應用程序之間的中介。

  它最大的好處是沒有對底層Java虛擬機的實現施加任何限制。

  寫一個native的方法:

  1)寫java代碼段,如HelloWorld.java。

  2)用javac來編譯之,得到.class文件。

  3)用javah -jni 來生成HelloWorld頭文件,得到HelloWorld.h

  4)用HelloWorld.h來生成本地方法,得到HelloWorldImp.c

  5)編譯本地代碼,加載共享庫,生成Hello.so(so文件是linux,或unix下動態連接庫的文件,相當於windows下的.dll)

  10、對於接口中的方法,默認情況下就是public abstract的,因此不用再寫,也因此,實現接口時必須用public來修飾。

  接口中的數據成員默認都是public static final.

 11、

以下是代碼片段:
 class Z extends A implements B,C
  {
  }
  //注意這個順序先派生類,再實現接口。

  12、有關內部類:當我們產生一個派生類的對象的時候,它會調用基類的構造函數,產生一個基類的對象。因此

以下是代碼片段:
 class Car
  {
  class Wheel
  {
  }
  }
  class PlaneWheel extends Car.Wheel
  {
  public static void main(String[] args)
  {
  PlaneWheel pw = new PlaneWheel();
  }
  }

  這是不能通過編譯的,因爲我們要產生pw,就必須先產生Car.Wheel的對象,而它是內部類,所以要產生它的對象,就必須先產生外部類的對象,才能建立起內部與外部的引用關係。

  因此作出改變:

以下是代碼片段:
  class PlaneWheel extends Car.Wheel
  {
  PlaneWheel(Car car)
  {
  car.super();
  }
  public static void main(String[] args)
  {
  Car car = new Car();
  PlaneWheel pw = new PlaneWheel(car);
  }
  }

  21、javac A.java可以生成B.class,前提是classB在A.java中被聲明爲一個類,且不是Public的。

  22、finally的問題:不是在try,catch之後的語句就相當於finally,因爲如果在try中有return語句,則其後的是不會被執行的。而如果放在finally中,則一定會執行。

  如果在代碼中會有一個嚴重錯誤,而不想讓finally中的語句執行,則寫

  System.exit(-1);來避免其執行。//不是0就可以。

  23、c++中允許程序員重載操作符,但java中不允許。針對String的"+"和"+=",是java中唯一被重載的操作符。

  24、StringBuffer的應用:

  StringBuffer sb = new StringBuffer().append("a").append("bc").append("123");

  可用toString()方法,將其轉化爲toString();

  由於在打印時會自動調用toString方法,因此,打印時不必顯示加上。

  25、java中的索引是從0開始,而且,對於一個區間的數值,是大於等於,小於的關係。即前面的數字是包含的,而後面的是不包含的。

 26、java中,傳參時:對於基本數據類型,傳遞的是數據的拷貝;對於引用類型,傳遞的引用的拷貝。但是對於引用的拷貝,是淺拷貝,即指向了堆中同一處內存。

  因此在改變值的時結果不一樣,對於基本類型,其回到傳參者時沒有改變其值,而對於引用,其值則改變了。

  27、有的接口中沒有任何抽象方法,如cloneable,叫作標識接口。它僅僅是告訴編譯器自己可以被克隆。

  如果類中的成員有引用,則涉及到淺拷貝還是深拷貝的問題。

  淺拷貝就是把除了引用成員的全都拷貝一份,而對於引用部分則指向同一處。而深拷貝就是把所有的都拷貝一份。

  調用super.clone()方法,它可以在運行時刻,object中的clone()識別出你要複製的哪一個對象,然後爲此對象分配空間,並進行對象複製,將原始對象的內容一一複製到新對象的存儲空間中。

  28、Integer的

  valueOf(String s) //把s轉化成一個包裝類對象返回

  parseInt(String s) //把s轉化成一個int型數據返回

  封裝類的對象的值是不能被修改的,只能是讀。

  29、java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成後,在生成的.class文件中,就會產生一個Class對象,用於表示這個類的類型信息。

  獲取class實例的三種方式:

  a)利用對象調用getClass()方法獲取該對象的class實例;

  b)使用class類的靜態方法forName(),用類的名字獲取一個class實例

  c)運用.class的方式來獲取class實例,對於基本數據類型的封裝類,還可以用.type來獲取相對應的基本數據類型的class類型。如:

以下是代碼片段:
Point pt = new Point();
  Class c1 = pt.getClass();
  System.out.println(c1.getName());
  try{
  Class c2 = Class.forName("Point");
  System.out.println(c2.getName());
  }
  catch{……}
  Class c3 = Point.class;
  System.out.println(c3.getName());
  Class c4 = int.class;
  System.out.println(c4.getName());
  Class c5 = Integer.TYPE;
  System.out.println(c5.getName());

  30、java中的反射api:主要用於:對於某個不知道名字的類,通過反射機制調用他們的構造函數,爲構造函數及其他函數進行傳參,調用。

  31、runtime這個類提供了應用程序與環境之間的接口。可以獲取jvm的總共內存,已佔有的內存。用getRuntime()方法獲取其實例。

Runtime rt = Runtime.getRuntime();
System.out.println(rt.freeMemory());
System.out.println(rt.totalMemory());

  另可以有執行命令,返回一個process. 爲應用程序做準備。

try{rt.exec("notepad");}
try{rt.exec(javac ArrayTest.java);};

  要獲得其具體輸出的信息,可以用process類。

try{
Process p = rt.exec("java ArrayTest");
InputStream is = p.getInputStream();//此時,其輸出全在了 InputStream中
int data;
while((data=is.read())!=-1)
{
System.out.print((char)data);
}
}

  Runtime類是使用單例模式的一個例子。

  32、單例模式:

  a)一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,這個類稱爲單例類。

  b)單例類的一個最重要特點:它是類的構造方法是私有的,從而避免了外部利用構造方法直接創建多個實例。

以下是代碼片段:
class Singleton
  {
  private static final Singleton st = new Singleton();
  private Singleton(){}
  public static Singleton getInstance()
  {
  return st;
  }
  }
發佈了17 篇原創文章 · 獲贊 13 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章