您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 高级软件工程师面试题
高级软件工程师、项目经理面试题1、类、对象的概念?2、简述抽象?3、接口与抽象类?4、内部类(InnerClass)?5、访问修饰符限制?6、Static、final、abstract、native、synchronized关键字的使用?11、运行时异常与一般异常有何异同?14、Http与Https?16、J2EE的容器与服务器?17、继承限制?19、列举常见集合框架类型?20、面向对象的特征?23、设计模式?26、存储过程和函数的区别?27、游标的作用?如何知道游标已经到了最后?29、你经常看或仔细研读过的书有哪些?高级软件工程师面试题答案类、对象的概念:1)类:具有共同属性和行为的对象的抽象。类是创建对象的模板。2)对象:现实世界中的实体。在计算机中,是指可标识的存储区域。3)类是对象的抽象、对象是类的实例。抽象:是从特定的实例中抽取共同性质形成一般化概念的过程。接口与抽象类:1)接口和抽象类都用于抽象,接口是抽象类的抽象。2)接口中只有方法声明,没有实现(无方法体);在接口中声明的方法具有public和abstract属性,一个类可以实现多个接口(即多继承),接口以‘,’分隔;接口中的方法必须全部实现。3)抽象类可以有部分方法实现,抽象类必须通过继承才能使用。内部类(InnerClass):1)内部类是嵌套在另一个类中的类。2)内部类用于名称隐藏和程序代码的组织,另外内部类拥有直接访问其外部类所有成员(包括private的)的权限(无需任何关键字修饰)。3)内部类不可以在其他类或main方法里实例化,必须使用如下方法(非静态内部类)外部类.内部类对象名=new外部类().new内部类();静态内部类调用方式:外部类.内部类对象名=new外部类.内部类();4)非静态内部类不可以声明静态成员;静态内部类的非静态成员可以访问其外部类的静态成员,声明为静态的成员不可以访问外部的非静态成员。访问修饰符限制:Privateprotectedfriendly(default)public同类YYYY同包不同类NYYY同包子类NYYY不同包不同类NNNY不同包子类NYNYStatic关键字的使用:1)类成员,直接使用类名.成员调用。2)静态方法只能访问静态成员。3)静态方法不能使用this、super关键字。4)静态方法不能被非静态方法重写或重载。final关键字:1)被final修饰的变量为常量不能改变。2)被final修饰的方法不可以重写。3)被final修饰的类不能被继承。abstract关键字:1)被abstract修饰的类不能实例化。2)被abstract修饰的方法只能在子类中实现。native关键字:非Java语言的编写,例如JNI技术。synchronized关键字:多线程的同步访问控制。11、运行时异常与一般异常有何异同?异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。(Throwable是所有Java程序中错误处理的父类,有两种资类:Error和Exception。Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。Exception:表示可恢复的例外,这是可捕捉到的。Java提供了两类主要的异常:runtimeexception和checkedexception。checked异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。但是另外一种异常:runtimeexception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。异常处理的目标之一就是为了把程序从异常中恢复出来。)14、Http与Https:Https即多了安全的Http,s(SecuritySocketLayer)指加密套接字协议层(简写SSL)。17、继承限制:父类对象不可以赋给子类对象,因为子类可能具有更多的成员,反之可以。19、列举常见集合框架类型:1)List、Set、Map。由这三个接口实现出ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等常用集合框架。2)Vector属于重量级组件不推荐使用。3)Map类型维护键/值对,Hashtable与HashMap相近但效率略低于HashMap、高于TreeMap,TreeMap优点是可以排序。4)Set类型可装入唯一值,HashSet效率高于TreeSet但TreeSet可以维护内部元素的排序状态。5)List类型可按某种特定顺序维护元素。ArrayList允许快速随机访问,但如果添加或删除位于中间的元素时效率很低;LikedList提供最佳循序访问及快速的中间位置添加删除元素,并有addFirst、addLast、getFirst、getLast、removeFirst、removeLast方法。20、面向对象的特征:1)继承:通过子类可以实现继承,子类继承父类的所有状态和行为,同时添加自身的状态和行为。2)封装:将代码及处理数据绑定在一起的一种编程机制,该机制保证程序和数据不受外部干扰。3)多态:包括重载和重写。重载为编译时多态,重写是运行时多态。重载必须是同类中名称相同参数不同(包括个数不同和类型不同),但返回类型不同不构成重载;重写发生于子类对父类的覆盖,子类继承父类方法名相同、参数列表相同、返回类型相同才构成重写。23、设计模式:一个设计模式描述了一个被证实可行的方案。这些方案非常普遍,是具有完整定义的最常用的模式。一般模式有4个基本要素:模式名称(patternname)、问题(problem)、解决方案(solution)、效果(consequences)。常见23种模式概述:1)抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。2)适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。3)桥梁模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。4)建造模式(Builder):将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。5)责任链模式(ChainofResponsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。6)命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。7)合成模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。8)装饰模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,它能生成子类的方式更为灵活。9)门面模式(Facade):为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。10)工厂方法(FactoryMethod):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。FactoryMethod使一个类的实例化延迟到其子类。12)解释器模式(Interpreter):给定一个语言,定义它的语法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。13)迭代子模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。16)观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。18)代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。19)单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。26、存储过程和函数的区别存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。1)什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请点击这里。2)线程和进程有什么区别?线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请点击这里。3)如何在Java中实现线程?在语言层面有两种方式。java.lang.Thread类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread类或者直接调用Runnable接口来重写run()方法实现线程。更多详细信息请点击这里.4)用Runnable还是Thread?这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了。更多详细信息请点击这里。6)Thread类中的start()和run()方法有什么区别?这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。更多讨论请点击这里7)Java中Runnable和Callable有什么不同?Runnable和C
本文标题:高级软件工程师面试题
链接地址:https://www.777doc.com/doc-4852103 .html