‘壹’ 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组件来实现
看代码很像是选择城市级联显示。