文档库 最新最全的文档下载
当前位置:文档库 › java练习题(含答案)

java练习题(含答案)

java练习题(含答案)
java练习题(含答案)

1.编写程序,用数组实现乘法小九九的存储和输出。【提示:采用多个一维数组。】

public class Multipation {

public static void main(String[] args) {

// TODO Auto-generated method stub

int x[][]=new int[9][9];

for(int i=0;i<9;i++){

for(int j=0;j<9;j++){

if(i>=j){

int m=i+1;

int n=j+1;

x[i][j]=m*n;

System.out.print(m+"*"+n+"="+x[i][j]);

}

}

System.out.println();

}

}

}

2. 定义一个类Student,属性为学号、姓名和成绩;方法为增加记录SetRecord和得到记录GetRecord。SetRecord给出学号、姓名和成绩的赋值,GetRecord通过学号得到考生的成绩。public class Student {

/**

*@param args

*/

private int ID;

private String name;

private float score;

public void SetRecord(int ID,String name,float score){

this.ID=ID;

https://www.wendangku.net/doc/e04460031.html,=name;

this.score=score;

}

public float getRecord(int ID){

if(ID==this.ID)

return this.score;

else

return -1;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Student s=new Student();

s.SetRecord(0,"alex",100);

float Sco=s.getRecord(0);

System.out.print(Sco);

}

}

3.给出上题中设计类的构造函数,要求初始化一条记录(学号、姓名、成绩)。

4.public class Student {

5.

6./**

7.*@param args

8.*/

9.private int ID;

10.private String name;

11.private float score;

12.

13.Student(int ID,String name,float score){

14.this.ID=0;

https://www.wendangku.net/doc/e04460031.html,="666";

16.this.score=65;

17.}

18.public void SetRecord(int ID,String name,float score){

19.this.ID=ID;

https://www.wendangku.net/doc/e04460031.html,=name;

21.this.score=score;

22.}

23.public float getRecord(int ID){

24.if(ID==this.ID)

25.return this.score;

26.else

27.return -1;

28.}

29.

30.public static void main(String[] args) {

31.// TODO Auto-generated method stub

32.Student s=new Student(0,"sdfs",12);

33.//s.SetRecord(0,"alex",100);

34.float Sco=s.getRecord(0);

35.System.out.print(Sco);

36.}

37.}

4. 编写程序,测试字符串“你好,欢迎来到Java世界”的长度,将字符串的长度转换成字符串进行输出,并对其中的“Java”四个字母进行截取,输出截取字母以及它在字符串中的位置。public class StringTest {

/**

*@param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String str="你好,欢迎来到Java世界";

int length=str.length();

char [] stringArr = str.toCharArray();

//System.out.print(stringArr);

for(int i=0;i

//System.out.print(stringArr[i]);

//System.out.print(stringArr[0]);

if('J'==stringArr[i]){

System.out.print(i);

}

}

}

}

1. 自己设计一个坐标类,能提供以下方法如求当前坐标和其他坐标之间的距离等方

法,要求所有变量为私有变量,并提供两个构造函数。

public class XYdistance {

private int x;

private int y;

XYdistance(){

setX(0);

setY(0);

}

public void setX(int x) {

this.x = x;

}

public int getX() {

return x;

}

public void setY(int y) {

this.y = y;

}

public int getY() {

return y;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

XYdistance m_1= new XYdistance();

m_1.setX(10);

m_1.setY(10);

XYdistance m_2= new XYdistance();

double

distance=(m_1.getX()-m_2.getX())*(m_1.getX()-m_2.getX())+(m_1.getY()-m_2.getY())*(m_1.getY()-m_2.getY());

double result=Math.sqrt(distance);

System.out.println(result);

}

}

编写使用静态变量统计一个类产生的实例对象的个数的程序?public class Static {

private static int number;

public Static(){

//number=number+1;

++number;

//System.out.println(++number);

}

public static void main(String[] args) { // TODO Auto-generated method stub

new Static();

//m_1.Static();

System.out.println(Static.number);

}

}

创建string对象过程的内存分配:

常量池(Constant Pool):指的是在编译期被确定,并被保存在已编译的.class 文件中的一些数据。JVM虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(String,Integer和Floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。

1、String s = "abc";

创建过程分析:在class文件被JVM装载到内存中,JVM会创建一块String Pool (String缓冲池)。当执行String s = “abc”;时,JVM首先在String Pool 中查看是否存在字符串对象“abc”(如何查看呢?用equals()方法判断),如果已存在该对象,则不用创建新的字符串对象“abc”,而直接使用String Pool 中已存在的对象“abc”,然后将引用s指向该对象;如果不存在该对象,则先在String Pool中创建一个新的字符串对象“abc”,然后将引用s指向String Pool中创建的新对象。

注意:使用“字符串常量”引号创建的字符串对象时,在编译期就已经确定将该对象存储到String Pool中了。因此,String s = “abc”只会在编译期,在String Pool中创建一个对象。

例如:

Java代码

1.String s1 = "abc";

2.String s2 = "abc";

3.System.out.println(s1 == s2);//true

结果说明:JVM创建了两个引用str1和str2,但在String Pool中只创建了一个对象,而且两个引用都指向了同一个对象。

2、String s = new String("abc");

创建过程分析:当执行String s = new String(“abc”);时,JVM首先在String Pool中查看是否存在字符串对象“abc”,如果不存在该对象,则先在String Pool中创建一个新的字符串对象“abc”,然后执行new String(“abc”)构造方法,在Heap里又创建一个新的字符串对象“abc”(new出来的对象都放在Heap 里面),并将引用s指向Heap中创建的新对象;如果已存在该对象,则不用创建新的字符串对象“abc”,而直接使用String Pool中已存在的对象“abc”,然后执行new String(“abc”)构造方法,在Heap里又创建一个新的字符串对象“abc”,并将引用s指向Heap中创建的新对象。

注意:使用new String(“”)创建的字符串对象时,会在运行期创建新对象存储到Heap中。因此,new String(“abc”)创建字符串对象时,会创建2个对象,编译期在String Pool中创建一个,运行时Heap中创建一个。

这里使用了

Java代码

1.public String(String original)

这个构造方法,作用:初始化一个新创建的String对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。

由于Sring类是不可变的,因而不必使用该构造方法,除非需要original的显式副本。

例如:

Java代码

1.String s1 = new String("abc");

2.String s2 = new String("abc");

3.System.out.println(s1 == s2);//false

结果说明:只要是用new()来新建对象的,都会在堆(Heap)中创建,而且其字符串是单独存值的,即使与String Pool中的数据相同,也不会与String Pool 中的数据共享。

例程1:

Java代码

1.String s1 = "abcdef";

2.String s2 = "abcdef";

3.String s3 = "abc"+"def";//编译期自动优化为

String s3 = "abcdef";

4.System.out.println(s1 == s2);

5.System.out.println(s1 == s3);

6.System.out.println(s2 == s3);

运行结果:

true

true

true

结果说明:字符串常量生成的字符串对象在String Pool中只有一个拷贝,且它

是在编译期就被确定了,所以“s1 == s2”;“abc”和“def”都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己也肯定是字符串常量(它在编译期就被解析为一个字符串对象了,即class文件中就已经存在“abcdef”),所以在字符串生成字符串对象时,s3也是String Pool中“abcdef”的一个引用。故JVM对于字符串常量的"+"号连接,在程序编译期,JVM就将常量字符串的"+"连接优化为连接后的值。

例程2:

Java代码

1.String s1 = "abc";

2.String s2 = "def";

3.String s3 = "abcdef";

4.String s4 = "abc"+"def";

5.String s5 = s1 + "def";

6.String s6 = "abc"+s2;

7.String s7 = s1 + s2;

8.System.out.println(s3 == s4);

9.System.out.println(s3 == s5);

10.System.out.println(s3 == s6);

11.System.out.println(s3 == s7);

运行结果如下:

true

false

false

false

结果说明:JVM对于有字符串引用存在的字符串"+"连接中,而引用的值在程序编译期是无法确定的,即s1 + “def”无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给s5。

例程3:

Java代码

1.final String s1 = "abc";

2.String s2 = "def";

3.String s3 = "abcdef";

4.String s4 = "abc"+"def";

5.String s5 = s1 + "def";

6.String s6 = "abc"+s2;

7.String s7 = s1 + s2;

8.System.out.println(s3 == s4);

9.System.out.println(s3 == s5);

10.System.out.println(s3 == s6);

11.System.out.println(s3 == s7);

运行结果如下:

true

true

false

false

例程4:

Java代码

1.final String s1 = "abc";

2.final String s2 = "def";

3.String s3 = "abcdef";

4.String s4 = "abc"+"def";

5.String s5 = s1 + "def";

6.String s6 = "abc"+s2;

7.String s7 = s1 + s2;

8.System.out.println(s3 == s4);

9.System.out.println(s3 == s5);

10.System.out.println(s3 == s6);

11.System.out.println(s3 == s7);

运行结果如下:

true

true

true

true

结果说明:例程3和例程4与例程2的区别是,例程3在字符串s1前加了final 修饰,例程4在字符串s1和s2前都加了final修饰。对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。所以此时的s1 + “def”和"abc" + "def"效果是一样的。接着后面两个含引用的字符串连接,JVM会进行相同的处理。故上面程序后面三个的结果为true。

例程5:

Java代码

1.public static void main(String args[]){

2.String s1 = "abc";

3.final String s2 = getDef();

4.String s3 = "abcdef";

5.String s4 = "abc"+s2;

6.String s5 = s1 + s2;

7.System.out.println(s3 == s4);

8.System.out.println(s3 == s5);

9.}

Java代码

1.private static String getDef(){

2.return "def";

3.}

程序运行结果如下:

false

false

结果说明:JVM对于方法调用给字符串引用赋值的情况,引用指向字符串的值在编译期是无法确定的,只有在程序运行调用方法后,将方法的返回值“def”和“abc”动态连接并分配新地址赋值给s4,所以上述程序的结果都为false。

通过以上的例子可知:

Java代码

1.String s = "a" + "b" + "c";

等价于:

Java代码

1.String s = "abc";

编译期,直接优化,进行常量连接。

对于:

Java代码

1.String a = "a";

2.String b = "b";

3.String c = "c";

4.String s = a + b + c;

就不等价于:等价于:

Java代码

1.String s = "abc";

最终结果等于:

Java代码

1.StringBuilder builder = new StringBuilder ();

2.builder.append(a);

3.builder.append(b);

4.builder.append(c);

5.String s = builder.toString();

去看StringBuilder的toString()方法:

Java代码

1.public String toString() {

2.// Create a copy, don't share the array

3.return new String(value, 0, count);

4.}

可以发现是通过new String(..)返回了一个String对象,也就是说在堆中创建

了对象。这时候会不会在池中出现"abc"这个对象呢?(question还没解决)

生成String s的过程中,编译器使用sb执行的过程:创建一个StringBuffer

对象,使用append()向此StringBuffer对象直接添加新的字符串(而不是每次

制作一个新的副本)。

对于String c = "c";String s = "a" + "b" + c;,编译器将会先将"a" + "b"

作为编译时常量,优化生成成字面常量"ab" ,然后生成一个StringBuilder对象,接着调用两次 append()方法,即:

String s = new Builder().append("ab").append(c) .toString();

对于String a = "a";String s = a + "b" + "c";,编译器分析a为引用变量,后面的"b" + "c"就不会作为编译时常量来运算了。相当于执行:

String s = new Builder().append(a).append("b") .append("c") .toString();

对于String b = "b";String s = "a" + b + "c";],这种形式的就没办法优化了,直接生成StringBuilder对象,然后调用三次 append()方法,即:

String s = new Builder().append("a").append(b) .append("c") .toString();

接着,我们再看以下代码:

Java代码

1.String str1 = "abc";//是字符串常量,它在编译期被确定,放在常

量池中(共享内容值)

2.//new String()创建的字符串不放入常量池中

3.String str2 =new String("abc");//不是字符串常量,不在编译期确

定(不共享内容值)

Java代码

1.String str1 = new String("abc");

2.String str2 = "abc";

3.System.out.println(str1==str2); //false

创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。

Java代码

1.String str1 = "abc";

2.String str2 = new String("abc");

3.System.out.println(str1==str2); //false

创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。

接下来我们再来看看intern()方法,它的定义如下:

Java代码

1.public native String intern();

这是一个本地方法。在调用这个方法时,JAVA虚拟机首先检查String Pool中是否已经存在与该对象值相等对象存在,如果有则返回字符串池中对象的引用;如果没有,则先在String Pool中创建一个相同值的String对象,然后再将它的引用返回。

例程6:

Java代码

1.public class TestString{

2.public static void main(String args[]){

3.

4.String s1 = new String("abc");//语句1

5.String s2 = "abc";//语句2

6.String s3 = new String("abc");//语句3

7.

8.System.out.println(s1 == s2);//语句4

9.System.out.println(s1 == s3);//语句5

10. System.out.println(s2 == s3);//语句6

11.

12. System.out.println(s1 == s1.intern());//语句

7

13. System.out.println(s2 == s2.intern());//语句

8

14. System.out.println(s1.intern() == s2.intern()

);//语句9

15.

16. String hello = "hello";//语句10

17. String hel = "hel";//语句11

18. String lo = "lo";//语句12

19.

20. System.out.println(hello == "hello");//语句

13

21. System.out.println(hello == "hel" + "lo");/

/语句14

22. System.out.println(hello == "hel" + lo);//

语句15

23. System.out.println(hello == hel + lo);//语

句16

24. }

25.}

问题1:当执行完语句(1)时,在内存里面生成几个对象?它们是什么?在什么地方?

当执行完语句(1)时,在内存里面创建了两个对象,它们的内容分别都是abc,分别在String Pool(常量池)和Heap(堆)里。其字符串的创建过程如下:首先在String Pool里面查找查找是否有 "abc",如果有就直接使用,但这是本程序的第一条语句,故不存在一个对象"abc",所以要在String Pool中生成一个对象"abc",接下来,执行new String("abc")构造方法,new出来的对象都放在Heap 里面。在Heap里又创建了一个"abc"的对象。这时内存里就有两个对象了,一个在String Pool 里面,一个在Heap里面。

问题2:当执行完语句(2)时,在内存里面一共有几个对象?它们是什么?在什么地方?

当执行完语句(2)时,在内存里面一个对象也没有创建。当我们定义语句(2)的时候,如果我们用字符串的常量值(字面值)给s2赋值的话,那么首先JVM还是从

String Pool里面去查找有没有内容为abc的这样一个对象存在,我们发现当我们执行完语句(1)的时候,StringPool里面已经存在了内容为abc的对象,那么就不会再在String Pool里面去生成内容为abc的字符串对象了。而是会使用已经存在String Pool里面的内容为abc的字符串对象,并且会将s2这个引用指向String Pool里面的内容为abc的字符串对象,s2存放的是String Pool里面的内容为abc的字符串对像的地址。也就是说当你使用String s2 = "abc",即使用字符串常量("abc")给定义的引用(str2)赋值的话,那么它首先是在String Pool里面去找有没有内容为abc的字符串对象存在,如果有的话,就不用创建新的对象,直接引用String Pool里面已经存在的对象;如果没有的话,就在 String Pool里面去创建一个新的对象,接着将引用指向这个新创建的对象。所以,当执行完语句(2)时内存里面一共有2个对象,它们的内容分别都是abc,在String Pool里面一个内容abc的对象,在Heap里面有一个内容为abc 的对象。

问题3:当执行完语句(3)时,在内存里面一共有几个对象?它们是什么?在什么地方?

当执行完语句(3)时,其执行过程是这样的:它首先在String Pool里面去查找有没有内容为abc的字符串对象存在,发现有这个对象存在,它就不去创建一个新的对象。接着执行new...,只要在java里面有关键字new存在,不管内容是否相同,都表示它将生成一个新的对象,new多少次,就生成多少个对象,而且新生成的对象都是在Heap里面,所以它会在Heap里面生成一个内容为abc

的对象,并且将它的地址赋给了引用s3,s3就指向刚在Heap里面生成的内容为abc的对象。所以,当执行完语句(3)时,内存里面一共有3个对象,其中包含了在String Pool里面一个内容为abc的字符串对象和在Heap里面包含了两个内容为abc的字符串对象。

问题4:当执行完语句(4)(5)(6)后,它们的结果分别是什么?

在java里面,对象用"=="永远比较的是两个对象的内存地址,换句话说,是比较"=="左右两边的两个引用是否指向同一个对象。对于java里面的8种原生数据类型来说,"=="比较的是它们的字面值是不是一样的;对应用类型来说,比较的是它们的内存地址是不是一样的。在语句(1)(2)(3)中,由于s1、s2、s3指向不同的对象,它们的内存地址就不一样,因此可以说当执行完语句(4)(5)(6),它们返回的结果都是false。

问题5:当执行完语句(7)(8)(9)后,它们的结果分别是什么?

首先,s1这个对象指向的是堆中第一次new...生成的对象,当调用 intern 方法时,如果String Pool已经包含一个等于此 String 对象的字符串(该对象由equals(Object)方法确定),则返回指向String Pool中的字符串对象的引用。因为String Pool中有内容为abc的对象,所以s1.intern()返回的是String Pool中的内容为abc的字符串对象的内存地址,而s1却是指向Heap上内容为abc的字符串对象的引用。因而,两个引用指向的对象不同,所以,s1 ==

s1.intern() 为false,即语句(7)结果为false。

对于s2.intern(),它还是会首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的地址赋给s2.intern()方法的返回值。因为s2和s2.intern()方法的返回值指向的是同一个对象,所以,s2 == s2.intern()的结果为true,,即语句(8)结果为true。

对于s1.intern(),它首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的赋给s1.intern()方法的返回值。对于s2.intern(),首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的地址赋给s2.intern()方法的返回值。因为两者返回的地址都指向同一个对象,所以,s1.intern() == s2.intern()的结果为true,,即是语句(9)结果为true。

因此,当执行完语句(7)(8)(9)后,它们的结果分别是false、true、true。

问题6:当执行完语句(13)(14) (15)(16)后,它们的结果分别是什么?

hello == "hello"引用hello指向的对象就是String Pool中的“hello”,即语句(13)的结果为true。

hello == "hel" + "lo"当加号两边都是常量值时,就会组成一个新的常量值"hello"在String Pool里面,如果String Pool已经有相同内容的就不会再创建,则直接返回String Pool里面的内容为"hello"的字符串对象的内存地址,所以,hello == "hel" + "lo"结果为true。

hello =="hel" + lo 当加号两边有一个不是常量值,会在堆里面创建一个新的"hello"对象,一个在String Pool中,一个在Heap中,故输出false 。

hel + lo 同上,输出false。

因此,当执行完语句(7)(8)(9)后,它们的结果分别是true、true、false、false。

例程7:

Java代码

1.String s1 = "abc";

2.String s2 = new String("abc");

3.String s3 = new String("abc");

4.s2.intern();//虽然执行了s2.intern(),但它的返回值没有赋给

s2

5.s3 = s3.intern();//把String Pool中“abc”的引用赋给s3

6.System.out.println(s1 == s2);

7.System.out.println(s1 == s2.intern());

8.System.out.println(s1 == s3);

运行结果如下:

false

true

true

结果说明:因为s2.intern()只是执行了,而没有把String Pool中的“abc”的地址赋给s2,所以s1还是指向String Pool中的“abc”,s2则指向Heap 中的“abc”,对于s1 == s2,返回值为false;对于s1 == s2.intern(),其中s2.intern()的返回值为指向String Pool中“abc”的地址,故s2.intern()与s1指向同一个对象,因而返回true;因为s3 = s3.intern()把String Pool 中的“abc”的地址赋给了s3,此时s1和s3指向的是同一对象,即String Pool 中的“abc“,因而返回true。

例程8:

Java代码

1.String s1 = "abc";

2.String s2 = new String("abc");

3.String s3 = "a" + new String("bc");

4.System.out.println(s1 == s2);

5.System.out.println(s1 == s3);

6.System.out.println(s2 == s3);

运行结果如下:

false

false

false

结果说明:

s1指向String Pool中的字符串对象“abc”,编译期确定;

s2指向Heap中的字符串对象“abc”,运行期确定;

s3指向Heap中的另一个字符串对象“abc”,运行期确定。

注意:String s3 = "a" + new String("bc");等价于

String s3 = new StringBuilder().append("a").append(new

String("bc")).toString();

思考:String s = "a" + new String("b") + "c";产生了那几个对象?

解:等价于String s = new StringBuilder().append("a").append(new String("b")).append("c").toString(),会在String Pool中产生"a"、"b"、"c"三个对象,在Heap中产生"b"、"abc"两个个对象。一共5个字符串对象。

例程9:

Java代码

1.String s1 = "Hello";

2.s1 = "Java";

3.String s2 = "Hello";

4.String s3 = new String("Hello");

5.System.out.println(s1 == s2);

6.System.out.println(s2 == s3);

运行结果如下:

false

false

分析这段程序的执行过程:

首先在加载Java程序时,JVM会创建一片的内存空间(String Pool)专门存入string对象。

String s1 = "Hello",现在栈中创建一个字符串引用s1,然后JVM会在String Pool中查找是否存在"Hello",如果存在,则直接使用它,将其地址赋给s1,如果不存在(这时String Pool中显然不存在"Hello"),则在String Pool中创建"Hello",并将其地址赋给s1。

s1 = "Java",JVM会在String Pool中查找是否存在"Java",如果存在,则直接使用它,将其地址赋给s1,如果不存在(这时String Pool中显然不存在"Java"),则在String Pool中创建"Java",并将其地址赋给s1。而原来的字符串对象"Hello"仍然在String Pool中,没有消失,因为String对象的值是不能被修改的。这里只是改变了引用的值即引用指向的对象的地址,而没有改变它所引用的对象。

String s2 = "Hello",JVM会在String Pool里查看有没有字符串"Hello",若有,则返回它的地址给s2,否则,创建新的String对象"Hello",放到String Pool里。这里由于"Hello"对象已经创建,并存在于String Pool中,因而不需要重新创建String对象"Hello"。此时s1指向String Pool中的"Java",s2指向String Pool中的"Hello",故s1 == s2的值为false。

String s3=String("Hello"),JVM会在String Pool里查看有没有字符串"Hello",若有,直接执行new操作,若没有,则先要在String Pool中创建"Hello",然后执行new操作,由于遇到了new,还会在Heap上(不是String Pool 里)创建string对象"Hello",并将Heap上的"Hello"对象的地址赋给引用s3。所以s2 == s3将返回false,因为s2和s3不是引用同一个对象。

以上小结如理解有误,希望各位高手指教!

写代码验证静态代码块被自动执行,就算产生了类的多个实例对象,但其中的静态代码块只被执行了一次。

class Parent {

static String name = "hello";

{

System.out.println("parent block");

}

static {

System.out.println("parent static block");

}

public Parent() {

System.out.println("parent constructor");

}

}

class Child extends Parent {

static String childName = "hello";

{

System.out.println("child block");

}

static {

System.out.println("child static block");

}

public Child() {

System.out.println("child constructor");

}

}

public class TextStatic {

public static void main(String[] args) {

// TODO Auto-generated method stub

new Child();// 语句(*)

new Child();

}

运行结果:

parent static block

child static block

parent block

parent constructor

child block

child constructor

parent block

parent constructor

child block

child constructor

分析:当执行new Child()时,它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后,接着去执行子类(自己这个类)里面的静态代码块,当子类的静态代码块执行完毕之后,它接着又去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法,这个就是一个对象的初始化顺序。

总结:

对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

java基础笔试测试题与答案

Java 一章至五章考试 一. 填空题(8 分) 1. 面向对象的三大原则是( 封装),( 继承) 和( 多态).2 分 2. 如果想在对象实例化的同时就初始化成员属性,则使用( 构造函数).2 分 3. ( 实体) 方法和( 构造) 方法不能修饰为abstract ?2分 二.选择题(60 分) 1) 在Java 语言中,下列(a,d )是不满足命名规范的变量名。(选择二项) a) 姓名 b) $Name c) _instanceof d) instanceof 2) 下列Java 代码片段的输出结果是( a ) 。 char c='a'; int i=c; float f=i; byte b=(byte)c; System.out.println(c+","+i+","+f+","+b); a) 编译错误 b) a,97,97,97 c) a,97,97.0,97 d) a,97,97.0f,97 3) 下列Java 代码中,空白处的代码是(b,c )。( 选择两项) public interface Fee{ public float calLabFee(float unitPrice, float time); } public class FeeImpl implements Fee { public float calLabFee(float unitPrice, float time){ return unitPrice * time; } } public class FeeInterfaceTest { public static void main(String[] args){ ________________ Float labFee = fee.calLabFee(400.00,5); } }

Java基础测试题(答案)

1. 有以下程序片段,下列哪个选项不能插入到行1。( D ) 1. 2.public class Interesting{ 3.//do sth 4. } (只能有一个public修饰的class) A、import java.awt.*; B、package mypackage; C、class OtherClass{ } D、public class MyClass{ } 2. 以下哪项是接口的正确定义?( B D ) A、interface B { void print(){};} (接口里的方法都是抽象的,不能有方法体) B、abstract interface B { void print() ;} C、abstract interface B extends A1,A2 //A1、A2为已定义的接口 { abstract void print(){ };} (同上) D、interface B { void print();} 1.接口可以声明为public(公共)或默认的访问权限。接口隐含表明是抽象的(abstract)的。 2.接口的方法默认即为public(公共)且是abstract(抽象)的. 3.接口中的变量默认即为public(公共), static(静态) and final(最终的)。 接口声明编译器如何解释呢 public interface Searchable {}public abstract interface Searchable {} abstract interface Searchable {}abstract interface Searchable {} interface Searchable {}abstract interface Searchable {}

JAVA程序设计期末考试题(多套含答案)

《JA V A程序设计》期末考试试题(五) 一、单选题 1、当某一线程正处于休眠状态,而另一个线程用Thread 类中的interrupt() 方法中断它时,抛出的异常类型是()。 A) IOException B) RuntimeException C) InterruptedException D) ClassNotFoundException 2、下面的程序段的功能是( )。 File file1=new File("d:\\xxx\\yyy\\zzz"); file1.mkdirs(); A)在当前目录下生成子目录:\xxx\yyy\zzz B)生成目录:e:\xxx\yyy\zzz C)在当前目录下生成文件xxx.yyy.zzz D)以上说法都不对 3、应用程序的main方法中有以下语句,则输出的结果是( )。 String s = "xxxxxxxxxxxxxxx#123#456#zzzzz"; int n = s.indexOf("#"); int k = s.indexOf("#", n+1); String s2 = s.substring(n+1, k); System.out.println(s2); A) 123456 B) 123 C) xxxxxxxxxxxxxxx D) zzzzz 4、关于下面的程序Test.java说法正确的是( )。 public class Test { String x="1"; int y; public static void main(String args[]) { int z=2; System.out.println(x+y+z); } } A)3 B)102 C) 12 D)程序有编译错误 5、应用程序的main方法中有以下语句,则输出的结果是( )。

java模拟试题附答案(一)

scjp模拟试题(一) Question No: 1 1.public class test ( 2. public static void main (String args[]) { 3. int i = 0xFFFFFFF1; 4. int j = ~i; 5. 6. } 7. ) What is the decimal value of j at line 5? A. 0 B. 1 C. 14 D. –15 E. An error at line 3 causes compilation to fail. F. An error at line 4 causes compilation to fail. 答案: C Question No: 2 Given: Integer i = new Integer (42); Long 1 = new Long (42); Double d = new Double (42.0); Which two expressions evaluate to True? (Choose Two) A. (i ==1) B. (i == d) C. (d == 1) D. (i.equals (d))

E. (d.equals (i)) F. (i.equals (42)) 答案: D, E Question No: 3 Exhibit : 1. public class test ( 2. private static int j = 0; 3. 4. private static boolean methodB(int k) ( 5. j += k; 6. return true; 6. ) 7. 8. public static void methodA(int i) { 9. boolean b: 10. b = i < 10 | methodB (4); 11. b = i < 10 || methodB (8); 12. } 13. 14. public static void main (String args[] ) ( 15. methodA (0); 16. system.out.printIn(j); 17. ) 18. ) What is the result? A. The program prints “0” B. The program prints “4” C. The program prints “8”

100道Java基础测试题

Java基础测试题 不定项选择题 1、面向对象的三大特征是() A) 封装B) 继承C) 多态D) 线性 2、变量命名规范说法正确的是() A) 变量由英文字母、下划线、数字、$符号组成 B) 变量不能以数字作为开头 C) A和a在Java中代表同一个变量 D) 不同类型的变量,可以起相同的名字 3、i的值为10,表达式(i++)+(i--)的值为() A) 21B) 20 C) 19 D) 18 4、下面哪些定义变量的语句是正确的?() A) int i = 'A'; B) float f = 1.23; C) byte b = (byte)128; D) int c[5][5] = new int[ ][ ]; 5、以下代码的执行结果是() int a = 1; bool ean m = a%2 = = 1; if(m = false){ System.out.println("false"); }else{ System.out.println("true"); } A) false B) true C) 编译不通过 6、以下程序段中,哪个选项不能插入到第二行?() A)class Demo2 { } B) import java.util.*; C) public static void main(String args[ ]) { } D) package com; E) public class Demo2 { } 7、下面有关Java循环结构的描述正确的是() A) for循环体语句中,可以包含多条语句,但要用大括号括起来 B) for循环和do...while循环都是先执行循环体语句,后进行条件判断 C) continue和break只能用于循环结构中 D) 增强for循环遍历数组时不需要知道数组的长度,但不能实现与下标相关的操作 8、switch选择语句是多分支选择语句,只能处理等值条件判断的情况。在jdk1.7中,switch中的表达式可以是以下哪种类型() A)int B)char C)double D) float E)String F) short

java期末考试试题及答案

1.谈谈final, finally, finalize的区别。 final关键字: a) 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。 b) 将变量或方法声明为final,可以保证它们在使用中不被改变。 c) 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。 d) 被声明为final的方法也同样只能使用,不能重载。 finally关键字:在异常处理时提供finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch 子句就会执行,然后控制就会进入finally 块。 finalize:方法名,不是关键字。Java技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object 类中定义的,因此所有的类都继承了它。子类覆盖finalize() 方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。 2.GC是什么? 为什么要有GC? GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 3.Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 写程序Math.round(11.5) = 12 Math.round(-11.5) = -11 4.给我一个你最常见到的runtime exception ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

java模拟试卷3与答案

复习题 3 一、选择题 1. JDK 提供的编译器是(B)。 (A ) java.exe(B ) javac.exe (C) javap.exe( D) javaw.exe 2.以下作为 Java 程序入口的 main 方法声明正确的( C)。 (A ) public void main(String args[]) (B ) public int main(String args[]) (C) public static void main(String args[]) (D ) public static int main(String args[]) 3.以下标识符错误的是( C )。 (A )Public( B)张三( C) class(D ) main 4.java 中定义字符串 String s= ”pzhu”,下面操作可以取得字符串长度的是( A )。 (A ) s.length()( B) s.length( C)s.size()( D) length(s) 5.如下定义数组,操作正确的是(D)。 int a[]={1,2,3}; (A ) a[3]=100(B ) a[0].length( C)a++( D) a.length 6.如下定义二维数组操作错误的是()。 int a[][]={{1,2},{3}}; (A ) a[0][1]=200( B) a[0].length( C) a[1][1]=100( D) a.length 7. 以下数据类型存储空间最大的是(B)。 (A ) byte( B) long(C) float(D ) char 8. 面向对象的三大特性,不包括如下( A)。 (A )异常( B)封装(C)继承(D )多态 9、关于类的定义以下说法错误(B)。 (A )类定义使用class 关键字( B)每个类中必须有一个main 方法 (C)一个包可以包含多个类( D) java 中所有类都是Object 类的子类 10. 关于构造方法以下说法错误的是(D)。 (A)构造方法名必须与类名一致(B)构造方法可以重载 (C)构造方法是通过new 来调用(D)每个类都必须编写构造方法代码 11.关于继承如下说法错误的是(C)。 (A) Java 是单继承的(B)通过extends 来定义继承 (C)所有父类方法都可以被override的(D)继承呈现的是 is a 的关系 12.以下代码执行的结果是 ( C )。 System.out.println(" 攀枝花学院 pzhu".length()); (A)编译错误(B)运行错误(C) 9(D) 14 13. 用来存储键值对的容器是 ()。 (A )ArrayList( B ) LinkedList(C) HashSet( D) HashMap 14、 java 中用来抛出异常的关键字是( C )。 (A) try(B) catch(C) throw(D) throws 15.关于 finally块中的代码,以下说法不正确的是(A)。 (A ) try 块中的 return 语句会中断finally 块中语句的执行 (B )无论 finally 块前的语句运行是否产生异常,其中的语句都会执行 (C) finally 块中的语句通常中用作资源的清理 - 1 -

Java笔试题及答案

Java笔试题及答案 一、单项选择题 1.Java是从()语言改进重新设计。 A.Ada B.C++ C.Pasacal D.BASIC 答案:B 2.下列语句哪一个正确() A. Java程序经编译后会产生machine code B. Java程序经编译后会产生byte code C. Java程序经编译后会产生DLL D.以上都不正确 答案:B 3.下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与class同名 C. constructor在一个对象被new时执行 D.一个class只能定义一个constructor 答案:C 详解:见下面代码,很明显方法是可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值。 package net.study; public class TestConStructor { public TestConStructor() {

} public void TestConStructor() { } public static void main(String[] args) { TestConStructor testConStructor = new TestConStructor(); testConStructor.TestConStructor(); } } 4.提供Java存取数据库能力的包是() 答案:A 5.下列运算符合法的是() A.&& B.<> C.if D.:= 答案:A 详解: java 中没有<> := 这种运算符,if else不算运算符 6.执行如下程序代码 a=0;c=0; do{ --c; a=a-1; }while(a>0); 后,C的值是()

java试卷B-

班 姓 学 考试时 考场(教室 装 线 一、单项选择题:(将每小题正确答案的代码填写在题后的括弧内。每小题2分,共20分) 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为 ( ) A.java B. class C..html D.exe 2.下面说法中不正确的是: ( ) A .类是对象的抽象,对象是类的实例 B.类是组成java 程序的最小的单位 C .java 语言支持多继承 D.java 一个程序中只能有一个public 类 3. 欲构造ArrayList 类的一个实例,此类继承了List 接口,则正确的是( ) A. ArrayList myList=new Object () B. List myList=new ArrayList () C. ArrayList myList=new List () D. List myList=new List () 4.当浏览器重新返回Applet 所在页面时,将调用Applet 类的方法是 ( ) A.start() B.init() C.stop() D.destroy() 5.假设你正在为应用系统设计一个Java 图形用户界面(GUI ),需要能输入多行文本信息,下列组件中最能满足这个要求的是 ( ) A.TextArea https://www.wendangku.net/doc/e04460031.html,bel C.TextField D.Checkbox 6. 下面关于进程、线程的说法错误的是 ( ) A.进程是程序的一次动态执行过程。一个进程在其执行过程中,可以产生多个线程——多线程,形成多条执行线索 B.线程是比进程更小的执行单位,是在一个进程中独立的控制流,即程序内部的控制流。线程本身不能自动运行,栖身于某个进程之中,由进程启动执行。 C.Java 多线程的运行与平台无关 D.对于单处理器系统,多个线程分时间片获取CPU 或其他系统资源来运行。对于多处理器系统,线程可以分配到多个处理器中,从而真正的并发执行多任务 7.paint()方法使用哪种类型的参数? ( ) A.Graphics B.Graphics2D C.String D.Color 8.下列有关事件监听器的描述正确的是 ( ) A.多个监听者可以被附加到一个组件 B.只有一个监听者可以被附加到一个组件上 C.一个监听者只能接受一个组件产生的事件 D.以上描述都不对 9.应用程序的main 方法中有以下语句,则输出的结果是 ( ) String s = "xxxxxxxxxxxxxxx#123#456#zzzzz"; int n = s.indexOf("#"); i nt k = s.indexOf("#", n+1); String s2 = s.substring(n+1, k); System.out.println(s2); A.123456 B.123 C.xxxxxxxxxxxxxxx D.zzzzz 10.下列关于修饰符混用的说法错误的是 ( ) A.abstract 不能与final 并列修饰同一个类 B.abstract 类中不可以有private 的成员 C.abstract 方法必须在abstract 类中 D.staic 方法中能处理非static 的属性 二、填空题:(每空2分,共16分) 1.Java 程序分为应用程序和小程序两种,小程序必须从___________类继承而来。 2.在java 中,把数据类型分为两大类为___________和_________。 3.若要实现多线程的同步处理,应用______________修饰方法,使得被修饰的方法一次只能由一个线程使用。 4.在Java 语言中,所有的类都是类__________的子类。 5.在Java 程序中,通过类的定义只能实现单重继承,但通过____________ 的定义可以实现多重继承关系。 6.框架默认情况下使用_________布局管理器,面板默认情况下使用_________布局管理器。

JAVA期末考试复习试题

JAVA期末考试复习试题 JAVA期末考试复习试题 1.使用Java语言编写的源程序保存时的文件扩展名是()。(A).class (B).java (C).cpp (D).txt 2.设int a=-2,则表达式a>>>3的值为()。(A)0 (B)3 (C)8 (D)-1 3.设有数组的定义int[] a = new int[3],则下面对数组元素的引用错误的是()。(A)a[0]; (B)a[a.length-1]; (C)a[3]; (D)int i=1; a[i]; 4.在类的定义中可以有两个同名函数,这种现象称为函数()。(A)封装(B)继承(C)覆盖(D)重载5.在类的定义中构造函数的作用是()。(A)保护成员变量(B)读取类的成员变量(C)描述类的 特征(D)初始化成员变量6.下面关键字中,哪一个不 是用于异常处理语句()。(A)try (B)break (C)catch (D)finally 7.类与对象的关系是()。 (A)类是对象的`抽象(B)对象是类的抽象(C)对象 是类的子类(D)类是对象的具体实例8.下面哪一个是Java中不合法的标识符()。(A)$persons (B)twoNum (C)_myVar (D)*point 9.为AB类的一个无形

式参数无返回值的方法method书写方法头,使得使用类名AB 作为前缀就可以调用它,该方法头的形式为( )。(A)static void method( ) (B)public void method( ) (C)final void method( ) (D)abstract void method( ) 10.欲构造ArrayList类的一个实例,此类继承了List接 口,下列哪个方法是正确的()。(A)ArrayList myList=new Object( ) (B)List myList=new ArrayList( ) (C)ArrayList myList=new List( ) (D)List myList=new List( ) 11.Java源文件和编译后的文件扩展名分别为 ()(A) .class和 .java (B).java和 .class (C).class和 .class (D) .java和 .java 12.在Java Applet程序用户自定义的Applet子类中,一般需要重载父类 的( )方法来完成一些画图操作。(A) start( ) (B) stop( ) (C) init( ) (D) paint( ) 13.对于一个Java源文件,import, class定义以及package正确的顺序是: (A) package,import,class (B) class,import,package (C) import,package,class (D) package,class,import 14.下面哪个是非法的:(A) int I = 32; (B) float f = 45.0; (C) double d = 45.0; (D) char c = ‘u’; //符号错15.Java语言使用的字符码集是(A) ASCII (B) BCD (C) DCB (D) Unicode 16. 如果一个类的成员变量只能在

java笔试题及答案.doc

java笔试题及答案 有了下面java笔试题及答案,进行java笔试时就容易多了,请您对下文进行参考: 1、作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域当前类同一package子孙类其他package public 7 7 7 7 protected 7 7 7 X friendly 7 7 X X private 7 X X X 不写时默认为friendly 2、Anonymouslnner Class (匿名内部类)是否可以exte nd s (继承)其它类,是否可以imple ment s (实现)i nterf ace (接口) 答:匿名的内部类是没有名字的内部类。不能exte n ds (继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现 3、Sta ti cNestedC las s 和Inner Clas s 的不同答: Nes tedC lass (一般是C+ +的说法),In ne rClass (—般是JAVA的说法)。J ava内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注:静态内部类(I

nn erClass)意味着1创建一个st atic内部类的对象,不需要一个外部类对象,2不能从一个st atic内部类的一个对象访问一个外部类对象 4、和的区别 答:是位运算符,表示按位与运算,是逻辑运算符,表示遷辑与(and ) 5、Coll ect ion 和Col lect ions 的区别 答:Coll ect ion是集合类的上级接口,继承与他的接口主要有Set和List. Col lections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作 6、什么时候用assert 答:asserti on (断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,a ssertion 就是在程序中的一条语句,它对一个boolea n表 达式进行检查,一个正确程序必须保证这个bool ean表达 式的值为tr ue;如果该值为fal se,说明程序己经处于不正确的状态下,系统将给出警告或退出。一般来说,

JAVA测试题(三套含答案)

<测试一> 1.在单一文件中import、class和package的正确出现顺序是:A A.package, import, class B.class, import, package C.import, package, class D.package, class, import 2.public static void main方法的参数描述是:A,D A.String args[] B.Strings args[] C.String args D.String []args 3.下面哪行代码会在编译的时候出现错误或警告:A,B,C,D A.float f=1.3; B.char c="a"; C.byte b=257; D.boolean b=null; E.int i=10; 4.编译,运行下列代码后的结果是:D public class Test { public static void main (String args []) { int age; age = age + 1; System.out.println("The age is " + age); } } A.编译,运行后没有输出 B.编译,运行后输出:The age is 1 C.能通过编译,但运行时产生错误 D.不能通过编译 4.下面那些关键字不是JAVA的关键字B A if B then C goto D while E case 5.下面那些不是合法的变量定义:A,F A.2variable B.variable2 C. _whatavariable

D. _3_ E. $anothervar F. #myvar 6.内部数据类型byte的取值范围是B A.0 - 65, 535 B.(–128) – 127 C.(–32,768) – 32,767 D.(–256) – 255 7.下列哪些表达式返回true AB A."john" == "john" B."john".equals("john") C."john" = "john" D."john".equals(new Button("john")) 8.声明公用的abstract方法的正确格式是A A.public abstract void add(); B.public abstract void add() {} C.public abstract add(); D.public virtual add(); 9.下面的代码能打印出的结果为:C int i=1; switch (i) { case 0: System.out.println("zero"); break; case 1: System.out.println("one"); case 2: System.out.println("two"); default: System.out.println("default"); } A.one B.one, default C.one, two, default D.default 10.下面的代码能打印出的结果为:B int i=9; switch (i) { default:

java期末考试复习题及答案

《Java程序设计》课程试卷 1.使用Java语言编写的源程序保存时的文件扩展名是( B )。 (A).class (B).java (C).cpp (D).txt 2.设int a=-2,则表达式a>>>3的值为( C )。 (A)0 (B)3 (C)8 (D)-1 3.设有数组的定义int[] a = new int[3],则下面对数组元素的引用错误的是( C )。 (A)a[0]; (B)a[a.length-1]; (C)a[3]; (D)int i=1; a[i]; 4.在类的定义中可以有两个同名函数,这种现象称为函数( D )。 (A)封装(B)继承(C)覆盖(D)重载 5.在类的定义中构造函数的作用是( D )。 (A)保护成员变量(B)读取类的成员变量(C)描述类的特征(D)初始化成员变量 6.下面关键字中,哪一个不是用于异常处理语句( B )。 (A)try (B)break (C)catch (D)finally 7.类与对象的关系是( A )。 (A)类是对象的抽象(B)对象是类的抽象(C)对象是类的子类(D)类是对象的具体实例 8.下面哪一个是Java中不合法的标识符( D )。 (A)$persons (B)twoNum (C)_myVar (D)*point 9.为AB类的一个无形式参数无返回值的方法method书写方法头,使得使用类名AB作为前缀就可以调用它,该方法头的形式为( A )。 (A)static void method( ) (B)public void method( ) (C)final void method( ) (D)abstract void method( ) 10.欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的( C )。 (A)ArrayList myList=new Object( ) (B)List myList=new ArrayList( ) (C)ArrayList myList=new List( ) (D)List myList=new List( ) 11.Java源文件和编译后的文件扩展名分别为( B ) (A) .class和 .java (B).java和 .class (C).class和 .class (D) .java和 .java

JAVA模拟试题(含答案)

一、请分别写出下面程序的运行结果,将答案添在每道题后的空格处 1. public class Test1 { public static void main(String[] args) { int x=10,y=20; System.out.print("x="+(x++)+" y="+(++y)+" sum="+(x+y)); } } 运行结果:x=10 y=21 sum=32 2. public class Test2 { public static void main(String[] args) { boolean end; for(int i=2;i<20;i++){ end=true; for(int j=2;j<=i;j++){ if(i%j==0&&j

相关文档