前言
经过一个寒假对于JavaSE的学习,也了解了不少Java的知识,通过这次考试呢,对于面向对象有了更加深刻的认识,希望通过这一次总结让我对于面向对象的掌握更加熟练。
一、选择题
1、第1题
(1)题目
下面几种类型的数组中的默认值正确的是( )(多选)(4分)
A. int类型定义的数组,初始化默认是0
B. double类型定义的数组,默认值是0.0
C. boolean类型定义的数组,默认值是true
D. char类型定义的数组,使UTF8字符集给出的结果是‘A’
正确答案:A、B
(2)题解
C. boolean类型定义的数组,默认值是false。
2、第2题
(1)题目
下列关于接口的叙述错误的是( )(多选)(4分)
A.接口中的方法默认都是静态的
B.抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法
C.接口中的方法默认是public abstract方法
D.接口中的属性,都是静态常量
E.类在实现接口的方法时,必须显式地使用public修饰符
正确答案:A、B
(2)题解
A. 抽象类中可以有普通方法也可以有抽象方法,而接口中方法只能是public abstract,所以接口中的方法并不是静态的;
B. 抽象类中可以有抽象方法,也可以有普通方法,并不是全都是抽象方法;
C. 参考A;
D. 接口中的成员变量只能是pubic static final类型的,所以属性都是静态常量;
E. 在实现类中,实现的类相当于子类,子类的访问权限是不能比父类小的,如果不写public,即缺省(friendly),则同一个包内的其它类才可访问,所以必须写public。
3、第3题
(1)题目
在多个线程访问同一个资源时,可以使用( )关键字来实现线程同步,保证对资源安全访问。 A.synchronized
B. transient
C. static
D. yield
正确答案:A
(2)题解
这个题暂时还没有学到。
4、第4题
(1)题目
以下语句中关于Java构造方法的说法错误的是()
A. 构造方法的作用是为创建对象进行初始化工作,比如给成员变量赋值
B. 一个Java类可以没有构造方法,也可以提供1个或多个构造方法
C. 构造方法与类同名,不能书写返回值类型
D. this关键字指向当前对象自身,super关键字指向当前对象的直接父类
正确答案:B
(2)题解
B. 每个类在没有声明构造方法的前提下,会自动生成一个不带参数的构造方法;如果声明了构造方法,则不会提供这个构造方法;所以Java类至少有1个构造方法。
5、第5题
(1)题目
JAVA类可以作为( )。
A.类型定义机制
B.数据封装机制
C.类型定义机制和数据封装机制
D.上述都不对
正确答案:C
(2)题解
概念
6、第6题
(1)题目
Java中接口的修饰符可以为()
A. private
B. protected
C. final
D. Abstract
正确答案:D
(2)题解
接口的方法默认是public abstract;
接口中不可以定义变量即只能定义常量(加上final修饰就会变成常量)。
所以接口的属性默认是public static final 常量,且必须赋初值。
7、第7题
(1)题目
下面选项中,哪个不是interface中合法方法定义?()
A public void main(String [] args);
B private int getSum();
C boolean setFlag(Boolean [] test);
D public float get(int x);
正确答案:B
(2)题解
A. java程序的入口必须是static类型的,接口中不允许有static类型的方法,A当中没有static修饰符,可以作为普通方法;
B. 而且接口中的方法必须是public的,接口就是希望实现的,相当于标准,接口方法必须是public,,private错误。
8、第8题
(1)题目
下题的输出结果是()
public static void main(String[] args) {
Integer a = 128, b = 128;
Integer c = new Integer(127);
Integer d = new Integer(127);
System.out.println(a == b);
System.out.println(c == d);
}
A. false,true
B.true,true
C.编译错误
D.false,false
正确答案:D
(2)题解
IntegerCache.low=-128
IntegerCache.high=127
所以a,b其实相当于new Integer(128),所以分配的空间不同,==比较地址,所以就返回flase;
c,d同理。
9、第9题
(1)题目
关于下列代码的执行顺序,下面描述正确的有哪些选项()
A.打印顺序A的静态代码块 > A的构造函数
B.打印顺序A的静态代码块 > A的构造代码块
C.打印顺序A的构造代码块 > A的构造函数
D.打印顺序A的构造函数 > A的构造代码块
正确答案:A、B、C
(2)题解
Java的类中代码块分为普通代码块、静态代码块和构造代码块
普通代码块:类中的普通方法,只有被调用才执行。
静态代码块:用 staitc 声明,JVM 加载类时执行,仅执行一次。
构造代码块:类中直接用 {} 定义,每一次创建对象时执行。
其执行顺序为:静态块 -> main() -> 构造块 -> 构造方法
注意:构造代码块 > 构造函数
10、第10题
(1)题目
在java中,下列对继承的说法,正确的是()
A.子类能继承父类的所有成员
B.子类继承父类的非私有方法和状态
C.子类只能继承父类的public方法和状态
D.子类只能继承父类的方法
正确答案:A
(2)题解
B. 子类能继承父类的所有成员,对于私有部分,只是没有访问权;
C和D都过于片面。
二、填空题
1、第1题
(1)题目
遍历数组有2种方法,分别是_____和_______
正确答案:普通for循环,和foreach循环
(2)题解
方法一:普通for循环
int[] array = {1,2,3,4,5,6,7,8,9,0};
for(int i = 0;i < array.length;i++){
System.out.print(array[i] + " ");
}
方法二:foreach循环(增强for循环)
int[] array = {1,2,3,4,5,6,7,8,9,0};
for(int element : array){
System.out.print(element + " ");
}
对比:
- foreach循环遍历的同时修改元素不会影响到原数组;普通for循环可以影响原数组;
- foreach循环不能获取元素的下标;普通for循环可以获取元素的下标;
2、第2题
(1)题目
int c = 2 | 3; c的值为_____
正确答案:3
(2)题解
|:无论第一个条件是否满足,都要执行第二个
所以最终c=3
3、第3题
(1)题目
以下程序的输出结果是______
public class Main {
static int total = 10;
public static void main (String args []) {
new Main();
}
public Main () {
System.out.print("In test ");
int temp = this.total;
if (temp > 5) {
System.out.println(temp);
}
}
}
正确答案:In test 10
(2)题解
- 先执行static int total=10;
- 然后执行main(),进入Main的无参数构造函数;
- 先打印"In test ";
- 用this访问当前类的属性total,此时temp=10;
- temp>5进入if语句,打印temp的值"10"。
4、第4题
(1)题目
下面程序_____(是/否)出错。
如果没出错,输出内容_____,
(如果出错,错误的有________行,并标出。)
public class Main {
public void static main(String[] args){
Student s = new Student();
s.name = "Hellen";
System.out.println(s);
}
}
class Student{
private String name;
private int age = 1;
public Student(){}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" + name + '-' + age + '}';
}
}
正确答案:是 2(第2行和第4行)
(2)题解
第2行:main函数是public static void main(String[] args);
第4行:name为私有的,不能在Student类外访问。
5、第5题
(1)题目
public static int divide(){
int i = 3;
try {
int a = 10/0;
return i;
} catch (Exception e) {
i = 4;
return i;
}finally{
i = 5;
}
}
运行结果为_____
正确答案:4
(2)题解
try+catch+finally的处理流程:
- 一旦产生异常,则系统会自动产生一个异常类的实例化对象;
- 那么,此时如果异常发生在try语句,则会自动找到匹配的catch语句执行,如果没有在try语句中,则会将异常抛出;
- 所有的catch根据方法的参数匹配异常类的实例化对象,如果匹配成功,则表示由此catch进行处理。
- finally,无论是否产生了异常,最终都要执行此段代码。
对于finally,唯一不执行的情况为:exit(0);即电脑关机。
回到本题:
- 对于基础数据,备份的是值,return以后,通过在栈上进行操作,无论如何改变都影响到值;
- 对于引用类型,备份的是址,return以后,通过在栈上进行操作,通过地址进行修改数值。
这里的 i 属于基础数据,在 try 语句中a=10/0产生异常,跳转至 catch 语句,return 的 i = 4,在 finally 语句中虽然改变了 i,但是并没有改变返回值4。
6、第6题
(1)题目
下列程序输出结果分别为____ ____
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s3));
正确答案:true true
(2)题解
对于String s1 = “abc”;String s2 = “abc”;
“abc"在方法区上,属于s1和s2共享的部分,所以s1和s2指向同一块区域,即地址相同。
对于String s3 = new String(“abc”);
new了一块区域在堆上,其内容为"abc”;
s1 == s2:比较地址,s1和s2相同,返回true;
s1.equals(s3):比较内容,s1和s3相同,返回true。
7、第7题
(1)题目
写出下列代码的运行结果___________
public class Test1 {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3;
Integer f1 = 100, f2 = 100;
int c = 3;
System.out.println(a == b);
System.out.println(a == c);
System.out.println(f1 == f2);
}
}
正确答案:
false
true
true
(2)题解
对于a和b:
a在堆上;因为-128<3<127,所以b在方法区;所以a和b地址不同;a=b返回false;
对于a和c:
Integer 的自动拆箱功能,也就是比较两个基本数据类型,结果为true;
对于f1和f2:
同上,f1和f2满足Integer的范围,均在方法区,公用一块区域,地址相同;结果为true。
8、第8题
(1)题目
写出下列代码的运行结果____________
class A {
static {
System.out.print("1");
}
public A() {
System.out.print("2");
}
}
class B extends A{
static {
System.out.print("a");
}
public B() {
System.out.print("b");
}
}
public class Test2 {
public static void main(String[] args) {
A ab = new B();
ab = new B();
}
}
正确答案:1a2b2b
(2)题解
执行顺序为:静态块 -> main() -> 构造块 -> 构造方法
- 先执行静态代码块:打印1a;
- 进入main函数,new B();
- 构造子类先构造父类,打印2;
- 构造子类,打印b;
- 回到main函数,再次new B();
- 重复3,4。
注意:静态代码块只执行一次!!!
三、简答题
1、第1题
(1)题目
Java 中的几种基本数据类型是什么?默认值分别是多少?各自占用多少字节呢?对应的包装类型是什么?
2、第2题
(1)题目
简述==与equals的区别
3、第3题
(1)题目
面向对象程序的三个特征是什么?并谈谈自己对面向对象的理解。
封装型,继承性,多态性
4、第4题
(1)题目
构造方法有哪些特点?构造器(constructor)是否可被重写(override)?为什么?
特点:
- 名字与类名相同。
- 没有返回值,但不能用 void 声明构造函数。
- 生成类的对象时自动执行,无需调用。
不可以。重写是针对在子类中可以继承父类的方法,而构造器根本不能被子类继承,不满足重写的条件。
5、第5题
(1)题目
this和super关键字的作用?
- this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题;
- this可以调用成员变量,不能调用局部变量;
- this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省略,必须是构造方法的第一条语句。而且在静态方法当中不允许出现this关键字。
- super代表对当前对象的直接父类对象的引用,super可以调用直接父类的成员变量(注意权限修饰符的影响,比如不能访问private成员)
6、第6题
(1)题目
成员变量与局部变量的区别有哪些?
7、第7题
(1)题目
Java中& 和 && 的区别?
共同点:都具有逻辑运算符与的功能
不同点:&&:具有短路的效果,当有两个条件的时候如果第一个条件不成立那么就不会判断第二个条件。
8、第8题
(1)题目
String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是 不可变的?
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
String 类中使用 final 关键字修饰字符数组来保存字符串,
private final char value[] ,所以 String 对象是不可变的。
9、第9题
(1)题目
简述重载和重写的区别
重载
发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不
同、顺序不同,方法返回值和访问修饰符可以不同。
重写
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。
- 返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修
饰符范围大于等于父类。 - 如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是
被 static 修饰的方法能够被再次声明。 - 构造方法无法被重写
总结
这次考核总体还可以,在一些细小的知识点上有所欠缺,同时做题的时候也有些马虎,不过也通过这次考核巩固了自己关于面向对象的了解,同时帮助自己查缺补漏,完善自己的基础。继续加油吧,fighting!