1、类 ABC 定义如下:
1 . public class ABC{
2 . public int max( int a, int b) { }
3 .
4 . }
将以下哪个方法插入行 3 是不合法的。( )。
正确答案: B 你的答案: B (正确)
public float max(float a, float b, float c){ }
public int max (int c, int d){ }
public float max(float a, float b){ }
private int max(int a, int b, int c){ }
题解:
注意是不合法,这题考察重载
细说一下重写和重载:
这两个都是多态的一种表现形式。
重载:
1、 重载是在编译器通过方法中形参的静态类型确定调用方法版本的过程。
2、 重载是多态在编译期的表现形式
3、 重载的判定只有两个条件(其他的条件都不能作为判定):
1、 方法名一致
2、形参列表不同
重写:
1、重写在方法运行时,通过调用者的实际类型来确定调用的方法版本。(具体细说,就是子父类中的重写方法在对应的class文件常量池的位置相同,一旦子类没有重写,那么子类的实例就会沿着这个位置往上找,直到找到父类的同名方法)
2、重写只发生在可见的实例方法中:
1、静态方法不存在重写,形式上的重写只能说是隐藏。
2、私有方法也不存在重写,父类中private的方法,子类中就算定义了,就是相当于一个新的方法。
3、静态方法和实例方法不存在相互重写。
3、重写满足一个规则:两同两小一大
1、两同:方法名和形参列表一致
2、两小:重写方法的返回值(引用类型)和抛出异常,要和被重写方法的返回值(引用类型)和抛出异常相同或者是其子类。注意,一旦返回值是基本数据类型,那么重写方法和被重写方法必须相同,且不存在自动拆装箱的问题。
3、一大:重写方法的访问修饰符大于等于被重写方法的访问修饰符。
B选项方法名、形参列表和返回值类型与题目完全一样,故既不是重写也不是重载
2、后端获取数据,向前端输出过程中,以下描述正确的是
正确答案: D 你的答案: D (正确)
对于前端过滤过的参数,属于可信数据,可以直接输出到前端页面
对于从数据库获得的数据,属于可信数据,可以直接输出到前端页面
对于从用户上传的Excel等文件解析出的数据,属于可信数据,可以直接输出到前端页面
其它选项都不属于可信数据,输出前应该采用信息安全部发布的XSSFilter做进行相应编码
题解:
后端获取数据,向前端输出的过程中,输出前应该采用信息安全部发布的XSSFilter进行相应编码。
3、在异常处理中,以下描述不正确的有
正确答案: D 你的答案: D (正确)
try块不可以省略
可以使用多重catch块
finally块可以省略
catch块和finally块可以同时省略
题解:
选D 假如try中有异常抛出,则会去执行catch块,再去执行finally块;假如没有catch 块,可以直接执行finally 块,方法就以抛出异常的方式结束,而finally 后的内容也不会被执行,所以catch 和 finally 不能同时省略。
4、如果一个接口Cup有个方法use(),有个类SmallCup实现接口Cup,则在类SmallCup中正确的是? ( )
正确答案: C 你的答案: C (正确)
void use() { …}
protected void use() { …}
public void use() { …}
以上语句都可以用在类SmallCup中
题解:
1.题目说了实现,那么接口中的方法是抽象方法
2.接口中的抽象方法是public修饰
3.实现就意味着重写,重写的方法的权限不能小于被重写的方法
4.而最大的权限是public,即public<=重写的方法的权限<=public,即重写的方法的权限只能为public
5、下面的程序将来打印什么?()
public class TestIncr {
public static void main(String args[]) {
int i = 0;
i = i++ + i;
System.out.println(“I =” +i);
}
}
正确答案: A 你的答案: A (正确)
I = 1
I = 2
I = 3
编译出错
题解:
首先,在 i = i++ + i 中,先执行的是 i++ ,此时式子可为 i = 0 + i
然后再进行后一步 +i ,因为前面执行了 i++ ,所以这个 i 的值已经 +1 了
那么最后这个式子就是 i = 0 + 1
6、执行以下程序后的输出结果是()
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer(“A”);
StringBuffer b = new StringBuffer(“B”);
operator(a, b);
System.out.println(a + “,” + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
正确答案: D 你的答案: D(正确)
A,A
A,B
B,B
AB,B
题解:
a和x是同个地址,b和y是同个地址,然后执行x.append(y)就把y的值放在x的地址里面此时a地址和x是同一个所以a就是AB了,接着执行y=x是把x的地址给y,这时候axy属于同一个地址。所以y=x 只是改变了y的地址没改变b的地址,所以b还是B
7、java语言的下面几种数组复制方法中,哪个效率最高?
正确答案: B 你的答案: B (正确)
for 循环逐一复制
System.arraycopy
Array.copyOf
使用clone方法
题解:
从速度上看:System.arraycopy > clone > Arrays.copyOf > for
System.arraycopy():native方法+JVM手写函数,在JVM里预写好速度最快
clone():native方法,但并未手写,需要JNI转换,速度其次
Arrays.copyof():本质是调用1的方法
for():全是深复制,并且不是封装方法,最慢情有可原
8、有关会话跟踪技术描述正确的是()
正确答案: A B C 你的答案: A B C (正确)
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端
关闭浏览器意味着临时会话ID丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期
在禁用Cookie时可以使用URL重写技术跟踪会话
隐藏表单域将字段添加到HTML表单并在客户端浏览器中显示
题解:
D:隐藏域在页面中对于用户(浏览器)是不可见的,在表单中插入隐藏域的目的在于收集或发送信息,以利于被处理表单的程序所使用。浏览者单击发送按钮发送表单的时候,隐藏域的信息也被一起发送到服务器。
9、关于Java内存区域下列说法不正确的有哪些
正确答案: B C 你的答案: B C (正确)
程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器,每个线程都需要一个独立的程序计数器.
Java虚拟机栈描述的是java方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧,用于存储局部变量表、类信息、动态链接等信息
Java堆是java虚拟机所管理的内存中最大的一块,每个线程都拥有一块内存区域,所有的对象实例以及数组都在这里分配内存。
方法区是各个线程共享的内存区域,它用于存储已经被虚拟机加载的常量、即时编译器编译后的代码、静态变量等数据。
题解:
B.类信息不是存储在java虚拟机栈中,而是存储在方法区中;
C.java堆是被所有线程共享的一块内存区域,而不是每个线程都拥有一块内存区域。
A.程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器(偏移地址),Java编译过程中产生的字节码有点类似编译原理的指令,程序计数器的内存空间存储的是当前执行的字节码的偏移地址,每一个线程都有一个独立的程序计数器(程序计数器的内存空间是线程私有的),因为当执行语句时,改变的是程序计数器的内存空间,因此它不会发生内存溢出 ,并且程序计数器是jvm虚拟机规范中唯一一个没有规定 OutOfMemoryError 异常 的区域;
B.java虚拟机栈:线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。 没有类信息,类信息是在方法区中
C.java堆:对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组
D.方法区:属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
10、下面的Java赋值语句哪些是有错误的 ()
正确答案: B C F 你的答案: B C F(正确)
A:int i =1000;
B:float f = 45.0;
C:char s = ‘\u0639’
D:Object o = ‘f’;
E:String s = “hello,world\0”;
F:Double d = 100;
题解:
A:没毛病
B:小数默认双精度(double)的,赋值给浮点型(float)属下转型,会造成精度损失,需要强制类型转换float f =(float)45.0; 或者写成float f =45.0F;。
C:没分号啊
D:可以把任何一种数据类型的变量赋给Object类型的变量,因为java所有类默认继承Object,基本数据类型赋值给Object会先装箱,装箱之后就是Object的子类了;
E:没毛病,字符串中的\0被编译为\u0000,表示一个空字符。
F:注意:double d=100,这样没毛病,但是题中是Double啊,会自动装箱, 装箱过程中调用的是Double类的valueOf( double d )方法, 而这里是100为int型, 所以编译会“cannot convert from int to Double”
答案汇总:
1、正确答案: B
2、正确答案: D
3、正确答案: D
4、正确答案: C
5、正确答案: A
6、正确答案: D
7、正确答案: B
8、正确答案: A B C
9、正确答案: B C
10、正确答案: B C F
以上部分题解来自牛客评论区,感谢评论区大佬的解释。