>>>>>>>>>>>>>>>>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;
?}
}
=============================封裝類===============
針對八種基本數(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");
?}
}
1> 在java中,傳參時,都是以傳值的形式驚行。
2> 對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的引用的拷貝。
3> 當(dāng)我們在打印一個對象的時候,比如System.out.println(pt);,它會自動調(diào)用類的toString()方法
?? ,所以建議在所有的子類中重寫toString()方法。
我們寫一個函數(shù)用來交換兩個變量(x,y)的值.
?code:
{
?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):
{
?/*
?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)存變化圖:
b> 對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的是引用(首地址)的拷貝。
^^^^^^^^^^^^^^^對象的克隆^^^^^^^^^^^^^
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ù)制到新的對象空間去。
{
?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);
?}
}
{
?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;
?}
}
{
?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.age=30;
?? System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
?}
}
{
?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;
?}
}