
正文
java开发实例大全代码 java开发项目实例
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求大量JAVA习题!!!急!!!(不是编程题)
注意:还不是完整的文档,太长了不能全帖完。要的话找我!^_^
《Java程序设计》练习题
一、判断题
1、 Java语言采用面向对象的思想编程,具有跨平台、分布式、多线程等优点。 ( )
2、 一个Java源程序可有多个类,但只仅有一个public类,而且程序名与public类名相同。 ( )
3、方法中的形参可以和方法所属类的属性同名。 ( )
4、接口无构造器,不能有实例,也不能定义常量。 ( )
5、利用File对象可以判断一个文件或目录是否存在。 ( )
6、JFrame,JPanel,JApplet和JButton四种组件都属于容器组件。 ( )
7、BorderLayout是面板的缺省布局管理器。 ( )
8、BorderLayout最多可以使用5个组件。 ( )
9、一个面板(JPanel)不能被加入另一个面板(JPanel)中。 ( )
10、菜单需要一个JMenuBar对象,以使他们能被添加到JFrame。 ( )
11、线程可以用yield使同优先级的线程运行。 ( )
12、System.in是标准输入流,能用read方法读取键盘的输入。 ( )
13、数据流就是数据通信通道,指在计算机的输入输出之间运动的数据序列。( )
二、填空题
1、设x,y,z的值分别为ture、false和false,试计算下列逻辑表达式的值:
(1) x y||!zture (2) !x||!y!z
(3) (!x!y)||(!y!z) (4) xy||true!z
2、求下面表达式的值:
(1) 已知x=2、y=6、z=5.0,求x+(int)y/2*z%4
(2) 已知x=123,求x/100+x%100/10+x%10
(3) 已知x=160、y=2.8、z=5,求(byte)x +(int)y+(float)z;
(4) 设 int x=17,y=5; 执行语句 x%=x++/--y 后x的值为 。
(5) 设 int a=7,b=6,c=5;,表达式 (a+b)(c*c)b==c||cb 的值为 。
(6) 设 int a=3,b=5,c=7;,表达式ac||cb!=0c==b+a 的值为 。
3、下列表达式中n和x被赋值为多少?
int n=0;
int x=1;
n=x++ + x++; //这里n= , x=
n=n++ - x--; //这里n= , x=
n=x-- + -x++; //这里n= , x=
n=++x + x++; //这里n= , x=
4、使用 方法为组件设置布局管理器,JFrame的缺省布局管理器是 ,内容面板的缺省布局管理器是 。
5、写出4个常见的异常例子: 、 、 和 。重新抛出一个异常用 语句。
6、线程通过 方法可以休眠一段时间,然后恢复运行,当 时,线程进入死亡状态。
7、编写一个线程可以用 和 来实现。
8、创建文件(c:\test.txt)对象的语句是 ,DataInputStream对象提供 方法可以按行读取文件内容。
9、Container 的________方法可以将_______组件加入容器。
10、在执行Java线程的程序中,程序通过调用_______方法启动线程,随后又调用________方法。
11、使用 方法为组件设置布局管理器,JFrame的缺省布局管理器是 ,内容面板的缺省布局管理器是 。
12、Java.swing.JFrame.getContentPane()的返回类型是 。
13、数据越界抛出的异常类是 ,整数除零抛出的异常类是 ,算术溢出抛出的异常类是 。
三、选择题
1、 下面哪些是不合法的变量名称? ( )
A) 2D B) True C) _name D) T1 E) while-ture
2、下列变量定义不正确的是: ( )
A) boolean status=false; B) float d = 45.6;
C) char c = “a”; D) int k = 1+’1’; E) float f=1/4;
3、下列数组的定义不合法的是: ( )
A) char c[][]=new char[2][3];
B) char c[][]=new char[6][];
C) char [][]c=new char[3][3];
D) char [][]c=new char[][4];
E) int []a[] = new int[10][10];
4、对于下列代码:
public class Example{
String str=new String("hello");
char ch[]={'d','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.println(ex.str+"and"+ex.ch[0]);
}
public void change(String str,char ch[]){
str="world";ch[0]= 'a';
}
}
输出结果是: ( )
A) hello and d B) hello and a
C) world and d D) world and a
5、下列说法哪个是正确的? ( )
A) 子类不能定义和父类同名同参数的方法
B) 子类只能继承父类的方法,而不能重载
C) 重载就是一个类中有多个同名但有不同形参和方法体的方法
D) 子类只能覆盖父类的方法,而不能重载
6、如果一个程序段中有多个catch,则程序会按如下哪种情况执行? ( )
A) 找到合适的例外类型后继续执行后面的catch
B) 找到每个符合条件的catch都执行一次
C) 找到合适的例外类型后就不再执行后面的catch
D) 对每个catch都执行一次
7、以下哪一项不是File类的功能: ( )
A) 创建文件
B) 创建目录
C) 删除文件
D) 拷贝文件
8、下列说法哪个是正确的? ( )
A) BorderLayout是面板的缺省布局管理器
B) 当鼠标指针位于一个GUI组件的边上时,发生一个MouseOver事件
C) 一个面板(Jpanel) 不能被加入到另一个面板(Jpanel)中
D) 在BorderLayout中,添加到NORTH区的两个按钮将并排显示。
9、在java程序中,下列关于线程的说法错误的是: ( )
A) run方法是运行线程的主体
B) 多个进程运行时执行顺序是按顺序执行的
C) 如果线程死亡,它便不能运行
D) 在java中,高优先级的可运行线程会抢占低优先级线程
10、关于JDBC访问数据库的说法错误的是: ( )
A) 建立数据库连接时,必须加载驱动程序,可采用Class.forName()实现
B) 用于建立与某个数据源的连接可采用DriverManager类的getConnection方法
C) 建立数据库连接时,必须要进行异常处理
D) JDBC中查询语句的执行方法必须采用Statement类实现
四、程序阅读题
1、阅读下面的程序,程序保存为Test.java:
1) public class Test
2) {
3) public static void main(String[] args)
4) {
5) System.out.println(args[2]);
6) }
7) }
以上程序经编译后用java Test 1 2 3 运行得到的输出结果是什么?
2、阅读下面的程序:
① public class Test{
② public static void main(String[] a){
③ int i = Integer.parseInt(a[0]);
④ switch (i) {
⑤ case 1:System.out.println("Frist season");break;
⑥ case 2:System.out.println("Second season");
⑦ case 3:System.out.println("3th season");break;
⑧ case 4:System.out.println("Last season");
⑨ }
⑩ }
⑪ }
上面的程序编译是否成功?如果编译出错,指出哪行出错,并说明理由;如果编译正确,用java Test 2 运行得到的输出结果是什么?
3、阅读下面的程序:
① public class Test{
② public static void main(String[ ] args) {
③ int x,y=2,i=0,j=0;
④ if(args.length2) System.exit(-1);
⑤ x = Integer.parseInt(args[1]);
⑥ switch(x){
⑦ case 1:switch(y){
⑧ case 1:i++;break;
⑨ case 2:j++;break;
⑩ default:i++;j++;
⑪ }
⑫ case 2:i++;j++;break;
⑬ default:i++;j++;
⑭ }
⑮ System.out.println("i="+i);
⑯ System.out.println("j="+j);
⑰ }
⑱ }
上面的程序编译是否成功?如果编译出错,指出哪行出错,并说明理由;如果编译正确,用java Test 1 2 3 运行得到的运行结果是什么?
4、阅读下面的程序,程序保存为Test.java:
1) public class Test
2) {
3) short mValue;
4) public static void main(String[] args)
5) {
6) int a = 32;
7) int b = 56;
8) Test os = new Test(a+b);
9) os.Show( );
10) }
11) protected Test(short aValue) { mValue = aValue; }
12) public void Show( ) { System.out.println(mValue); }
13) }
上面的程序编译是否成功?如果编译出错,指出哪行出错,并说明理由;如果编译正确,运行结果是什么?
5、阅读下面的程序:
class test
{
public static void main(String[] args)
{
int i = 1;
int All = 0;
for (;i=10;i++)
{
if (i%6==0) break;
if(i%2==0) {i=i+2;continue;}
All = All + i;
}
System.out.println(All);
}
}
上面的程序编译是否成功?如果编译出错,指出哪行出错,并说明理由;如果编译正确,运行结果是什么?
6、阅读下面的程序,程序保存为Test.java:
1) public class Test
2) {
3) public static void main(String[] args)
4) {
5) int i = 100;
6) int j = 0;
7) boolean b = true;
8) while (b)
9) {
10) if (b||(i50)) b = false;
11) else b = true;
12) j=j+1;
13) i=i-1;
14) }
15) System.out.println(j);
16) }
17) }
上面的程序经编译,运行后输出的结果是什么?
7、阅读下面的程序:
1) public class test
2) {
3) public static void main(String argv[])
4) {
5) Bird b = new Bird();
6) b.Fly(3);
7) }
8) }
9) class Bird
10) {
11) static int Type = 2;
12) private void Fly(int an_Type)
13) {
14) Type = an_Type;
15) System.out.println("Flying..."+Type);
16) }
17) }
上面的程序编译是否成功?如果编译出错,指出哪行出错,并说明理由;如果编译正确,运行结果是什么?
8、阅读下面的程序:
1) abstract class Base{
2) abstract public void myfunc();
3) public void another(){
4) System.out.println("Another method");
5) }
6) }
7) public class Abs extends Base{
8) public static void main(String argv[]){
9) Base b = new Abs();
10) b.another();
11) }
12) public void myfunc(){
13) System.out.println("My Func");
14) }
15) public void another(){
16) myfunc();
17) }
18) }
以上程序经编译后,运行结果是什么?
9、阅读下面的程序:
1) class Super{
2) public int i=0;
3) public Super(){
4) i=1;
5) }
6) }
7) public class Sub extends Super{
8) public Sub(){
9) i=2;
10) }
11) public static void main(String args[]){
12) Sub s=new Sub();
13) System.out.println(s.i);
14) }
15) }
上面的程序经编译后,运行结果是什么?
10、阅读下面的程序,程序保存为Test.java:
1) public class Test {
2) public static void main(String[ ] args) {
3) int index=0;
4) while (index=100) {
5) index+=10;
6) if (index==40)
7) break;
8) System.out.println("The index is "+index);
9) }
10) }
11) }
上面的程序经编译,运行后输出的结果是什么?
五、问答题
1、 设int类型变量x和y分别初始化为3和100,下列语句的循环体共执行几次?执行完下列语句后x和y的值分别是多少?
(1) while(x=y) x=2*x;
(2) while(y/x5) if(y-x25) x=x+1; else y=y/x;
(3) do{x=2*x;} while(xy);
(4) do{x=y/x;y=y-x;}while(x=y);
(5) do{y=y/x-1; if(y=x) y=x;} while(y=1);
2、简述对象、类的概念。
3、简述封装、继承性和多态性的概念。
4、根据以下的设计要求编写java源代码。
类名: Circle
实例数据(均为private):
radius(double) //圆的半径
方法:
构造方法(没有参数,设置radius的值为10.0)
setRadius(有一个double参数,将radius的值设为这个新值),
getRadius (没有参数,返回radius的值)
sameSize(有一个参数,是另一个Circle对象的引用,如果两个Circle对象的radius的差小于0.001,则返回true)
5、下面的代码使用上题的Circle类,请回答下面的问题:
public class CircleTester {
public static void main(String[] args) {
Circle c1,c2,c3;
c1 = new Circle();
c2 = new Circle();
System.out.println(“are same is: “+c1.sameSize(c2));
c2.setRadius(20.0);
compare.reset();
System.out.println(“are same is: “+c1.sameSize(c2));
}
}
问题:
(1) 共创建了几个Circle对象?
(2) 程序运行的结果是什么?
6、假设已有一个ArrayMethods 类,包含以下的方法:
public static void replace(double[] a, int p, double v)
将数组a中下标为p的元素的值替换为v.
public static void fill(double[] a, int p, double v)
将数组a中的前p个元素用value值填充(即将数组a的前p个元素的值,设成v),如果数组的长度小于p,则全部元素都设成v
public static void display(double[] a)
在屏幕上显示数组a的内容
现在假设你在main()方法中已经声明了如下变量:
double[] array1={4.5, 6.0, 0.1, 2.2};
double[] array2;
double num1;
int pos=3;
要求对下面的3组语句,先回答是否合法(即没有编译错误),如果是合法的,请描述程序运行的效果,如果不合法,请说明理由.
1) num1 = array1[2];
ArrayMethods.replace(array1, pos, num1);
ArrayMethods.display(array1);
2) num1 = array1[0];
ArrayMethods.fill(array1, pos, num1);
ArrayMethods.display(array1);
3) num1 = array1[1];
array2=new double[num1];
ArrayMethods.display(array2);
六、编程题
1、分别利用for、while、do~while编写计算正整数n1到n2的累加和。
2、编写一个编程,给定一个t的值(t的值也可通过命令行输入),按下式计算y值并输出,要求分别写作if语句和switch语句。
t2-1 0≤t<1
t3-2•t-2 1≤t<3
y= t2-t•sint 3≤t<5
t+1 5≤t<7
t-1 其它
3、设计一个类TestArraySum,定义一个含有10个元素的int类型数组a,10个数组元素的值是11~20,再定义一个方法arraySum(int[] a),返回数组所有元素的和,最后用main方法实现在屏幕上输出数组a所有元素的和。
4、编写一个java程序Suansu.java,定义两个整型变量a和b,使用构造函数初始化a为10,b为5,并定义求出a与b的和(方法名为AddAB)、差(方法名为SubAB)、积(方法名为MultiAB)、商 (方法名为DivAB)的方法。
用另一个java程序TestSuansu.java测试Suansu.java定义的方法,并在屏幕上输出结果。
5、创建一个名为Rectangle的类来表示一个使用宽度和高度来改变量的矩形,矩形的宽度和高度由构造方法来确定。为Rectangle类创建下列方法:
getArea返回矩形的面积,要求长和高的范围为0~50;
getPerimeter返回矩形的周长;
Draw使用星号(*)作为描绘字符画出该矩形(假设宽度和高度为整数);
在另一个类TestRectangle中编写main方法来测试Rectangle类。
6、用面向对象的思想定义一个接口Area,其中包含一个计算面积的方法CalsulateArea(),然后设计MyCircle和MyRectangle两个类都实现这个接口中的方法CalsulateArea(),分别计算圆和矩形的面积,最后写出测试以上类和方法的程序。
7、创建一个Frame,有两个Button按钮和一个TextField,点击按钮,在TextField上显示Button信息。
8、创建下图的GUI程序(注意:不需要提供任何功能)。
9、编写一个文件拷贝的程序,将文件C:\test1.txt的内容拷贝到C:\test2.txt中。
10、编写一个程序,统计给定文件中每个字母出现的频率。
11、编写一个程序,统计给定文件中包含的单词数目,并按单词表的顺序显示统计结果。
12、用图形界面设计一个简单的计算器。
13、用图形界面实现简单的银行柜台业务,包含创建新帐户、取款、存款、查询帐户余额等业务。
相关问答
Q1: 谁有Java开发webservice 的完整实例?参考一下,谢谢啦!
java实现webservice实例
文章分类:Java编程
今天下午突然想研究下WEBSERVICEjava开发实例大全代码,从网上找了好多实例java开发实例大全代码,但很多写java开发实例大全代码的让人实在难以恭维,花了三个小时java开发实例大全代码的圈圈转后总算搞通了,其实也挺简单的,这里特别感谢这篇文章,总算让java开发实例大全代码我弄明白了,现在贴出我的实例步骤,感谢那个博主的同时,与大家共同分享。
一:
首先创建个WEB工程,然后: 网站下载Axis安装包.当然还依赖其他包的,我这里在附件里上传了所有应用到得包,方便大家。
二:
然后就写wsdd 文件(注:其实这里真的不用,可以跳过第二步)为了生成这个文件:server-config.wsdd
deploy.wsdd:
deployment xmlns="" xmlns:java="" target="_blank""
service name="HelloWorld" provider="java:RPC"
parameter name="className" value="HelloWorld"/
parameter name="allowedMethods" value="sayHello"/
/service
/deployment
在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF,命令:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
三:
可以自己写第二步中的文件,代码如下:
?xml version="1.0" encoding="UTF-8"?
deployment xmlns="" xmlns:java=""
globalConfiguration
parameter name="sendMultiRefs" value="true"/
parameter name="disablePrettyXML" value="true"/
parameter name="dotNetSoapEncFix" value="true"/
parameter name="enableNamespacePrefixOptimization" value="false"/
parameter name="sendXMLDeclaration" value="true"/
parameter name="sendXsiTypes" value="true"/
parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/
/globalConfiguration
handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/
service name="Login.jws" provider="java:RPC"
parameter name="className" value="server.SayHello"/
parameter name="scope" value="request"/
parameter name="allowedMethods" value="*"/
messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/
/service
transport name="http"
requestFlow
handler type="URLMapper"/
/requestFlow
/transport
/deployment
放到 WEB-INF 目录下 和web.xml一起,其中,WEB.XML可以直接从你下载的axis项目中拿来到自己工程就好,或者自己添加:
servlet
servlet-nameAxisServlet/servlet-name
servlet-classorg.apache.axis.transport.http.AxisServlet/servlet-class
/servlet
servlet-mapping
servlet-nameAxisServlet/servlet-name
url-pattern/services/*/url-pattern
/servlet-mapping
四:
服务端提供的方法:
package server;
public class SayHello {
public String getName(String name) {
return "hello====" + name;
}
}
五:
客户端访问服务端接口获得数据的方法:
package client;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TestClient {
public static void main(String[] args) throws Exception {
// 指出service所在URL
String endpoint = "";
// 创建一个服务(service)调用(call)
Service service = new Service();
Call call = (Call) service.createCall();// 通过service创建call对象
// 设置service所在URL
call.setTargetEndpointAddress(new java.net.URL(endpoint));
// 方法名(processService)与MyService.java方法名保持一致
call.setOperationName("getName");
// Object 数组封装了参数,参数为"This is Test!",调用processService(String arg)
String ret = (String) call.invoke(new Object[] { "继中" });
System.out.println(ret);
}
}
六:启动tomcat,先访问,看是否有方法显示,有显示,则代表服务端提供的接口可以成功访问了。
我的效果是这样:
And now... Some Services
•Login.jws (wsdl)
◦getName
七:
然后在本地跑客户端TestClient,就应该有结果啦,大家试试吧。
需要lib.jar可以到这里找
Q2: 用java语言自己开发一个集合类,包含的实例方法如下:向该集合中添加元素时,只能添加某一种类型的
下面的Test类就是一个集合类,它只能添加Student类型的对象,代码如下:
import java.util.Collection;
import java.util.Iterator;
public class Test implements CollectionStudent{
public static void main(String[] args){
Test t = new Test();
t.add(new Student());
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean contains(Object o) {
// TODO Auto-generated method stub
return false;
}
@Override
public IteratorStudent iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public Object[] toArray() {
// TODO Auto-generated method stub
return null;
}
@Override
public T T[] toArray(T[] a) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean add(Student e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean remove(Object o) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean containsAll(Collection? c) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean addAll(Collection? extends Student c) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean removeAll(Collection? c) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean retainAll(Collection? c) {
// TODO Auto-generated method stub
return false;
}
@Override
public void clear() {
// TODO Auto-generated method stub
}
}
class Student{
String stuId;
String name;
public Student(){
}
public String getStuId(){
return stuId;
}
public void setStuId(String stuId){
this.stuId = stuId;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
Q3: java写的用户登陆实例,用eclipse开发的具体步奏和代码
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.swing.*;public class Login extends JFrame{
JLabel user,passwd;
JTextField userput;
JPasswordField passput;
JButton denglu,tuichu;
public Login(){
super("用户登录");
Container c=getContentPane();
c.setLayout(null);
Font f=new Font("宋体",Font.PLAIN,12);
user=new JLabel("账号");
passwd=new JLabel("密码");
userput=new JTextField();
passput=new JPasswordField();
denglu=new JButton("登录");
denglu.setFont(f);
denglu.addActionListener(new NewAction());
tuichu=new JButton("退出");
tuichu.setFont(f);
tuichu.addActionListener(new NewAction());
user.setBounds(50,50,60,20);
userput.setBounds(110,50,150,20);
passwd.setBounds(50,80,60,20);
passput.setBounds(110,80,150,20);
denglu.setBounds(50,160,60,30);
tuichu.setBounds(200,160,60,30);
c.add(user);
c.add(userput);
c.add(passwd);
c.add(passput);
c.add(denglu);
c.add(tuichu);
setSize(350, 300);
setVisible(true);
}
class NewAction implements ActionListener{
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=CDM";
String user="sa";
String passwd="394513265";
java.sql.Connection con;
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con= DriverManager.getConnection(url,user,passwd);
}catch(Exception ep){
JOptionPane.showMessageDialog(null, "加载驱动失败!");
}
if(e.getSource()==denglu){
Find();
}
if(e.getSource()==tuichu){
dispose();
}
} public void Find(){
String lk="select * from login";
try{
Statement sql=con.createStatement();
ResultSet rs=sql.executeQuery(lk);
while(rs.next()){
if(rs.getString(1).equals(userput.getText()) rs.getString(2).equals(passput.getText()))
new MainClient();
else
JOptionPane.showMessageDialog(null, "用户名或密码错误");
}
rs.close();
}catch(SQLException p){
JOptionPane.showMessageDialog(null, p.getMessage());
}
}
}
public static void main(String[] args) {
Login l=new Login();
l.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
步骤就是建个工程 然后建个class
Q4: 计数器的java代码
Java技术与Java虚拟机中文JAVA技术网g0cVV+]
中文JAVA技术网I5Zz[ }'Og G6Y
说起Java,人们首先想到java开发实例大全代码的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们java开发实例大全代码的关系如下图所示:
[)|)k3b9M#\)w%Q{~r0中文JAVA技术网:cP+] _2tRtm*K
中文JAVA技术网yz;_Y0FB
图1 Java四个方面的关系
,YWx ^L |Q0运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示:
x[+DX0\:W-o@a0中文JAVA技术网"? c3Y6bj-_
中文JAVA技术网P @+O3lf_pJ b
中文JAVA技术网5h:OY TyL2\|Z
在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器java开发实例大全代码;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API, 利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。
h6l-v;HV1SvYO0中文JAVA技术网-G5cAK(e w}
那么到底什么是Java虚拟机(JVM)呢?通常java开发实例大全代码我们谈论JVM时,java开发实例大全代码我们的意思可能是:中文JAVA技术网,T,Y5d(B5r
中文JAVA技术网yWv~s;J
对JVM规范的的比较抽象的说明;
b0r[/o_k+p0对JVM的具体实现;中文JAVA技术网Xdt8M1sP T_"_s
在程序运行期间所生成的一个JVM实例。中文JAVA技术网H k0g,~ hO\
中文JAVA技术网C3@ w6O-a
对JVM规范的的抽象说明是一些概念的集合,它们已经在书《The Java Virtual Machine Specification》(《Java虚拟机规范》)中被详细地描述了;对JVM的具体实现要么是软件,要么是软件和硬件的组合,它已经被许多生产厂商所实现,并存在于多种平台之上;运行Java程序的任务由JVM的运行期实例单个承担。在本文中我们所讨论的Java虚拟机(JVM)主要针对第三种情况而言。它可以被看成一个想象中的机器,在实际的计算机上通过软件模拟来实现,有自己想象中的硬件,如处理器、堆栈、寄存器等,还有自己相应的指令系统。中文JAVA技术网nC/D IHP,|
A)R-DFw o2X0JVM在它的生存周期中有一个明确的任务,那就是运行Java程序,因此当Java程序启动的时候,就产生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了。下面我们从JVM的体系结构和它的运行过程这两个方面来对它进行比较深入的研究。
Z6?gXm!~0Java虚拟机的体系结构
2XFZ@"I I,\0
e-i'_;P X a0刚才已经提到,JVM可以由不同的厂商来实现。由于厂商的不同必然导致JVM在实现上的一些不同,然而JVM还是可以实现跨平台的特性,这就要归功于设计JVM时的体系结构了。中文JAVA技术网{ v2TtMlG?"]*N
中文JAVA技术网,HK3YQN k
我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现JVM时它内部的体系结构,更重要的是提供了一种方式,用于严格定义实现时的外部行为。每个JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分,这几个部分和类装载机制与运行引擎机制一起组成的体系结构图为:中文JAVA技术网BW0EZCI
2o\d oz0中文JAVA技术网%K1Hl:f ~(@Y(U
图3 JVM的体系结构中文JAVA技术网0P/b(jt U$x
7{F*d8f7ySt:Q0JVM的每个实例都有一个它自己的方法域和一个堆,运行于JVM内的所有的线程都共享这些区域;当虚拟机装载类文件的时候,它解析其中的二进制数据所包含的类信息,并把它们放到方法域中;当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线程创建的时候,都会拥有自己的程序计数器和Java栈,其中程序计数器中的值指向下一条即将被执行的指令,线程的Java栈则存储为该线程调用Java方法的状态;本地方法调用的状态被存储在本地方法栈,该方法栈依赖于具体的实现。中文JAVA技术网 t?!Pz!B]
"^x1MT5qj0下面分别对这几个部分进行说明。
/}C2v7b:]%vo[|0中文JAVA技术网'z/@1RG7[E1`8B
执行引擎处于JVM的核心位置,在Java虚拟机规范中,它的行为是由指令集所决定的。尽管对于每条指令,规范很详细地说明了当JVM执行字节码遇到指令时,它的实现应该做什么,但对于怎么做却言之甚少。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。中文JAVA技术网 ^sH2X*b,Z
q3[ OT`z"M4V0Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。
P.R.Uxbfc0
o"o qq9_0虚拟机的内层循环的执行过程如下:中文JAVA技术网3Hn8B r,xE
MjHj(zBG t"m P0do{
l$Iz V!M9[0取一个操作符字节;中文JAVA技术网7[?3o?,v A|3b+O R
根据操作符的值执行一个动作;
I(^e)G)Hf6`0}while(程序未结束)中文JAVA技术网y}0J/|:so
中文JAVA技术网c|%L(ud
由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:
0H.w`wb}.X0中文JAVA技术网y{X;n.u4PT+e)D7\E
第一个字节*256+第二个字节字节码。中文JAVA技术网"V[]J!_0v+D
5^t6E[3aW






