目录
一、选择题
二、编程题
2.1另类加法
2.2走方格的方案数
一、选择题
1.下面程序的输出是:()
String x="fmn";
x.toUpperCase();
String y=x.replace('f','F');
y=y+"wxy";
System.out.println(y);
A FmNwxy
B fmnwxy
C wxyfmn
D Fmnwxy
String x = “fmm”;“fmn”是在常量的不可变对象。x.toUpperCase()将字符串全部变成大写,在堆中new一个“FMN”对象,但无任何引用指向它。
所以x仍然是 "fmn",y=x.replace('f','F'),意味着将x中的f换成F,所以y ="Fmn" 然后y=y+"wxy",所以y = "Fmnwxy"。
所以正确答案是 D
2.在 java 中,一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能各不相同,这种面向对象的特性称为()
A 隐藏
B 覆盖
C 重载
D 无此特性
一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能各不相同,这种面向对象的特性称为重载。
所以正确答案是 C
3.关于 JAVA 堆,下面说法错误的是()
A 所有类的实例和数组都是在堆上分配内存的
B 对象所占的堆内存是由自动内存管理系统回收
C 堆内存由存活和死亡的对象,空闲碎片区组成
D 数组是分配在栈中的
所有类的实例和数组都是在堆上分配内存的,对象所占的堆内存是由自动内存管理系统回收,堆内存由存活和死亡的对象,空闲碎片区组成。数组的引用存在栈内存中,而数组对象保存在堆里面。
所以正确答案是 D
4.一个以“.java”为后缀的源文件
A 只能包含一个public类,类名必须与文件名相同
B 只能包含与文件名相同的public类以及其中的内部类
C 只能有一个与文件名相同的public类,可以包含其他非public类(不考虑内部类)
D 可以包含任意public类
一个以“.java”为后缀的源文件只能有一个与文件名相同的public类,可以包含其他非public类
所以正确答案是 C
5.JAVA语言的下面几种数组复制方法中,哪个效率最高?
A for循环逐一复制
B System.arraycopy
C Arrays.copyOf
D 使用clone方法
效率:System.arraycopy > clone > Arrays.copyOf > for循环逐一复制
所以正确答案是 B
6.()仅包含方法定义和常量值。
A 接口
B 变量
C 单元
D 成员
接口仅包含方法定义和常量值,方法不包含大括号,不能进行详细描述,需要有子类进行拓展。
所以正确答案是 A
7.对文件名为Test.java的java代码描述正确的是()
class Person {
String name = "No name";
public Person(String nm) {
name = nm;
}
}
class Employee extends Person {
String empID = "0000";
public Employee(String id) {
empID = id;
}
}
public class Test {
public static void main(String args[]) {
Employee e = new Employee("123");
System.out.println(e.empID);
}
}
A 输出:0000
B 输出:123
C 编译报错
D 输出:No name
在子类和父类如果都有有参构造,那么必须在子类中调用父类的有参构造给他初始化,否则会编译报错。
所以正确答案是 C
8.有关下述Java代码描述正确的选项是____。
public class TestClass {
private static void testMethod(){
System.out.println("testMethod");
}
public static void main(String[] args) {
((TestClass)null).testMethod();
}
}
A 编译不通过
B 编译通过,运行异常,报NullPointerException
C 编译通过,运行异常,报IllegalArgumentException
D 编译通过,运行异常,报NoSuchMethodException
E 编译通过,运行异常,报Exception
F 运行正常,输出testMethod
本题是可以正常运行的,如果将static去掉就会有空指针异常,static表示静态,直接用类名就能调用方法。
所以正确答案是 F
9.下列java程序的输出结果为____。
public class Example{
String str=new String("hello");
char[]ch={'a','b'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='c';
}
}
A hello and ab
B hello and cb
C hello and a
D test ok and ab
E test ok and cb
F test ok and c
change方法中改变了str形参的值,并没有改变主方法中str引用的对象,而第二行直接改变了ch数组引用对象,所以会对主方法中的ch数组也造成改变。
所以正确答案是 B
10.下列 java 程序输出结果为______。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
A true,false
B true,true
C false,true
D false,false
E 对于不同的环境结果不同
F 程序无法执行
“==”进行的是两个变量数值的比较,对于基本数据类型来说比较的就是基本数值是否相等,对于引用数据类型来说比较的是两个引用是否指向同一个对象(即地址是否相同)。
equals方法进行的是两个类对象的属性值比较,若类的对象需要具体比较属性值是否相等需要复写Object类中提供的equals方法。
基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱,然后与基本数据类型进行值的比较所以i==j返回的是true。引用数据类型与基本数据类型进行比较,基本数据类型会进行自动装箱,与引用数据类型进行比较,Object中的equals方法比较的是地址,但是Integer类已经重写了equals方法,只要两个对象的值相同,则可视为同一对象,具体看API文档,所以这归根到底也是值的比较。所以j.equals(i)返回的是true。
此题考察了所以正确答案是 B
二、编程题
2.1另类加法
给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符
本题需要返回A+B的值并且不能使用算术运算符,首先排除特殊情况如果B为0的话,那么结果就是A,然后进入循环,int sum = A^B; 使A和B(按位异或^两个二进制位相同返回0,不相同返回1)得到sum,然后使A和B按位与&(如果两个二进制位都为1,则返回1,否则返回0)然后将结果左移位<<得到tmp,然后将sum值赋给A,将tmp值赋给B。直到B<=0。
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
if(B==0){
return A;
}
while(B!=0){
int sum = A^B;
int tmp = (A&B)<<1;
A = sum;
B = tmp;
}
return A;
}
}
2.2走方格的方案数
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。 注:沿棋盘格之间的边缘线行走 数据范围: 1≤n,m≤8
在本题中一共有四种可能性。
第一种情况是n = 1,m = 1,只有一个小方块,那么只有m+n = 2 两种走法。
第二种情况是m = 1
第三种情况是n = 1,第二种情况和第三种情况都是有m+n种走法。
第四种情况就是m和n都不是1,那么这种时候就需要进入递归,返回g(n,m-1)+g(n-1,m),将整个方块拆分为两块进行运算。直到上述三种情况才结束递归。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
System.out.println(g(n,m));
}
public static int g(int n,int m){
if(m==1&&n==1){
return m+n;
}
if(m==1||n==1){
return m+n;
}
return g(n,m-1)+g(n-1,m);
}
}