類名.class

類名.class是Class對象的句柄,每個被加載的類,在jvm中都會有一個Class對象與之相對應,如果要創建新的對象,直接使用Class對象的局部class.forName就可以了,不需要用new     類名。


在java中,每個class都有一個相應的Class對象,當編寫好一個類,編譯完成後,在生成的.class文件中,就產生一個class對象,用來表示這個類的類型信息。獲得Class實例的三中方式:
1.利用對象調用getClass()方法獲取該對象的Class實例
2.使用Class的靜態方法forName(),用類的名字獲取一個Class實例
3.運用.calss的方式獲取Class實例,對基本數據類型的封裝類,還可以採用.TYPE來獲取對應的基本數據類型的Class實例

calss ClassTest
{
          public static void main(String[] args)
          {
                  /*
                  //利用對象調用getClass()方法獲取該對象的Class實例
                  Point pt=new Point();                
                  Class c1=pt.getClass();
                  System.out.println(c1.getName());                   //結果:Point

                  //使用Class的靜態方法forName(),用類的名字獲取一個Class實例
                  try
                  {
                          Class c2=Class.forName("Point");
                          System.out.println(c2.getName());           //結果:Point
                  }
                  catch(Exception e)
                  {
                          e.printStackTrace();
                  }

                  //運用.calss的方式獲取Class實例(類)
                  Class c3=Point.calss;
                  System.out.println(c3.getName());                   //結果:Point

                  //運用.calss的方式獲取Class實例(基本類型)
                  Class c4=int.calss;
                  System.out.println(c4.getName());                   //結果:int

                  //運用.calss的方式獲取Class實例(基本數據類型的封裝類)
                  Class c5=Integer.TYPE;
                  System.out.println(c5.getName());                   //結果:int

                  Class c6=Integer.class;
                  System.out.println(c6.getName());                   //結果:java.lang.Integer
                  */

                  //以下結果是:     before new Point()
                                  loading point
                                  after new Point()
                                  loading Line        
                  //當new Point()的時候加載這個類,用forName構造實例的時候也加載該類。
                  System.out.println("before new Point()");
                  new Point();
                  System.out.println("after new Point()");

                  try
                  {
                          Class.forName("Line");
                  }catch(Exception e)
                  {
                          e.printStackTrace();
                  }

          }
}
class Point()
{
          static
          {
                  System.out.println("loading point");
          }
          int x,y;
}
class Line
{
          static
          {
                  System.out.println("loading Line");
          }
}

在運行期間,如果我們要產生某個類的對象,java虛擬機會檢測該類型的Class對象是否已被加載。如果沒有加載,java虛擬機會根據類的名稱找到.class文件並加載它。一旦某個類型的Class對象已經被加載到內存,就可以用它來產生該類型的所有對象。
newInstance()調用內中缺省的構造方法。

newInstance()調用類中缺省的構造方法,如果要實例的對象中有了自己定義的構造方法(除重寫的和默認構造方法相同的構造方法外)
創建此 Class 對象所表示的類的一個新實例
class ClassTest
{
         public static void main(String[] args)
         {
                 if(args.length!=1)
                 {
                         System.out.println("args.length!=1");
                         return;
                 }
                 try
                 {
                         Class c=Class.forName(args[0]);
                         Point pt=(Point)c.newInstance();
                         pt.output();
                 }catch(Exception e)
                 {
                         e.printStackTrace();
                 }
         }
}
class Point
{
         int x;
         int y;
         static
         {
                 System.out.println("Loading point");
         }
         void output()
         {
                 System.out.println("x="+x+",y="+y);
         }
}
當我們在命令提示符下面編譯好該類之後,輸入java ClassTest Point的時候,此時會輸出Loading point和x=0,y=0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章