『壹』 java程序解析
這里的java程序運行過程,是指我們編譯好代碼之後,在命令行開始執行java xxx命令,到java程序開始執行起來的這一過程,我們稱其為運行時。
第一步,操作系統解析我們輸入的java xxx命令,根據PATH中所配置的jrd路徑找的其bin目錄下的java.exe程序(這個程序是用c語言寫的,源碼在jdk的src文件中的laucher目錄下),然後再初始化一些java參數(比如classpath、虛擬機參數等)。
第二步,java.exe程序根據上一步讀入的虛擬機參數,分配內存並啟動jre/bin目錄下client目錄或者server目錄(哪個目錄取決於第一步中的虛擬機參數)下的jvm.dll,java虛擬機開始啟動。
第三步,java虛擬機初始化內存,產生bootstrap classloader,這個類載入器負責載入java API(jvm+java API被稱為java運行時),其實這些jar包主要分布在jre/lib下,這些我們可以通過在java命令後加-verbose:class(如下圖),可見第一個被載入的java類是Object類。
[java] view plain
C:\Documents and Settings\nomouse>java -verbose:class
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
[Loaded java.lang.Error from shared objects file]
[Loaded java.lang.ThreadDeath from shared objects file]
[Loaded java.lang.Exception from shared objects file]
[Loaded java.lang.RuntimeException from shared objects file]
[Loaded java.security.ProtectionDomain from shared objects file]
[Loaded java.security.AccessControlContext from shared objects file]
...
第四步,bootstrap classloader載入完java API後,還會負責載入ExtClassLoader並生成一個實例,它繼承於ClassLoader類,負責載入jre/lib/ext下的jar包(所以有時候需要把servlet.jar包加進去,相當於一個不配置在classpath中就可以默認訪問的公共jar目錄),到這里,java虛擬機默認載入類工作完成,java虛擬機找到我們指定的Class,載入這個類(所謂自定義類載入,是指我們自己寫的java類、以及我們引入的一些第三方jar包的載入方式,只有代碼中運行到類的時候才回去載入,我們可以實現自己的ClassLoader類,用來載入我們自己的類,如果我們沒有實現自己的類載入器,上面說的ExtClassLoader會默認載入AppClassLoader並生成一個實例,由這個類載入器來進行載入),然後找到這個類的main方法,啟動程序。
『貳』 java簡單程序求過程解析
public class Test {
public static void main(String args[]) {
A a = new A();//A的構造函數調用完畢,count =1;
B b = new B();
/*
在JAVA中,子類繼承父類。如果new一個子類的話,會先將父類實例化。(先new一個父類,才能調用父類的方法。)
首先明確幾個概念,無參構造函數,有參構造函數。如果沒有寫構造函數JVM會提供一個預設的無參構造函數。如果寫了構造函數,那麼編譯器就不會提供一個預設構造函數(無參構造函數)。
所以說,如果A類中有一個有參構造函數public A(int i)那麼將不再提供預設構造函數,所以如果B類的構造函數中不寫super(int i);那麼編譯器會報錯。因為不寫的話JVM會隱性調用
A類的無參構造函數,而你已經寫了有參構造函數所以會找不到符號!
而此時必須顯性的去調用父類的構造函數super(int i );
上面這話對你這題也許沒用,但是希望你看看。
*/
System.out.println(a.getCount());
System.out.println(b.getCount());
}
}
class A {
private static int count = 0;//new A 時 =1;
public A() {
setCount(count);//new A()時,count =0;然後調用setCount(0),
}
public void setCount(int count) {
count++;//count =0 ; count ++; count =1;
this.count = count;//1 將1付給類變數 所以 count =1;
System.out.println("A count:"+count);
System.out.println("A this.count:"+this.count);
}
public int getCount() {
return count; //return coutn =1;
}
}
class B extends A {
private static int count = 0;
public B() {
this.setCount(count); //父類構造函數實例化,結束後會實例化B類的構造函數。
}
public void setCount(int count) {
count++;
//父類的構造函數調用b.setCount();
//因為count 是static B類與A類共享count 既B操作count ,A的coutn也會隨之改變,A操作count ,B的coutn也會隨之改變。 他倆是指向同一個引用。 count =1; count++; count =2;
//子類的構造函數調用b.setCoutn();
//count =2; count++; count =3;
this.count = count; //
System.out.println("B count:"+count);
System.out.println("B this.count:"+this.count);
}
public int getCount() {
return count;
}
}
『叄』 java 代碼解析
你的第一個錯誤就是類沒有找到,原因是.java 文件名和類名不一致,仔細檢查一下吧,另外程序里本身還有一些錯誤,我已經改好了,代碼如下:
public class Example1_1 {
public static void main(String args[])
{
String arrStu[][]={{"20073401","王宏","女","18"},{"20073402","張華","女","19"},
{"20073403","劉鵬","女","20"},{"20073404","王秋月","女","22"}};
System.out.println("下面是列印結果\t學號\t姓名\t性別\t年齡");
for(int i=0;i<arrStu.length;i++)
{ System.out.println("第"+(i+1)+"行的所有元素:");
for (int j=0;j<arrStu[i].length;j++)
{ System.out.println(arrStu[i][j]+"\t");
}
System.out.println("\n");
}
}
}
『肆』 一個Java程序的解析
class ArrayArgument{//定義ArrayArgument類
public class void main(String args[]){//定義主方法
int x[]={11,12,13,14,15}//定義一個int型數組,並賦值,長度為5(這里少了一個「;」)
display(x);//調用自定義方法display()將數組x傳遞過去
change(x);//調用自定義方法change()將數組x傳遞過去 display(x);//調用自定義方法display()將數組x傳遞過去
}
public static void change(int x[]){//定義方法change參數為int型數組
for(int i=0;i<x.length;i++) x[i]+=10;//遍歷數組,將數組的每一項+1
}
public static void display(int x[]){//定義方法display參數為int型數組
for(int s:x) System.out.print(s+" ");//遍歷數組,將數組的每一項後+一個空格變成一個字元串輸出在控制台
System.out.println(" ");//輸出一個換行
}
}
for(int s:x) 是JDK1.5里的新特性,形式為:for(a:b)其中b為一個集合,可以是數組、list、set等,a的類型要和集合b中元素的類型一樣,這樣它會從集合開始一項一項的遍歷集合b知道遍歷完為止,每次遍歷a就是b中的一個元素
『伍』 能解析一下這個java程序怎樣運作嗎
不可以,這個程序有問題,就是你不明白的地方有問題。解釋如下
這個程序的大概意思是每得到一個隨機數放在數組裡面,同時判斷這個隨機數是否和前幾個一樣,如果一樣就會重新獲得一個隨機數,問題出現了,如果在你重新獲得隨機數之後,這個數又恰巧和數組中的某一個數重復了,怎麼辦。
解決辦法1:在myList[i]=(int)(Math.random()*49);語句下方加上 j=0; 意思是在從新得到隨機數的時候重新和數組裡面的值進行比較,這樣做可行。但是這樣效率不是很高,如果每次重新獲得都有相同的怎麼辦?(當然那樣的概率很小,但是計算機語言嘛)
解決辦法2:用集合做代碼如下
Set<Integer> set = new HashSet<Integer>();
while(set.size()<6){
set.add((int)(Math.random()*49));
}
Iterator<Integer> it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
set集合有個特徵就是自動去掉重復數據 運行這個代碼需要你ctrl+shift+o一下導包。
『陸』 java程序分析
構造函數是沒有返回值並且與類同名的,如你上面的Point(int a,int b)
前面可以加public 或,private,(我說的沒有返回值"不"是在前面加void)
普通的方法可以有返回值的,即使沒有返回值也要聲明成void的,如public String getName(){//..}
public void setName(String name){//..}
我們通過構造函數來創建對象並對成員變數進行初始化,如:Point p=new Point();其中Point()就是構造函數,如果沒有顯示的為成員變數賦值,那麼他會被賦成默認值的,如int型的為0
我們創建了對象,就可以調用對象的方法了.如p.output(5,5);
Point pt;是先聲明一個對象的引用,他並沒有被實例化和初始化(就是沒有在內存中分配空間---初始化,沒有給成員變數付初始值---實例化.)
其實:
Point pt;
pt=new Point(3,3);
可以寫成:Point pt=new Point(3,3);
pt.output(); 的意思是:調用上面創建的對象(pt)的一個方法output(),此方法會列印出變數x和y的值.
『柒』 如何分析Java 源程序
如果是優秀程序,最起碼應該是有著良好的代碼編寫習慣並且體現了面向對象的編程風格
所以你只要從main方法開始看, 好的優秀程序應該main方法體有著良好的封裝性,所以main方法體基本都是一些方法調用語句,接下來你就要看具體的方法是什麼了,你就要跳到那個方法的程序的位置,看懂後再接著main方法的執行順序
『捌』 java 程序講解
//導入操作IO流所要使用的所有類庫
import java.io.*;
//創建位元組輸入流測試程序
public class InputReaderTest {
//程序入口
public static void main(String[] args) {
//初始化變數i的值等於0,目前沒有發現你定義這個i究竟有什麼作用
int i = 0;
//創建一個文件位元組流的對象,因為後面要在catch塊中關閉這些流,所以要
//聲明到try塊的外面,不然後面無法引用
FileInputStream fis = null;
//創建文件位元組流的對象,初始化為空,原因同上
FileReader fr = null;
//使用C盤下java目錄下的0404目錄下的說明.txt文件創建一個JAVA可以讀寫
//的File類型的對象
File file=(new File ("C:\\java\\0404\\說明.txt"));
//創建一個位元組數組,數組的大小使用所要連接的文件中所包含的位元組數目來
//創建,通常不這樣操作,往往使用緩沖流來寫,則數組的大小就可以固定為
//1KB或者2KB,另外數組的大小是有限的,如果文件過大,這里要報一個異常,
//總體來說,這個設計是一個有問題的設計
byte[] bytes=new byte[(int)file.length()];
//對以下調用過程中會引發異常的語句做異常處理
try {
//初始化fis文件位元組流對象,該流具有按位元組讀取文件的功能
fis = new FileInputStream(file);
//初始化fr文件字元流對象,該流具有按字元讀取文件的功能,個人感覺你的
//這個設置沒有任何意義,操作了這個流就是為了讀取這個流,而現在沒有使用
//到它,建議刪除,或者添加對應的位元組數組
fr = new FileReader(file);
//使用文件位元組流中的read(byte[] buf)方法,將文件中的所有內容讀入到前
//面聲明的bytes數組中
fis.read(bytes);
//將數組中的內容創建成一個字元串對象,並在屏幕上輸出出來
System.out.println(new String(bytes));
//以下兩句為關閉對應的流,這些語句往往放入到finally語句塊中
fis.close();
fr.close();
}
//如果文件沒有找到,觸發以下異常
catch (FileNotFoundException fe){
//顯示沒有找到文件
System.out.println("找不到指定文件");
//退出JAVA虛擬機
System.exit(-1);
}
//如果引發IO操作異常,觸發以下異常
catch (IOException ioe) {
//顯示文件讀取錯誤
System.out.println("文件讀取錯誤");
//退出JAVA虛擬機
System.exit(-1);
}
//顯示操作成功
System.out.println("OK,,,");
}
}
『玖』 JAVA解析
括弧應該是字元串的連接吧;
代碼不完整看不明白;
完整的一個方法定義:
修飾符 返回值 方法名 參數表 異常
『拾』 java 程序詳細分析
根據代碼分析java swing組件來實現
看代碼很像是選擇城市級聯顯示。