1、简述封装、继承、多态
1.封装:属性私有化,行为公开化,提高代码的复用性和安全性
2.继承:子类继承父类的属性和方法,使得子类对象拥有父类相同的属性和方法,提高代码的复用性,多态的前提
3.多态:同一行为的不同表现形式,父类引用指向子类对象,提高代码的可扩展性
2、 public、private、protected, default
public:公开的,不同包无关类可见
private:私有的,同类可见
protected:受保护的,不同包的子类可见
default:默认的,同包可见
3、为什么要用 clone
当我们有一个对象A时,我们想生成一个和对象A完全相同的对象B,但是对象A和对象B是相互独立的,二者的值不会相互影响,此时我们使用clone方法实现最简单
4、new 一个对象的过程和 clone 一个对象的过程区别
1.new即分配内存,先根据new后面的类型分配多大的内存空间,再进行对象初始化调用构造函数,创建填充完毕返回把地址发布到外部,然后外部就可以通过地址操控这个对象了
2.clone第一步和new一样,也是分配内存,接着调用clone方法,分配内存和原对象相同,再根据原对象填充新对象的域,填充完毕后返回新地址
5、复制对象和复制引用的区别
1.复制引用即User user = new User("zhangsan","123456");User user2 = user;打印两个对象之后我们可以得到他们的地址相同
2.复制对象即克隆对象,User user3 = User(user).clone();打印之后我们发现二者地址不同,此时已经创建了一个值相同的新对象了
6、& 和 && 的区别&运算符有两种用法
1.按位与:参与运算的两个数,按二进制位进行与运算,两个数的二进制同为1则为1
2.逻辑与:逻辑与左端为false时,会直接短路,不再计算后面,提高效率,二者为真才为真
7、在 Java 中,如何跳出当前的多重嵌套循环
在最外层for循环加标签,例如a:for(){break a;}
8、两个对象值相同 (x.equals(y) == true) ,但却可有不同的 hashCode,这句话对不对
不对,因为两个对象值相同时,它们的哈希码应当相同
9、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
值传递,Java的方法调用只支持值传递
10、重载(overload)和重写(override)的区别
重载(overload):重载实现的是编译时的多态性,即前绑定,表示同一个类中可以有多个同名不同参数列表的方法
重写(override):重写实现的是运行时的多态性,即后绑定,表示子类方法可以与父类方法名和参数列表相同,子类覆盖父类方法
11、为什么函数不能根据返回类型来区分重载(华为面试题)
函数的返回值只能作为函数运行完成后的一个状态,不能作为某个方法的标识
12、char 型变量中能不能存储一个中文汉字,为什么
char类型可以存储一个中文汉字,Java使用的是Unicode编码,char类型占2个字节(16比特)存储一个中文汉字完全可以
13、抽象类(abstract class)和接口(interface)有什么异同
1.抽象类是对根源的抽象,接口是对动作的抽象;
例如:抽象类关注的是对象是什么,男人和女人都属于人这个抽象类;接口关注的是对象能做什么,人和狗都能吃东西,它们都可以去实现吃东西这个接口
2.抽象类是单继承,接口是多继承
3.抽象类可以实现部分方法,接口只能定义方法
4.抽象类功能远多于接口,但是成本高,所以开发过程中接口使用的多
14、抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法 (native),是否可同时被 synchronized
都不能,抽象方法必须被子类重写,而静态方法是不可以被重写的;
本地方法是由本地代码实现的,而抽象方法没有实现;
synchronized和方法的实现细节有关,而抽象方法不涉及实现细节
15、阐述静态变量和实例变量的区别
静态变量即类变量,属于类,静态变量在内存中有且仅有一个拷贝,可以让多个对象共享内存
实例变量必须依赖于某一实例,通过对象访问它
16、==和 equals 的区别(高频)
1.==是比较运算符,equals为方法
2.==基本数据类型比较值相等,引用数据类型比较地址相等
3.equals不能用来比较基本数据类型,重写equals比较值相等,没重写比较地址相等
17、break 和 continue 的区别
1.break和continue都是用来控制循环的语句
2.break用于跳出循环体,continue只是跳出本次循环,继续执行下次循环
18、String s = “Hello”;s = s + " world!";这两行代码执行后,原始的 String 对象中的内容到底变了没有
没有,String为不可变类,会在字符串常量池新开辟一片Hello world的空间,然后s的引用指向这个新地址
19、Java 中实现多态的机制是什么
父类或接口定义的引用变量指向子类或实现类的实例对象,程序调用的方法在运行期间才进行动态绑定
20、Java 中异常分为哪些种类
编译时异常和运行时异常,当方法知道怎么处理异常时,可以try...catch进行处理,当不知道怎么处理时,我们只需要通过关键字throws声明异常即可
21、调用下面的方法,得到的返回值是什么
- public int getNum(){
- try {
- int a = 1/0;
- return 1;
- } catch (Exception e) {
- return 2;
- }finally{
- return 3;
- }
结果为3,finally的优先级最大
22、error 和 exception 的区别
error和exception的父类都是throwable
1.error为错误,运行程序时报错,一般与虚拟机有关,系统错误
2.exception为异常,程序员可以根据问题描述进行解决的
23、java 异常处理机制
所有异常的根类为Throwable,它派生了两个子类Error和Exception,Exception代表程序员可以解决,可以用try...catch处理或throws进行声明
24、请写出你最常见的 5 个 RuntimeException
1.空指针异常:对象不存在
2.类找不到异常:类不存在
3.类型转换异常:类型转换有误
4.数组越界异常:超过了数组的容量
5.sql异常:操作数据库时的sql语句错误
25、throw 和 throws 的区别
1.throw语句用在方法体内,throws语句用在方法声明后面
2.throw一定是抛出了某种异常,throws只是表现出现异常的一种可能性
26、final、finally、finalize 的区别
1.final:用于声明属性、方法和类,表示最终的,不可变的
2.finally:异常处理语句结构的一部分,表示总是执行
3.finalize:Object类的一个方法,垃圾回收机制回收对象时执行该方法
27、Math.round(11.5)等于多少?Math.round(- 11.5) 又等于多少
12,-11,原理是加0.5再四舍五入
28、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
能作用在byte、String上,不能作用在long上
29、数组有没有 length() 方法?String 有没有 length() 方法
数组没有length()方法,但是有length属性,String有length()方法
30、String 、StringBuilder 、StringBuffer 的区别
1.String不可变,StringBuilder和StringBuffer可变
2.String和StringBuffer安全,StringBuilder不安全
3.StringBuilder为单线程,StringBuffer的方法加了synchronized关键字为多线程,前者效率高