11、&和&&的区别
&运算符有两种用法:(1)按位与,(2)逻辑与。这里只说逻辑与,按位与会放到位运算解释。&和&&都表示和,但是使用&时,&两边都要进行判断;而使用&&时,只要左边为false则直接返回false,相当于“短路”,所以&&称为“短路与”。&&会减少判断的次数,也可以用在特定的场景,例如:list != null && list.size() != 0;这个时候,想要进行&&右边的判断,必须保证左边成立,这也是&&最常用的用法。
12、>>和<<的用法
这两个都是位运算,分别表示右移三位和左移三位,是二进制的运算,例如:2<<3,相当于2乘以2的三次方,二进制表示为000010变为了010000,转换成十进制就是2变为16;右移相当于除以2的三次方,会丢失精度。例如:ArrayList的扩容grow方法:newCapacity = oldCapacity + (oldCapacity >> 1),当oldCapacity=15时,oldCapacity >> 1就是从001111变为了000111,也就是15变为了7。此处一定注意!
13、Math.round(1.5)等于多少,Math.round(-1.5)呢
Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1。这个四舍五入的原理是在参数上加0.5再向下取整。
14、重写(override)和重载(overload)的区别是什么
重写发生在子父类之间,判断条件是方法名、参数列表都相同,返回值类型小于等于父类;重载发生在一个类中,判断条件是方法名相同,参数列表不同(参数类型、个数不同或两者都不同)。注:返回值类型不能用来判断是否是重载,因为返回值类型是方法运行后的状态表达,而在编译过程中,更在意的是语法是否通顺,返回值类型的定义不定义和使用不使用无必然联系,定义了在某种场景下也可能不会使用,假如这时还有一个本来就无返回值的方法,那编译器就判断不了调用的是哪个方法,这样就会产生歧义,为了避免这种歧义发生,就设定规则,仅用返回值类型不能区分重载。
15、构造器是否可以被重写
构造器不能被继承,也就不能被重写,但可以重载。
16、抽象类和接口有哪些区别
- 抽象类用abstract修饰,接口用interface修饰;
- 抽象类被子类继承,接口被子类实现;
- 抽象类可以定义构造器,接口不可以;
- 抽象类可以定义成员变量,接口只能定义常量;
- 抽象类中的成员可以被任意权限修饰符修饰,接口只能是public;
- 抽象类有抽象方法和普通方法,接口只有抽象方法(JDK1.8之后加入了默认方法和静态方法)。
17、抽象方法是否能被static修饰,是否可同时是本地方法,是否能被synchronized修饰
都不能,抽象方法需要被重写,而static修饰的方法不能被重写;本地方法是由本地代码(如C代码)实现的方法,而抽象方法没有实现;Synchronized和方法的实现细节有关,而抽象方法没有实现。故,都是矛盾的。
18、接口是否可继承接口,抽象类是否可实现接口,抽象类是否可继承具体类
接口可以继承接口,且支持多继承;抽象类可以实现接口;抽象类可继承具体类也可以继承抽象类。
19、静态变量和实例变量有什么区别
静态变量是被static修饰的变量,属于类,一个类不管创建了多少对象,在内存中只有一份静态变量,所有类共用这一份静态变量;实例变量依存于具体对象,每个对象都有自己的实例变量。
20、final的用法
被final修饰的类不能被继承,修饰的变量在赋值后不能被修改(常量),修饰的方法不能被重写。