- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
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只有“值传递”,没有引用传递。区别在于:
传递基本类型时,传的是“值的副本”(修改副本不影响原变量);
传递引用类型时,传的是“引用地址的副本”(副本和原引用指向同一个对象,修改对象内容会影响原对象,但修改副本的指向不会影响原引用
文档评论(0)