Java面向对象高频面试题及详细答案(实战版)_第1页
Java面向对象高频面试题及详细答案(实战版)_第2页
Java面向对象高频面试题及详细答案(实战版)_第3页
Java面向对象高频面试题及详细答案(实战版)_第4页
Java面向对象高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java面向对象高频面试题及详细答案(实战版)一、基础概念类1.谈谈你对Java面向对象的理解?和面向过程有什么区别?面向对象是Java的核心编程思想,核心是把所有事物抽象成对象,通过封装、继承、多态三大特性管理代码,以对象为核心关注行为和属性;而面向过程是以步骤为核心,关注具体的执行流程和步骤顺序。简单来说,面向过程是“怎么做”,面向对象是“谁来做”。二者核心区别:编程思路:面向过程线性执行,步骤化编程;面向对象模块化,基于对象拆分功能复用性:面向过程代码冗余高、复用性差;面向对象通过类和继承,代码复用性极强维护性:面向过程代码耦合度高,修改一处可能牵动全局;面向对象低耦合、高内聚,便于迭代维护适用场景:面向过程适合简单小功能;面向对象适合大型、复杂、可迭代的项目2.什么是类和对象?二者的关系是什么?类是对一类事物的抽象模板,定义了事物的属性(成员变量)和行为(成员方法),是抽象、静态的概念,本身不占用内存。对象是类的具体实例,是真实存在的个体,创建后会占用堆内存,具备类定义的所有属性和行为。二者关系:类是对象的模板,对象是类的实例。一个类可以创建多个不同的对象,每个对象相互独立,属性值可以不同。3.Java中基本数据类型和引用数据类型的区别?基本数据类型包含8种:byte、short、int、long、float、double、char、boolean,其余所有类型(类、接口、数组、字符串)都是引用数据类型。核心区别:内存存储:基本类型变量直接存储数值,存在栈内存;引用类型变量存储的是对象的内存地址,对象本体存在堆内存默认值:基本类型有固定默认值(int默认0、boolean默认false);引用类型默认值为null传递方式:基本类型是值传递,方法内修改参数不影响原数据;引用类型传递的是地址,方法内修改对象属性会影响原对象创建方式:基本类型直接赋值即可;引用类型需要new创建对象(部分常量池例外,如String)二、三大特性核心面试题(高频必考)1.详细说说面向对象三大特性:封装、继承、多态(1)封装封装的核心是隐藏内部细节,暴露公共访问方式。通过private修饰成员变量,禁止外部直接访问,通过public的get/set方法操作属性。作用:保护数据安全性、降低代码耦合度、统一数据校验入口,后续修改内部逻辑无需改动外部调用代码。(2)继承继承是子类复用父类代码的机制,使用extends关键字实现,子类可以拥有父类的非私有属性和方法,同时可以扩展自己的独有功能。Java继承特点:单继承,一个子类只能有一个直接父类,一个父类可以有多个子类;可以多层继承。作用:大幅提高代码复用性、简化代码结构、为多态提供基础。(3)多态多态核心是一个行为,多种实现,父类引用指向子类对象,在程序运行时根据真实对象类型执行对应的方法实现。多态实现前提:继承、方法重写、父类引用指向子类对象。作用:提高代码扩展性、灵活性,符合开闭原则,新增子类无需修改原有核心代码。2.方法重写和重载的区别?(超级高频)二者都是Java多态的体现,重载是编译期多态,重写是运行期多态,核心区别如下:对比维度重载(Overload)重写(Override)定义范围同一个类中子类和父类之间方法名必须相同必须相同参数列表必须不同(个数、类型、顺序)必须完全一致返回值无要求,可随意修改协变返回(子类返回值可小于等于父类)修饰符无权限限制权限不能比父类更严格异常无要求不能抛出比父类更大的异常多态类型编译期多态运行期多态补充:重载看方法参数,编译阶段就确定调用哪个方法;重写看对象类型,运行阶段才确定执行逻辑。3.继承中父类静态方法可以被重写吗?为什么?不可以,父类的静态方法不能被子类重写。静态方法属于类本身,在编译阶段就绑定了类信息,是静态绑定;而重写是运行期动态绑定,针对对象实例生效。如果子类定义和父类一模一样的静态方法,本质是方法隐藏,并非重写。父类引用调用静态方法,执行的是父类逻辑;子类引用调用,执行的是子类逻辑,和多态无关。三、修饰符与关键字面试题1.private、default、protected、public四大权限修饰符的区别?权限范围从小到大:private<default(包私有)<protected<publicprivate(私有的):仅当前类内部可访问,项目所有其他类都无法访问default(默认,不写修饰符):当前包内所有类可访问,跨包无法访问protected(受保护的):同包所有类可访问,跨包的子类可以继承访问,跨包无关类无法访问public(公共的):全局所有类、所有包都可访问,无权限限制开发规范:成员变量一律private,方法根据业务按需开放,尽量最小权限原则。2.final、finally、finalize的区别?(经典面试题)三个单词看似相似,功能完全无关,是Java高频易混点:final:是修饰符

修饰变量:变量变为常量,只能赋值一次,不可修改修饰方法:方法不可被重写修饰类:类不可被继承finally:是异常处理关键字

搭配try-catch使用,代码块一定会执行(除JVM退出等极端情况)常用于资源释放,比如关闭流、关闭数据库连接finalize:是Object类的废弃方法

原本用于垃圾回收前的资源收尾,JDK9之后已被废弃不推荐使用,垃圾回收时机不可控,容易导致内存泄漏3.static关键字的作用和特点?static可以修饰变量、方法、代码块、内部类,核心特点:属于类,不属于对象,随着类加载而初始化,优先于对象存在。静态变量:全局共享,所有对象共用一份内存,可通过类名直接调用静态方法:只能访问静态成员,不能直接使用this、super,不能访问非静态变量和方法静态代码块:类加载时仅执行一次,常用于初始化静态资源、加载配置文件注意:静态资源常驻内存,滥用static容易导致内存占用过高、内存泄漏。四、构造方法与对象初始化1.构造方法的特点?构造方法可以被重写、重载吗?构造方法核心特点:方法名和类名完全一致、无返回值、创建对象时自动调用,作用是初始化对象属性。权限默认跟随类,子类不会继承父类构造方法。能否重写/重载:不能重写:构造方法属于类独有,子类无法继承,自然不能重写可以重载:一个类可以定义多个参数不同的构造方法,实现对象不同方式的初始化2.Java对象的初始化顺序?(高频笔试+面试)完整初始化优先级:静态资源>实例资源>构造方法,存在继承时顺序如下:父类静态代码块、父类静态变量(类加载阶段,仅执行一次)子类静态代码块、子类静态变量父类实例变量、父类普通代码块父类构造方法子类实例变量、子类普通代码块子类构造方法核心口诀:静态先行、父先子后、实例随构造。3.this和super关键字的作用?this关键字(代表当前对象)区分成员变量和局部变量(解决变量重名)调用本类的其他构造方法:this(),必须放在代码第一行代表当前对象本身,可以作为参数、返回值传递super关键字(代表父类对象)访问父类的非私有成员变量、成员方法调用父类构造方法:super(),必须放在子类构造方法第一行区分父子类重名的属性和方法注意:this()和super()不能同时出现在一个构造方法中。五、抽象类与接口(核心难点)1.抽象类和接口的区别?(必问)对比维度抽象类(abstractclass)接口(interface)继承实现单继承,一个类只能继承一个抽象类多实现,一个类可以实现多个接口构造方法有构造方法,供子类初始化调用无构造方法,不能实例化成员变量可定义普通变量、常量、静态变量默认是publicstaticfinal常量,不可修改方法类型抽象方法、普通方法、静态方法都可定义JDK8前只有抽象方法,JDK8支持默认方法、静态方法,JDK9支持私有方法权限修饰可使用四种权限修饰符方法默认public,只能用public设计思想模板设计,定义子类通用模板和通用逻辑行为规范,定义类必须具备的功能,不关注实现2.抽象类可以有构造方法吗?可以被实例化吗?抽象类可以有构造方法,但是不能直接new实例化。抽象类的构造方法不是用来创建自身对象,而是供子类继承后,在子类构造方法初始化时调用,完成父类通用属性的初始化。如果抽象类没有无参构造,子类必须显式通过super调用父类有参构造,否则编译报错。3.JDK8接口的新特性是什么?有什么作用?JDK8之前接口只能定义抽象方法,扩展性极差,一旦新增方法,所有实现类都必须重写,否则报错。JDK8新增两种接口方法:默认方法(default):有方法体,实现类可以直接使用,也可以重写,新增功能不影响原有实现类,解决接口迭代兼容问题静态方法(static):属于接口本身,只能通过接口名调用,实现类无法继承六、Object类核心面试题1.Object类有哪些常用方法?各自作用?Object是所有类的根父类,所有类默认直接或间接继承Object,核心常用方法:equals():对比两个对象内容是否相等,默认对比地址,开发中需要重写hashCode():返回对象哈希值,用于集合存储,和equals成对重写toString():返回对象字符串描述,默认打印地址,开发中默认重写getClass():获取对象的运行时类对象,反射核心方法wait()/notify()/notifyAll():线程等待、唤醒方法,用于线程通信2.==和equals的区别?(最基础也最常问)==:是运算符

比较基本类型:对比数值是否相等比较引用类型:对比对象内存地址是否相同equals():是Object类方法

默认实现和==一致,对比地址String、Integer等包装类重写了equals,用于对比对象内容开发规范:对比字符串、实体类对象内容,一律使用equals;基本类型对比使用==。3.为什么重写equals必须重写hashCode?核心原则:两个对象equals相等,hashCode必须相等;hashCode相等,对象不一定equals相等。如果只重写equals不重写hashCode,会出现逻辑漏洞:两个内容完全相同的对象,equals返回true,但hashCode不同。这会导致在HashMap、HashSet等哈希集合中,相同内容的对象会被判定为不同对象,重复存储,造成数据错乱、去重失效。七、综合场景面试题1.说说你对多态的实际应用场景?日常开发中多态应用非常广泛,举例常见场景:集合多态:List<String>list=newArrayList<>();父类引用指向子类对象,后续可无缝切换LinkedList,无需修改业务代码业务场景扩展:定义支付接口Pay,子类实现微信支付、支付宝支付、银行卡支付,统一调用接口方法,不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论