一、选择题
1.性事务的原子是指()。正确答案: B
A.事务一旦提交,对数据库的改变是永久的。
B.事务中包括的所有操作要么都做,要么都不做。
C.一个事务内部的操作及使用的数据对并发的其他事务都是隔离的。
D.事务必须使数据库从一个一致性状态变到另一个一致性状态。
解释:
举个例子:
A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:
1. 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。
2. 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。
如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。
我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。
如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。
2.关于抽象类和接口描述不正确的有()。正确答案: BC
A.抽象类和接口都用于抽象。
B.抽象类有多重继承的功能。
C.接口中可以有自己的实现。
D.接口中定义的变量必须给其初值,实现类中不能重新定义,也不能改变其值。
解释:
JDK1.8以后的默认(default)方法和静态(static)方法可以有方法体,题目的方法应该是指普通方法
二、简答题
1. Java中,有继承关系时,变量隐藏的原则?
子类中变量名与继承自父类的变量名相同时,则继承自父类的变量将被隐藏。
2. Java中,是否支持多继承?
不支持。
1)、为什么Java只能单继承?
因为在C++中一个类是可以继承多个类,但这样的机制会使类的结构变得很复杂,所以Java将这一机制通过接口得以改善。Java中不允许类多继承,只能单继承。单继承使得Java简单,易于管理,不会出现逻辑错误以及多继承自身的缺陷。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口,从而在另一个更合理的角度来实现纯粹的多继承性。因此,通常可以采用实现多个接口的方式间接达到多重继承的目的。
2)、Java中类不能实现多继承的原因
如果类之间实现了多继承,会造成程序的紊乱。如果一个子类同时继承了两个父类,而这两个父类拥有相同的属性或方法,子类调用的时候系统不知道该调用哪个父类的属性或方法,会使程序报错。
3.重载方法是如何进行匹配的?
在方法调用进行匹配的时候,首先选择直接匹配的方法;如果没有则将参数进行提升转换后再匹配方法,总是匹配最接近的方法,依次按照下列规则来判断:
精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针、T到const T;
提升匹配:即整数提升(如bool到int、char到int、short到int),float到double;
使用标准转换匹配:如int到double、double到int、double到long double、Derived*到Base*、T*到void*、int到unsigned int;
使用用户自定义匹配;
4. 一个引用类型的变量可以指向哪些对象?
一个引用类型的变量可以指向由其本类所构造出来的对象,还可以指向由其子类及子孙类所构造出来的对象。
5. 什么时候为类中的实例变量分配内存空间?
在使用类创建实例对象时会为其分配空间。(通过new关键字和构造函数为其实例化的时候)
6. 普通类和抽象类有哪些区别?
关键点:abstract修饰符(抽象方法)、具体实现过程、实例化、子类实现父类的抽象方法
普通类中不可含有抽象方法,可以被实例化;
抽象类,则抽象类中所有的方法自动被认为是抽象方法,没有实现过程,不可被实例化;抽象类的子类,除非也是抽象类,否则必须实现该抽象类声明的方法
7. 如何将字符串反转?
1).利用 StringBuffer 或 StringBuilder 的 reverse 成员方法:
// StringBuffer
return new StringBuffer(str).reverse().toString();
// StringBuilder
return new StringBuilder(str).reverse().toString();
2). 利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接:
// toCharArray
char[] chars = str.toCharArray();
String reverse = "";
for (int i = chars.length - 1; i >= 0; i--) {
reverse += chars[i];
}
return reverse;
3). 利用 String 的 CharAt 方法取出字符串中的各个字符:
// charAt
String reverse = "";
int length = str.length();
for (int i = 0; i < length; i++) {
reverse = str.charAt(i) + reverse;
}
return reverse;
8. Http中的GET与POST的区别?
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST么有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
9. 说说反射的用途及实现?
反射的功能:
在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架
反射的用途:
Java 反射机制是一个非常强大的功能,在很多的项目比如 Spring,MyBatis 都都可以看到反射的身影。通过反射机制,我们可以在运行期间获取对象的类型信息。利用这一点我们可以实现工厂模式和代理模式等设计模式,同时也可以解决 Java 泛型擦除等令人苦恼的问题。
反射的实现:
获取一个对象对应的反射类,在 Java 中有下列方法可以获取一个对象的反射类
- 通过
getClass()
方法 - 通过
Class.forName()
方法 - 使用
类.class
- 通过类加载器实现,
getClassLoader()
10. Final 有什么作用?
1)、final修饰变量:表示该变量一旦被初始化值之后就不可能被改变。
a、如果修饰的是成员变量,则必须显示初始化值,而局部变量则无此限制。
b、如果是基本类型,则基本类型的值不能发生变化;
c、如果是引用类型,其引用地址不会发生变化,但该对象的堆内存的值可以发生变化。
2)、final修饰方法:表示该方法不能被重写。如果不希望子类重写父类的方法时,可以使用。
3)、final修饰类:表示该类不能被继承。