1、面向对象的特征
- 抽象
- 继承
- 封装
- 多态:重载和重写
2、访问修饰符public、private、protected以及不写(默认)时的区别
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | x |
default | √ | √ | x | x |
private | √ | x | x | x |
3、String是最基础的数据类型吗
不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型,剩下的都是引用类型
4、float f=3.4;是否正确
错误。3.4是double类型,将double类型赋给float属于下转型,会造成精度损失。因此需要强制类型转换float f =(float) 3.4;或者写成float f = 3.4F
5、short s1 = 1;s1 = s1 + 1;有错吗?short s1 = 1;s1 += 1;有错吗?
对于short s1 = 1;s1 = s1 + 1;由于1是int类型,因此s1 + 1运算结果也是int类型,需要强制转换类型才能赋值给short;
short s1 = 1;s1 += 1;可以正确编译因为s1 += 1;相当于s1 = (short)(s1+1);其中有隐含的强制类型转换。
6、int和Integer有什么区别?为什么要有包装类?
int的包装类型就是Integer。从Java5开始引入了自动装箱/拆箱机制。
基本数据类型是指不可再分的原子数据类型,内存中直接存储此类型的值,通过内存地址即可直接访问到数据,并且此内存区域只能存放这种类型的值。
包装类及其作用
因为Java的设计理念是一切皆为对象,在很多情况下,需要以对象的形式操作,比如hashCode()获取哈希值,或者getClass()获取类等
在Java中每个基本类型都对应一个包装类,包装类的存在解决了基本数据类型无法做到的事情泛型类型参数、序列化、类型转换、高频区间数据缓存等问题
基础类型 | 包装类型 |
---|---|
int | Integer |
short | Short |
byte | Byte |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int和Integer的区别
- 数据类型不同:int是基本数据类型;Integer是包装数据类型
- 默认值不同:int的默认值是0;Integer的默认值是null
- 内存中存储的方式不同:int在内存中直接存储的是数据值。而Integer实际存储的是对象引用,当new一个Integer时实际上是生成一个指针指向此对象
- 实例化方式不同:Integer必须实例化才可以使用,而int不需要
- 变量的比较方式不同:int可以使用 == 来对比两个变量是否相等,而Integer一定要使用 equals 来比较两个变量是否相等
7、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math.round(11.5) = 12
Math.round(-11.5) = -11
四舍五入的原理在参数上加0.5然后向下取整得到结果
8、switch(expr),expr是否能是byte,是否能是long,是否能是String?
Java5以前,expr只能作用在byte、short、char、int
Java5开始,Java中引入了枚举类型,expr也可以是枚举类型
Java7开始,expr还可以是字符串,但是长整型long在目前所有的版本中都是不可以的
9、数组有没有length()方法?String中有没有length()方法?
数组没有length()方法,有length的属性。
String有length()方法
10、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
- 方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。
- 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载
- 重写发生在子类和父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。重载对返回类型没有特殊要求。
11、构造器是可以被重写(override)
构造器不能被继承,因此不能被重写,但可以被重载
12、两个对象相同(x.equals(y) == true),但却可有不同的hase code。这句话对吗?
不对,如果两个对象x和y满足x.equals(y) == true,他们的哈希码(hash code)应当相同。
Java对于equals方法和hashCode方法是这样规定的:
- 如果两个对象相同(equals方法返回true),那么它们的haseCode值一定要相同;
- 如果两个对象的haseCode相同,它们并不一定相同。
13、是否可以继承String类
String类是final类,不可以被继承
14、String和StringBuilder、StringBuffer的区别?
- String是只读字符串,也就意味着String引用的字符串内容是不能改变的。
- StringBuilder/StringBuffer表示的字符串对象可以直接进行修改。
- StringBuilder是Java5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被Synchronized修饰,因此它的效率也别StringBuffer要高
15、抽象类(abstract class)和接口(interface)有什么异同?
- 抽象类和接口都不能被实例化,但可以定义抽象类和接口类型的引用。
- 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
- 接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
- 抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全部都是public的。
- 抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
- 有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
。。。。后续持续更新。。。。。