2019 Java面试必备:全面解析面向对象与核心技术

需积分: 10 158 下载量 21 浏览量 更新于2024-07-17 17 收藏 2.17MB PDF 举报
"2019最全的java面试题" 这篇资料主要涵盖了2019年的Java面试重点,包含145页内容,总计63542字,全面讨论了Java语言的核心概念、框架以及算法相关内容,旨在帮助准备Java面试的人员进行全面复习。 一、Java基础知识 1. 面向对象的特性 - 抽象:抽象是创建类的过程,它关注对象的共性,包括数据抽象和行为抽象,目的是忽略细节,专注于核心功能。 - 继承:继承使得新类可以从已有类获取属性和行为,父类提供信息,子类继承并可能扩展这些信息,增强了代码的复用性和适应性。 - 封装:封装是将数据和操作数据的方法绑定,对外只暴露必要的接口,隐藏实现细节,提高了代码的安全性和维护性。 - 多态性:多态性允许不同的对象对同一消息做出不同的响应,分为编译时多态(方法重载)和运行时多态(方法重写)。 二、方法重载与方法重写 - 方法重载(Overload):发生在同一类中,方法名相同但参数列表不同(参数个数、类型或顺序不同),编译时确定调用哪个方法。 - 方法重写(Override):发生在子类对父类方法的重新定义,保持方法名、返回类型和参数列表不变,但可以改变其实现,运行时动态决定调用哪个方法。 三、Java面向对象设计原则 - 开闭原则:软件实体(类、模块、函数等)应对扩展开放,对修改关闭。 - 单一职责原则:一个类或模块应该只有一个引起它变化的原因。 - 里氏替换原则:子类必须能够替换它们的基类,而不影响程序的正确性。 - 接口隔离原则:客户端不应该依赖它不需要的接口,即接口应尽可能小且专业。 - 依赖倒置原则:依赖于抽象而不是具体实现,高层模块不应依赖低层模块,两者都应依赖其抽象。 四、Java集合框架 - List、Set、Map是Java集合框架的核心接口,它们各自有对应的实现类,如ArrayList、LinkedList、HashSet、HashMap等。 - 泛型的使用可以增强类型安全,避免在运行时进行强制类型转换。 五、异常处理 - Java异常处理通过try-catch-finally语句块来捕获和处理运行时错误,保证程序的健壮性。 - 自定义异常可以通过继承Exception类或其子类来实现。 六、线程与并发 - Java提供了Thread类来创建和管理线程,线程同步机制包括synchronized关键字、wait()、notify()和notifyAll()方法,防止数据竞争问题。 - volatile关键字用于确保多线程环境下的可见性和有序性。 - Executors框架提供了更高级的线程池管理。 七、JVM内存模型 - JVM内存主要分为堆内存、栈内存、方法区、程序计数器和本地方法栈,理解它们的工作原理对于优化程序性能至关重要。 八、垃圾回收与内存管理 - 垃圾回收机制自动回收不再使用的对象,减少内存泄漏。 - 分代收集策略根据对象的生命周期将内存划分为新生代、老年代等区域,提高回收效率。 九、设计模式 - 设计模式是解决软件设计中常见问题的模板,例如单例模式、工厂模式、观察者模式等,它们是经验的总结,可以提高代码的可读性和可维护性。 以上只是部分内容概述,完整的资料包含了更多Java核心技术、框架(如Spring、MyBatis等)以及算法的面试题目,对于准备Java面试或巩固Java知识的人来说是一份宝贵的资源。
2012-07-18 上传
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double  引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 7、String 和StringBuffer的区别  JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。 8、运行时异常与一般异常有何异同?  异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 10、说出ArrayList,Vector, LinkedList的存储性能和特性  ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Ses
2013-10-29 上传
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? Overload是重载的意思,Override是覆盖的意思,也就是重写。 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。 至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。 override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点: 1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果; 2、覆盖的方法的返回值必须和被覆盖的方法的返回一致; 3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类; 4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。 overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点: 1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int)); 2、不能通过访问权限、返回类型、抛出的异常进行重载; 3、方法的异常类型和数目不会对重载造成影响; 4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。