基本信息
文件名称:Java面向对象面试题及答案.docx
文件大小:27.5 KB
总页数:5 页
更新时间:2025-09-25
总字数:约3.57千字
文档摘要

Java面向对象面试题及答案

1.什么是封装?除了用private修饰字段,封装还需要注意什么?

答案:封装本质是“隐藏内部细节,暴露安全接口”,核心目的是避免外部直接操作对象内部状态导致不可控问题。

除了用private修饰字段(禁止外部直接访问),还需要:

提供public的get/set方法作为访问入口,且在方法中加入逻辑校验(比如年龄字段setAge()时,判断参数是否在0-150之间,非法值直接抛异常);

避免在get/set方法中暴露过多细节(比如不要返回内部集合的原引用,应返回副本,防止外部修改集合内容);

核心业务逻辑封装在类内部方法中,外部只需调用方法,无需关心实现(比如User类的register()方法,内部包含手机号校验、密码加密,外部只需传参数调用)。

2.子类继承父类时,构造方法的调用顺序是怎样的?如果父类没有无参构造,子类会报错吗?

答案:调用顺序是“先父类构造,再子类构造”。

具体流程:子类构造方法执行时,会先隐式调用父类的无参构造(相当于第一行默认加了super()),父类构造执行完后,才执行子类构造的代码。

如果父类没有无参构造(比如父类只写了带参构造Person(Stringname)),子类会直接编译报错。因为子类默认要调用父类无参构造,但父类不存在该构造,此时必须在子类构造中显式用super(参数)调用父类的带参构造,且super()必须写在子类构造的第一行。

示例:

classPerson{

//父类无无参构造,只有带参构造

publicPerson(Stringname){}

}

//子类必须显式调用父类带参构造

classStudentextendsPerson{

publicStudent(Stringname){

super(name);//不写这行就报错

}

}

3.Java的多态怎么实现?除了重写,还有其他方式吗?

答案:多态核心是“同一行为,不同实现”,实现需满足三个条件:继承(或实现接口)、重写、父类/接口引用指向子类对象。

常见实现方式有两种:

继承+重写(运行时多态):比如父类Animal有方法eat(),子类Cat重写eat()为“吃猫粮”,Dog重写为“吃狗粮”,声明Animala=newCat()时,调用a.eat()会执行Cat的实现;

接口+实现(运行时多态):比如接口Shape有draw()方法,Circle和Square分别实现draw(),声明Shapes=newCircle(),调用s.draw()会执行Circle的实现;

另外,方法重载(Overload)是“编译时多态”,虽然不算严格意义的面向对象多态,但也是Java中“同一方法名不同行为”的实现方式(比如Math.abs()可以接收int、long等不同参数,编译时就确定调用哪个方法)。

4.接口和抽象类的区别?实际开发中怎么选?

答案:核心区别在“设计定位”——接口是“行为契约”,抽象类是“模板骨架”:

维度

接口

抽象类

方法

Java8前全是抽象方法,后可加default/static方法

可包含抽象方法和具体实现方法

字段

只能是publicstaticfinal常量

可包含任意修饰符的字段

继承/实现

一个类可实现多个接口

一个类只能继承一个抽象类

设计目的

定义“能做什么”,解耦行为与实现

定义“是什么”,复用共性实现

实际选择场景:

若多个不相关的类需要统一行为(比如“可序列化”“可比较”),用接口(比如Serializable、Comparable);

若多个相关的类有共性实现(比如ArrayList、LinkedList都属于List,有共同的size()、isEmpty()实现),用抽象类(比如AbstractList封装共性逻辑,子类只需实现差异化的get()、add());

若需要同时满足“多行为契约”和“共性实现”,可以让抽象类实现接口(比如AbstractMap实现Map接口,既遵守Map契约,又封装共性逻辑)。

5.Java是值传递还是引用传递?举个例子说明

答案:Java只有“值传递”,没有引用传递。区别在于:

传递基本类型时,传的是“值的副本”(修改副本不影响原变量);

传递引用类型时,传的是“引用地址的副本”(副本和原引用指向同一个对象,修改对象内容会影响原对象,但修改副本的指向不会影响原引用