BloveSaga

          在希臘帕爾納斯山南坡上,有一個馳名世界的戴爾波伊神托所,在它的入口處的巨石上赫然銹刻著這樣幾個大字: 認識你自己!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            34 隨筆 :: 12 文章 :: 122 評論 :: 0 Trackbacks

          #

               摘要: JAVA 程序員面試 32 問 第一,談?wù)? final , ...  閱讀全文
          posted @ 2006-06-05 15:16 藍色Saga 閱讀(332) | 評論 (2)編輯 收藏

          >>>>>>>>>>>>>>>>Runtime和Process類<<<<<<<<<<<<<<<<<<<
          1> 每一個Java程序都有一個Runtime類的單一實例。
          2> 通過Runtime.getRuntime()獲取Runtime類的實例。
          3> Runtime類是使用單例模式的一個例子。
          ?? Runtime沒有public的構(gòu)造方法。我們必須用Runtime的靜態(tài)方法getRuntime();我們可以用
          ?? Runtime的exec來執(zhí)行一個外部程序,也可以用來編譯一個源文件(用來做圖形界面的編譯器)。
          import java.io.*;
          class RuntimeTest
          {
          ?public static void main(String[] args)
          ?{
          ??Runtime rt=Runtime.getRuntime();
          ??//System.out.println(rt.freeMemory());
          ??try
          ??{
          ???//rt.exec("notepad");
          ???Process p=rt.exec("java ArrayTest");
          ???InputStream is=p.getInputStream(); //從執(zhí)行ArrayTest類所得來的
          ???int data;
          ???while((data=is.read())!=-1)
          ???{
          ????System.out.print((char)data);
          ???}
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ?}
          }

          ------------->>設(shè)計模式<<-------------
          1> 在我們進行程序設(shè)計時,逐漸形成了一些典型問題和問題解決方案,這就是軟件模式。
          2> 每一個模式描述了一個在我們程序設(shè)計中經(jīng)常發(fā)生的問題,以及該問題的解決方案。
          3> 當(dāng)我們碰到模式所描述的問題,就可以直接用相應(yīng)的解決方法去解決這個問題,這就是設(shè)計模式。
          <$>單例(Singleton)模式
          1> 一個類只有一個實例,而且自行實例化并像整個系統(tǒng)提供這個實例,這個類稱為單例類。
          2> 單例類的一個重要特點就是類的構(gòu)造方法是私有的,從而避免了外部用利用構(gòu)造方法直接創(chuàng)建多個實例。
          ?? 如:Runtime類。

          單例類的實現(xiàn):(code)
          class Singleton
          {
          ?private static final Singleton st=new Singleton();
          ?private Singleton()
          ?{
          ??
          ?}
          ?public static Singleton getInstance()
          ?{
          ??return st;
          ?}
          }

          posted @ 2006-06-05 14:47 藍色Saga 閱讀(327) | 評論 (0)編輯 收藏

          =============================封裝類===============
          針對八種基本數(shù)據(jù)類型定義的相應(yīng)的引用類型-封裝類(包裝類,包裹類)
          基本數(shù)據(jù)類型????????? 封裝類
          ?boolean?????????????? Boolean
          ?byte????????????????? Byte
          ?short???????????????? Short
          ?int?????????????????? Integer
          ?long????????????????? Long
          ?char????????????????? Character
          ?float???????????????? Float
          ?double??????????????? Double
          所有的封狀類都是一個只讀類(不能修改的).針對沒個基本類型我們只能建立一個這讀的。

          class Test
          {
          ?public static void main(String[] args)
          ?{
          ??int i=3;
          ??Integer in=new Integer(i);
          ??int j=in.intValue();
          ??System.out.println(j);
          ??String str=in.toString();? //把Integer對象轉(zhuǎn)換為String類型
          ??System.out.println("str="+str);
          ??
          ??String str1="123";
          ??System.out.println(Integer.valueOf(str1));? //把String類型轉(zhuǎn)換為Integer類型
          ??
          ??boolean b1=false;
          ??Boolean b=new Boolean(b1);
          ??String s1=b.toString();
          ??System.out.println(s1);
          ??
          ??String s2="NO";
          ??System.out.println(Boolean.valueOf(s2));
          ?}
          }

          *****************Class*********************
          1> 在Java中,每個class都有一個相應(yīng)的Class對象。也就是說,當(dāng)我們編寫一個類,編譯完成后,在生成
          ?? 的.class文件中,就會產(chǎn)生一個Class對象,用于表示這個類的類型信息。
          2> 獲取Class實例的方法有三種:
          ?? <1>利用對象調(diào)用getClass()方法獲得該對象的Class實例。
          ?? <2>使用Class類的靜態(tài)方法forName(),用類的名字獲取一個Class的是實例。
          ?? <3>運用.class的方式來獲取Class實例,對于基本數(shù)據(jù)類型的封裝類,還可以用.TYPE來獲取相應(yīng)的
          ????? 基本數(shù)據(jù)類型的Class實例。
          ?? <4>在運行期間,如果我們要產(chǎn)生某個類的對象,JAVA虛擬機(JVM)會檢查該類型的Class對象是否被
          ????? 加載,如果沒有加載,JVM會根據(jù)類的名稱找到.class文件并加載它。一旦某個類型的Class對象已
          ????? 經(jīng)被加載到內(nèi)存,就可以用它來產(chǎn)生該類型所有的對象。
          ?? <5>newInstance()調(diào)用類中缺省的構(gòu)造方法。(好處是我們在不知道類的名字的情況下去創(chuàng)造一個實例)
          import java.lang.reflect.*;?????? //子包必須手動導(dǎo)入
          class ClassTest
          {
          ?public static void main(String[] args)//throws Exception
          ?{
          ??/*
          ??Point pt=new Point();?????????????
          ??Class c1=pt.getClass();//利用對象調(diào)用getClass()方法獲得該對象的Class實例
          ??System.out.println(c1.getName());
          ??
          ??Class c2=Class.forName("Point");//使用Class類的靜態(tài)方法forName(),用類的名字獲取一個Class的是實例
          ??System.out.println(c2.getName());
          ??
          ??Class c3=Point.class;//運用.class的方式來獲取Class實例
          ??System.out.println(c3.getName());
          ??
          ??Class c4=Integer.TYPE;//封裝類用.TYPE來獲取相應(yīng)的基本數(shù)據(jù)類型的Class實例。
          ??System.out.println(c4.getName());
          ??*/
          ??/*
          ??System.out.println("before new Point()");
          ??new Point();
          ??System.out.println("after new Point()");
          ??Class.forName("Line");
          ??*/
          ??/*
          ??if(args.length!=1)
          ??{
          ???return;
          ??}
          ??try
          ??{
          ???Class c=Class.forName(args[0]);
          ???Point pt=(Point)c.newInstance();
          ???pt.output();
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ??*/
          ??if(args.length!=1)
          ??{
          ???return;
          ??}
          ??try
          ??{
          ???Class c=Class.forName(args[0]);
          ???Constructor[] cons=c.getDeclaredConstructors();
          ???/*
          ???for(int i=0;i<cons.length;i++)
          ???{
          ????System.out.println(cons[i]);
          ???}
          ???Method[] ms=c.getDeclaredMethods();
          ???for(int i=0;i<ms.length;i++)
          ???{
          ????System.out.println(ms[i]);
          ???}*/
          ???Class[] params=cons[0].getParameterTypes();
          ???Object[] paramValues=new Object[params.length];
          ???for(int i=0;i<params.length;i++)
          ???{
          ????if(params[i].isPrimitive())
          ????{
          ?????paramValues[i]=new Integer(i+3);
          ????}
          ???}
          ???Object o=cons[0].newInstance(paramValues);
          ???Method[] ms=c.getDeclaredMethods();
          ???ms[0].invoke(o,null);
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ??
          ?}
          }

          class Point
          {
          ?static
          ?{
          ??System.out.println("Loading Point");
          ?}
          ?int x,y;
          ?void output()
          ?{
          ??System.out.println("x="+x+","+"y="+y);
          ?}
          ?Point(int x,int y)
          ?{
          ??this.x=x;
          ??this.y=y;
          ?}
          }

          class Line
          {
          ?static
          ?{
          ??System.out.println("Loading Line");
          ?}
          }

          posted @ 2006-06-05 05:59 藍色Saga 閱讀(139) | 評論 (0)編輯 收藏

          ~~~~~~~~~~~~~~~~~~~~~~~~~~函數(shù)的調(diào)用~~~~~~~~~~~~~~~~~~~~
          1> 在java中,傳參時,都是以傳值的形式驚行。
          2> 對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的引用的拷貝。
          3> 當(dāng)我們在打印一個對象的時候,比如System.out.println(pt);,它會自動調(diào)用類的toString()方法
          ?? ,所以建議在所有的子類中重寫toString()方法。
          我們寫一個函數(shù)用來交換兩個變量(x,y)的值.
          ?code:
          class StringTest
          {
          ?public static void change(int x, int y)
          ?{
          ??x=x+y;
          ??y=x-y;
          ??x=x-y;
          ?}
          ?/*
          ?public static void change(int[] num)
          ?{
          ??num[0]=num[0]+num[1];
          ??num[1]=num[0]-num[1];
          ??num[0]=num[0]-num[1];
          ?}
          ?public static void change(Point pt)
          ?{
          ??pt.x=pt.x+pt.y;
          ??pt.y=pt.x-pt.y;
          ??pt.x=pt.x-pt.y;
          ?}
          ?*/
          ?public static void main(String[] args)
          ?{
          ?int x=3;
          ?int y=4;
          ?change(3,4);
          ?System.out.println("x="+x+","+"y="+y);
          ?}
          我們期望的輸出結(jié)果是 x=4,y=3 然后你運行后發(fā)現(xiàn)結(jié)果為x=3,y=4,并沒有達到我們的要求,為什么呢?那是因為對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的是引用(首地址)的拷貝。看看下面的內(nèi)存圖解應(yīng)該你就能看出來了.看看引用類型怎么來實現(xiàn):


          code:
          class StringTest
          {
          ?/*
          ?public static void change(int x, int y)
          ?{
          ??x=x+y;
          ??y=x-y;
          ??x=x-y;
          ?}
          ?*/
          ?public static void change(int[] num)
          ?{
          ??num[0]=num[0]+num[1];
          ??num[1]=num[0]-num[1];
          ??num[0]=num[0]-num[1];
          ?}
          ?public static void change(Point pt)
          ?{
          ??pt.x=pt.x+pt.y;
          ??pt.y=pt.x-pt.y;
          ??pt.x=pt.x-pt.y;
          ?}
          ?public static void main(String[] args)
          ?{
          ??/*
          ?? int x=3;
          ?? int y=4;
          ?? change(3,4);
          ?? System.out.println("x="+x+","+"y="+y);
          ?? */
          ?? int[] num=new int[]{3,4};
          ?? change(num);
          ?? System.out.println("x="+num[0]+","+"y="+num[1]);
          ??
          ?? Point pt=new Point();
          ?? pt.x=3;
          ?? pt.y=4;
          ?? change(pt);
          ?? System.out.println("x="+pt.x+","+"y="+pt.y);?
          ?}
          class Point
          {
          ?int x,y;?
          }
          再看看引用類型的內(nèi)存變化圖:
          以上說明了在Java中函數(shù)的調(diào)用:
          a> 在Java中,傳參時,都是以傳值的方式進行。
          b> 對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的是引用(首地址)的拷貝。
          posted @ 2006-06-05 04:19 藍色Saga 閱讀(137) | 評論 (0)編輯 收藏

          ^^^^^^^^^^^^^^^對象的克隆^^^^^^^^^^^^^
          1> 為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法。
          2> 在派生類中覆蓋基類的clone(),并聲明為public。
          3> 在派生類的clone()方法中,調(diào)用super.clone()。
          4> 在派生類中實現(xiàn)Cloneable接口。
          4> 沒有抽象方法的接口叫標(biāo)識接口。
          5> 為什么我們在派生類中覆蓋Object的clone()方法時,一定要調(diào)用super.clone()呢?在運行時刻,Object
          ?? 的clone()方法能識別出你要復(fù)制的是哪一個對象,然后為此對象分配空間,并進行對象的復(fù)制,將原
          ?? 始對象的內(nèi)容一一復(fù)制到新的對象空間去。

          * 淺克隆是針對沒有引用類型的變量來克隆。針對引用類型的克隆應(yīng)該用Deeply Clone。
          淺克隆:
          Code:
          class FleetClone
          {
          ?public static void main(String[] args)
          ?{
          ?? Professor p=new Professor("feiyang",23);
          ?? Student s1=new Student("zhangshan",18,p);
          ?? Student s2=(Student)s1.clone();
          ?? s2.p.name="feifei";
          ?? s2.p.age=30;

          ?? System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
          ?}
          }
          class Professor
          {
          ?String name;
          ?int age;
          ?Professor(String name,int age)
          ?{
          ??this.name=name;
          ??this.age=age;
          ?}
          }

          class Student implements Cloneable
          {
          ?Professor p;
          ?String name;
          ?int age;
          ?Student(String name, int age,Professor p)
          ?{
          ??this.name=name;
          ??this.age=age;
          ??this.p=p;
          ?}
          ?public Object clone()
          ?{
          ??Object o=null;
          ??try
          ??{
          ???o=super.clone();
          ??}
          ??catch(CloneNotSupportedException e)
          ??{
          ???e.printStackTrace();
          ??}
          ??return o;
          ?}
          }
          改變學(xué)生s2的教授信息,打印s1教授信息,結(jié)果為:name=feifei,age=30.產(chǎn)生這個結(jié)果是因為String是一個常量類型.
          ?
          深克隆
          code:
          class DeeplyClone
          {
          ?public static void main(String[] args)
          ?{
          ?? Professor p=new Professor("feiyang",23);
          ?? Student s1=new Student("zhangshan",18,p);
          ?? Student s2=(Student)s1.clone();
          ?? s2.p.name="Bill.Gates";
          ?? s2.p.age=30;
          ?? System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
          ?}
          }
          class Professor implements Cloneable
          {
          ?String name;
          ?int age;
          ?Professor(String name,int age)
          ?{
          ??this.name=name;
          ??this.age=age;
          ?}
          ?public Object clone()
          ?{
          ??Object o=null;
          ??try
          ??{
          ???o=super.clone();
          ??}
          ??catch(CloneNotSupportedException e)
          ??{
          ???e.printStackTrace();
          ??}
          ??return o;
          ?}
          }

          class Student implements Cloneable
          {
          ?Professor p;
          ?String name;
          ?int age;
          ?Student(String name, int age,Professor p)
          ?{
          ??this.name=name;
          ??this.age=age;
          ??this.p=p;
          ?}
          ?public Object clone()
          ?{
          ??//Object o=null;
          ??Student o=null;
          ??try
          ??{
          ???o=(Student)super.clone();
          ??}
          ??catch(CloneNotSupportedException e)
          ??{
          ???e.printStackTrace();
          ??}
          ??o.p=(Professor)p.clone();
          ??return o;
          ?}
          }
          打印結(jié)果為:name=Bill.Gates,age=30,這就是深克隆.
          posted @ 2006-06-05 04:15 藍色Saga 閱讀(158) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
          主站蜘蛛池模板: 库尔勒市| 临沂市| 伊川县| 昆明市| 安远县| 方山县| 大渡口区| 英吉沙县| 乾安县| 涟源市| 仪陇县| 芒康县| 房山区| 墨脱县| 江达县| 蒲城县| 会理县| 随州市| 大安市| 汾西县| 辽宁省| 崇文区| 凤庆县| 亳州市| 家居| 富平县| 嘉禾县| 平安县| 凌云县| 台东县| 望城县| 紫阳县| 清苑县| 县级市| 社会| 双辽市| 屏南县| 郁南县| 雷波县| 宁明县| 理塘县|