Java练习题
一、判断题
1. 子类可以继承父类的的除私有成员以外的其他所有成员 √
正确:子类是可以继承父类的的除私有成员以外的其他所有成员,所以答案为√:例如:
public class ExtendsTest extends Father
{
int a = 10;//值为10的变量属于子类
public static void main(String[] args)
{
ExtendsTest t=new ExtendsTest();
Father t1=t;
System.out.println(t.a);
System.out.println(t1.a);
}
}
class Father
{
int a = 12;//值为12的变量属于父类
}
输入的结果是:10 12
即在该程序中,创建的ExtendsTest对象中同时存在该对象自己的成员变量int a = 10;和从父类继承成的成员变量int a = 12;通过使用不同的引用变量可以分别把这2个成员变量输出。
2. Integer是基本类型 ×
错误://基本类型就8个,分别是int、short、long、float、double、char、boolean、byte。而Integer是int的包装类,它并不是基本类型,而且注意大小写,如Long与long、Byte与byte 长的很像,单前者是后者的包装类。
3.如下程序可以正常运行 √
Public class Null
{
public static void haha()
{
System.out.println(“haha”);
}
public static void main(String[] args)
{
((Null).null).haha();
}
}
正确://在java程序中,关键字null可以是任何的类型,通过强制转换把null转换为Null,其实就相当于Null.haha();haha方法为静态方法通过[类名.方法名]是可以正常运行的。
4.一般情况下,如果三者在执行速度方面的比较是:StringBuilder>StringBuffer>String
错误;//
5.Java中byte类型和char类型都占用一个字节
错误:byte和boolean分别占1byte;char和short分别占2byte;int和float分别占4字节;double和long分别占8byte;?至于引用变量大小和操作系统的位数有关,一般在64位平台上,占8byte,在32位平台上占4byte。?
6.All interface methods must be declared as public when implemented in a class
正确
二、填空题
1.请写出如下程序的打印序列结果
class HelloA
{
public HelloA()
{
System.out.println(“HelloA”);
}
{
System.out.println(“I’m A Class”);
}
static {
System.out.println(“static A Class”);
}
}
public class HelloB extends HelloA
{
public HelloB()
{
System.out.println(“HelloB”);
}
{
System.out.println(“I’m B Class”);
}
static {
System.out.println(“static B Class”);
}
public static void main(String[] args)
{
new HelloB();
new HelloA();
}
}
结果:
static A Class
static B Class
I’m A Class
HelloA
I’m B Class
HelloB
I’m A Class
HelloA
在程序执行时,①首先会执行父类的类方法然后是子类的类方法,因为类方法是在类加载的时候就开始执行并且只执行一次;②然后在创建子类对象的时候默认会先执行父类的不带参数的构造方法(如果这时父类只有带参的构造方法,就会报错提示缺少不带参的父类构造方法),之后才是执行子类相对应构造方法;③至于在非静态代码块中的语句和构造方法中的语句的执行顺序是==>在代码编译之后,非静态代码块的语句会被提取到构造方法中并且出现在构造方法原有语句之前,所以打印时会先打印非静态代码块的语句然后才是构造方法的语句。
2.下列程序执行后的输出结果是
public class Foo
{
public static void main(String[] args)
{
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
String str_a = new String("str_a");
String str_b = new String("str_b");
char[] arr = { 'a', 'b', 'c' };
operate(a, b);
operate(arr);
operate(str_a, str_b);
System.out.println(a + "," + b + "," + str_a + "," + str_b + ","
+ arr[0]);
}
static void operate(StringBuffer x, StringBuffer y)
{
x.append(y);
y = x;
}
static void operate(String x, String y)
{
y = x.concat("str_b");
x = x.toLowerCase();
}
static void operate(char[] x)
{
x[0] = 'c';
}
}
结果:
AB,B,str_a,str_b,c
其中主要考察的是java中的参数传递方式=>值传递,对于基本类型值就代表是值本身,而引用类型值代表的是地址。StringBuffer进行append操作时会在原字符上进行操作,同样对数组进行操作时也是在数组本身进行操作,而对String对象进行操作时,并不是在原对象上面进行操作的。
3.阅读下面程序,其输出为:
public class ExceptionTest
{
public static void main(String[] args)
{
try
{
test(new int[] { 0, 1, 2, 3, 4, 5 });
} catch (Exception e)
{
System.out.println("E");
}
}
private static void test(int[] arr)
{
for (int i = 0; i < arr.length; i++)
{
try
{
if (arr[i] % 2 != 0)
{
throw new NullPointerException();
} else
{
System.out.println(i);
}
} finally
{
System.out.println("e");
}
}
}
}
结果:
0
e
e
E
这道题主要考察的finally执行,不管 try 语句块正常结束还是异常结束,finally 语句块是保证要执行的并在正常情况下先执行try/catch里面的语句然后是finally 语句。但是当try/catch里面有控制转移语句(return、break、continue等关键字)时,finally 语句块会在它们之前执行。
4.int常量在计算中内存分配 4 个字节,一个java引用变量占 4 个字节。
三、单选选择题
1.给出下列不完整的程序:
class Boo
{
Boo(String s)
{
}
Boo()
{
}
}
class Bar extends Boo
{
Bar()
{
}
Bar(String s)
{
super(s);
}
void Zoo()
{
//insert code here
}
}
哪个语句将在Bar类中创建一个匿名类?B
A. Boo f=new Boo(24){};
B. Boo f=new Boo(){String s;};
C. Bar f=new Boo(String s){};
D. Boo f=new Boo.(String){};
2.Give the follow declaration? D
Integer i=new Integer(99);
How can you now set the value of i to 10 ?
A. i=10;
B. i.setValue(10);
C. i.parseInt(10);
D. None of the above;
3.How can you change the current working directory using an instance of the File class called FileName ? D
A. FileName.chdir(“DirName”);
B. FileName.cd(“DirName”);
C. FileName.cwd(“DirName”);
D. The File class does not support directly changing the current directory.
4.关于下面程序描述正确的是 C
4 public class Foo extends Hoo
5 {
6 public static void main(String args)
7 {
8 Short i = 7;
9 System.out.println(" " + count(i, 8));
10 }
11 }
12 class Hoo
13 {
14 int count(int x, int y)
15 {
16 return x + y;
17 }
18 }
A. 存在多个编译错误
B. 第8行编译失败
C. 第9行编译失败
D. 编译通过,运行时异常
5.what results from at attempting to compile and run the following code ?Choice: A
public class Frodo
{
public static void main(String args[])
{
int a=5;
System.out.println(“value is -”+((a>=5)?10:9D));
}
}
A. Prints:Value is -10.0
B. Compilation error
C. Prints:Value is -5
D. None of these
6.给出下面代码,关于该程序以下哪个说法是正确的?( C )
public class Person
{
static int arr[] = new int[5];//如果为赋值则取默认值0
public static void main(String a[])
{
System.out.println(arr[0]);
}
}
A. 编译时将产生错误
B. 编译时正确,运行时将产生错误
C. 输出零
D. 输出空
7.下列哪些语句关于Java内存回收的说明是正确的? ( B )
A. .程序员必须创建一个线程来释放内存
B. 内存回收程序负责释放无用内存
C. 内存回收程序允许程序员直接释放内存
D. 内存回收程序可以在指定的时间释放内存对象
8.以下代码段执行后的输出结果为( A)
int x =-3;
int y =-10;
System.out.println(y%x);
A. -1 //保证与分母符号相同
B. 2
C. 1
D. 3
9.以下代码运行输出是(C)
public class Person
{
private String name=”Person”;
int age=0;
}
public class Child extends Person
{
public String grade;
public static void main(String[] args)
{
Person p = new Child();
System.out.println(p.name);//出错,对于对象p来说方法name 是不可见的
}
}
A. 输出:Person
B. 没有输出
C. 编译出错
D. 运行出错
10. 设有下面两个赋值语句: D
a = Integer.parseInt(“12”);
b = Integer.valueOf(“12”).intValue();
下述说法正确的是( D ).
A. a是整数类型变量,b是整数类对象
B. a是整数类对象,b是整数类型变量
C. a和b都是整数类对象并且值相等
D. a和b都是整数类型变量并且值相等
//1. Integer.parseInt 返回int 值
//2. Integer.valueOf(“1024”) 返回Integer, 再调用.intValue();返回int所以ab都是int型
11.类Parent.Child定义如下:
public class Parent
{
public float aFun(float a, float b) throws
IOException { }
}
public class Child extends Parent
{
//Insert code
}
将以下哪种方法插入行7是不合法的.( A )
A. float aFun(float a, float b){ }//修饰符作用域变小(default)
B. public int aFun(int a, int b)throws Exception{ }
C. public float aFun(float p, float q){ }//重写
D. public int aFun(int a, int b)throws IOException{ }
12.有以下方法的定义,请选择该方法的返回类型( D ).
ReturnType method(byte x, double y)
{
return (short) x/y*2;
}
A. Byte
B. B.short
C. C.int
D. D.double//A和B不会报错
13.以下程序的运行结果是(D)
class Person
{
public Person()
{
System.out.println("this is a Person");
}
}
public class Teacher extends Person
{
private String name = "tom";
public Teacher()
{
System.out.println("this is a teacher");
super();// ①
}
public static void main(String[] args)
{
Teacher teacher = new Teacher();
System.out.println(this.name);// ②Cannot use this in a static context
}
}
A) this is a Person
this is a teacher
tom
B) this is a teacher
this is a Person
tom
C)运行出错
D) 编译有两处错误 //分别是① ②
14.以下说法错误的是(D)
A) super.方法()可以调用父类的所有非私有方法
B) super()可以调用父类的所有非私有构造函数
C) super.属性可以调用父类的所有非私有属性
D) this和super关键字可以出现在同一个构造函数中
//在一个构造函数中,能不能同时使用super();和this();==>因为super()或this()如果出现在构造方法里,都要放在构造方法的第一行 如果同时出现, 那到底是谁放第一行呢? 自相矛盾了==》具体报错为:Constructor call must be the first statement in a constructor
15.以下代码,描述正确的有(A )
interface IDemo
{
1. public static final String name;
2. void print();
3. public void getInfo();
}
4.abstract class Person implements IDemo
{
public void print()
{
}
}
A 第1行错误,没有给变量赋值
//在java中声明的局部变量必须要赋初值否则报错,具体报错为:The blank final field name may not have been initialized
B 第2行错误,方法没有修饰符
C 第4行错误,没有实现接口的全部方法
D 第3行错误,没有方法的实现
16.以下程序运行结果是(D)
public class Test
{
public int div(int a, int b) {
try {
return a / b;
}catch(Exception e){
System.out.println(“Exception”);
}catch(NullPointerException e){
System.out.println(“ArithmeticException”);
}
catch (ArithmeticException e) {
System.out.println(“ArithmeticException”);
} finally {
System.out.println(“finally”);
}
return 0;
}
public static void main(String[] args) {
Test demo = new Test();
System.out.println(“商是:” + demo.div(9, 0));
}
}
A) Exception finally 商是:0
B) ArithmeticException finally 商是:0
C) finally商是:0
D) 编译报错
//exception是所有异常的父类,如果exception在最前面则后面的其他子exception就无法到达
四、多项选择题
1.在变量定义中,对变量名的要求是
A. 在变量所在的整个源程序中变量名必须是唯一的,否则会造成混乱//
B. 变量名中可以包含关键字,但不能是关键字
C. 变量名不能是java关键字,逻辑值,以及保留字
D. 变量名必须以英文字母打头,不能以数字或汉字打头
//B、C
2.下面哪些选项的代码插入到相应位置后编译正常
public class Foo
{
public void someOutMethod()
{
// line3
}
public class Hoo
{
}
public static void main(String[] args)
{
Foo o=new Foo();
//line 8
}
}
A. new Hoo();// At line 3
B. new Hoo();// At line 8
C. new o.Hoo();// At line 8
D. new Foo().new Hoo();// At line 8
//A、D
3.Which of the follow methods can be legally inserted in place of the comment //method here
public class Scope extends Base
{
public static void main(String[] args){}
//method here
}
class Base
{
public void amethod(int i){}
}
A. void amethod(int i) throws Exception{}
B. void amethod(long i) throws Exception{}
C. public void amethod(int i) throws Exception{}
D. void amethod(long i) {}
//B、D
4.Which of the following are legal statements ?
A. float f=1/3;
B. int i=1/3;
C. float f=11.01;
D. double d=999d;
//A、B、D
//float f=1/3;其实就是相当于float f=0;因为后面的全是int型在做运算,其结果就是0,如果float有小数形式后面需要加上f来和double型区分 如float f=11.01f;
5.Given the follow class definition
public class Foo
{
public static void main(String[] args){}
public void amethod(int i){}
// here
}
Which of the following would be legal to place after the comment // here ?
A. public int amethod(int z){}
B. public int amethod(int i,int j){return 99;}
C. protect void amethod(long l){}
D. private void amethod(){}
//方法重载跟返回值类型和修饰符无关 B、C、D
五、编程题
1.用java编写程序,去掉字符串中重复的#符号。例如” aa#bb##%hg####dge#jkl##fs”,处理后变成” aa#bb#%hg#dge#jkl#fs”。
2.编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截取半个,如”我ABC”4,应该截取为”我AB”,输入”我ABC汉DEF”6,应该输出为”我ABC”而不是”我ABC”+汉的半个。