亲身经历,Java面试题整理

博主在2015年暑期参加过一些Java开发工程师实习的面试和笔试,在此将重点整理出来,以供你们学习。
html


资料1:java


1、单继承面试

1.1Java类是否支持多重继承?spring

答:继承的基本原则是:
子类继承父类的全部成员变量(包括静态成员);
子类继承除父类构造方法外的全部成员方法(包括静态方法);
子类不能继承父类的构造方法,但在其构造方法中会隐含调用父类的默认构造方法。
Java的类是单继承的,不支持多继承,即extends关键字后只能有一个类名称,即直接父类。所以Java的类继承关系造成一个树型结构,而不是网状结构。
要想实现相似于C++的多继承关系,Java是经过接口间接实现的,即多个父类实现某一接口,每一个父接口有子接口,子类实现子接口。


1.2Java类是否能够同时实现多个接口?编程

答:能够,用逗号分隔多个接口便可。接口只能继承多个接口。java中接口其实里面全是抽象类 ,抽象类就是只有方法名,方法体没有 ,也就是说方法没有实现, 接口能够继承多个接口,而类能够实现多个接口,你实现一个接口,至关于从它那里能够获得它的抽象方法。而本身也能够增长本身的方法。浏览器

Interface 子接口 extends 父接口1,父接口2,。。。。。。。。安全

 

1.3一个接口是否能够同时继承多个接口?服务器

答:一个接口能够继承多个接口.interface C extends A, B {}是能够的.
一个类能够实现多个接口:class D implements A,B,C{}
可是一个类只能继承一个类,不能继承多个类class Bextends A{}
在继承类的同时,也能够继承接口:class E extendsD implements A,B,C{}网络

 

1.4为何类只能单继承,接口能够多继承?session

答:不容许类多重继承的主要缘由是,若是A同时继承B和C,而b和c同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,因此接口能够继承多个接口。

 

2、静态和成员

 

2.1成员方法是否能够访问静态变量?

2.2为何静态方法不能访问成员变量?

答:类中的静态方法与静态变量都是在类加载的时候进行初始化的,而类中普通方法跟普通变量都是在类实例化的时候才初始化。

由此你的问题就显而易见了,普通成员方法能够访问静态变量是由于普通方法初始化的时候说明类已经在实例化了,此时静态变量、静态方法都已经初始化完毕,因此能够访问。而静态方法不能访问普通成员变量是由于静态方法初始化的时候类并无实例化,也就是说此时普通成员变量尚未初始化,因此不能访问。

 

3、内部类

3.1内部类分为几种?

答:内部类包括静态嵌套类,成员内部类,方法内部类和匿名内部类四种类型。

 

3.2匿名内部类是否能够访问所在方法的参数有什么要求?

答:参数必须是常量

3.三、为何匿名内部类只能访问常量参数?

答:(由于虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的做用域只在这个方法内部有效。由于编译的时候内部类和方法在同一级别上,因此方法中的变量或参数只有为final,内部类才能够引用。)

4、StringBuffer与StringBuilder 

4.一、如下语句会建立几个字符串对象? 

String str = “Hello” + “world” + “have a nice day”; 

答:五个 ,三个标红的毋庸置疑。另外两个也会在字符串缓冲池中被创建哦。详见 关于Java中equal函数和==的一些区别作一个总结

“Hello”、“world”、“Hello world”、“have a nice day”、“Hello world have a nice day” 

4.二、以上代码有什么缺点?有哪些方式能够优化?

(在程序中这样的语句多的话,会很费内存,优化方式是:将其改成String str += “Hello”的格式)

4.三、StringBuffer与StringBuilder的区别是什么?

(StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的API,但不保证同步。该类被设计用做 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种状况很广泛)。若是可能,建议优先采用该类,由于在大多数实现中,它比 StringBuffer 要快。 StringBuffer 线程安全,StringBuilder 线程不安全)


5、覆盖

5.一、什么是方法的覆盖?

(在Java中,子类可继承父类中的方法,而不须要从新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想做必定的修改,这就须要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具备相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。)


5.二、方法的覆盖的语法要求是什么?

答:1.覆盖的方法的标志必需要和被覆盖的方法的标志彻底匹配,才能达到覆盖的效果; 

2.覆盖的方法的返回值必须和被覆盖的方法的返回一致; 

3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4.被覆盖的方法不能为private,不然在其子类中只是新定义了一个方法,并无对其进行覆盖。


5.3为何访问控制符要求愈来愈宽泛,异常类型要愈来愈具体?

答:java类的访问控制符主要是为了体现面向对象的封装和继承的特性的,对于封装来讲越小越好,继承的话就用protocted关键词,越小别人对你的耦合度就越小,好比private,只有本身能访问到,这样若是有变化你能够很好的改变,如今通常的属性都是private

在java语言中,Exception是全部异常的父类。任何异常都扩展于Exception类。Exception就至关于一个错误类型。若是要定义一 个新的错误类型就扩展一个新的Exception子类。采用异常的好处还在于能够精确的定位到致使程序出错的源代码位置,并得到详细的错误信息。Java异常处理经过五个关键字来实现,try,catch,throw ,throws, finally。具体的异常处理结构由try….catch….finally块来实现。try块存放可能出现异常的java语句,catch用来捕获发 生的异常,并对异常进行处理。Finally块用来清除程序中未释放的资源。无论理try块的代码如何返回,finally块都老是被执行。


6、网络层编程 

6.一、Socket工做在TCP/IP协议栈是哪一层?

(socket的实现部分,就是系统协议栈部分,应该包含了网络层(ip),传输层(tcp/udp)等等。用socket写程序的人,就要看用socket那部分了。若是你直接用ip层,rawsocket,假如你本身写个tcp协议,那你应该作的就是传输层。 若是你是用tcp/udp等协议,作网络应用,那应该是应用层。


6.二、传输层常见编程协议有哪些?并说出各自的特色。

TCP,UDP,SPX,NetBIOS,NetBEUI

☆ SPX:顺序包交换协议,是Novell NetWare网络的传输层协议。

☆ TCP:传输控制协议,是TCP/IP参考模型的传输层协议。

6.三、同一台机器上的两个Server程序是否可使用同一端口?(不能够)
6.四、同一台机器上的不一样协议的两个Server是否可使用同一端口?为何?
(能够,端口的惟一性的标识不是端口号,而是端口号和协议名称的组合,应用程序和协议寻址时就是靠的这个组合)
 7、Web编程
7.一、JSP中的声明脚本,普通脚本、表达式脚本分别用什么标签表示?
( 声明脚本<%! %>;普通脚本<% %>;表达式脚本<%= %>)
 7.二、 声明脚本中定义的变量和普通脚本定义的变量有什么区别?使用时要注意什么? 
全局变量处处能够用,例如<%!%>声明的,局部变量就是只有函数内部能够用普通脚本<%%>。 注意:普通脚本<% %> 里面的是java代码,和普通java类的语法同样,而在两个符号外面的都做为html处理。<% java 代码 %>在 JSP Scriptlet 里可直接嵌入任何有效的java语言代码。能够在 scriptlet 内部可使用java。 <%! 声明 %>在声明部分能够声明变量和方法,它们只当前JSP页面有效。
 8、Hibenrate
8.一、一对一关系有哪几种映射方式? 
3种共享主键,外键和关联表
1.共享主键的一对一关联映射
2.外键映射方式(使用外键进行实体一对一关联)
3..关联表映射方式
相互关联关系上的划分:1)一对一外键关联映射(单向) 2)一对一外键关联映射(双向)3)一对一主键关联映射(不重要)
Hibernate Annotation几种关联映射 一对一(One-To-One) 使用@OneToOne注解创建实体Bean之 间的一对一关联。一对一关联有三种状况:(1).关联的实体都共享一样的主键,(2).其中一个实体经过外键关联到另外一个实体的主键(注意要模拟一对一关 联必须在外键列上添加惟一约束),(3).经过关联表来保存两个实体之间的链接关系(要模拟一对一关联必须在每个外键上添加惟一约束)。
 8.二、何时采用共享主键,何时采用惟一外键?
共享主键方式:就是限制两个数据表的主键使用相同的值。
惟一外键方式:就是一个表的外键和另外一个表的惟一主键对应造成一对一映射关系。
一、共享主键方式:
在注册时,每每不但要填写 登陆帐户和密码,还要填写其余的详细信息,这两部分信息一般会放在不一样的表中。这时登陆表和详细信息表属于典型的一对一关系,能够按共享主键方式进行。
在进行该关联时要对POJO类的ORM映射文件*.hbm.xml 进行修改:
如:
Login 表 与 Login 类的ORM映射文件 Login.hbm.xml 文件在<class...></class>标签中添加: <!-- name 表示属性名字,class表示被关联的类的名字 -->
<one-to-one name = "detail" class = "org.model.Detail" constrained = "true" /> 而 detail 表 与 Detail 类的 ORM 映射文件 Detail.hbm.xml 文件中添加:
<!-- name 表示属性名,class 表示被 关联类的名字,cascade = "all" 代表 主控类的全部操做,对关联类也执行一样的操做,lazy="false"表示此关联为当即加载 -->
<one-to-one name = "login" class = "org.model.Login" cascade = "all" lazy = "false" />
二、惟一外键方式:
多对一的特殊状况。
 9、OpenSession与getCurrentSession
9.一、OpenSession() 与getCurrentSession() 两个方法的区别是什么?
getCurrentSession的话会自动关闭,而openSession须要你手动关闭。
若是你正在查询,使用的openSession而没有手动关闭,屡次以后会致使链接池溢出,系
统会挂掉的~
1 getCurrentSession建立的session会和绑定到当前线程,而openSession不会。
2 getCurrentSession建立的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭(调用session的close()方法)
3.getCurrentSession () 使用当前的session
openSession() 从新创建一个新的session
四、使用getCurrentSession()须要在hibernate.cfg.xml文件中加入以下配置:
* 若是使用的是本地事务(jdbc事务) <property name="hibernate.current_session_context_class">thread</property> * 若是使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
9.二、getCurrentSession() 的实现原理是什么?(ThreadLocal绑定到线程)
 10、spring
10.一、简述面向切面编程(AOP)的好处。
1.每一个业务逻辑放在一个地方(事务管理,日志管理,安全,其余),避免代码分散到各 个角落 2. 业务逻辑更加清晰。AOP只是一种编程范式,用于提供从另外一角度来考虑程序结构以完善面向对象编程。主要优势有:1-下降模块之间的耦合度。2-使系统容 易扩展。3-更好的代码复用。解耦合,高内下降耦合。
10.二、Spring中场勇敢的基础切面有哪些?
权限判断、异常处理,日志记录,事务管理,安全,性能监测,访问控制,
10.三、spring切面的实现原理是什么?
反射实现AOP动态代理模式

 


资料2:

 

1.类通常都存储在本身的文件中,而且这个文件仍是和类名一致的。可是嵌套类之间是存储在一块儿的。对于嵌套在内部的类,不能够在外部定义一个类去调用它!


2.三种状况下方法不能被覆盖?

答:static方法,final方法和final类中的方法。


3.this关键字:

答:能够调用本类中的属性即成员变量以及其它构造方法。加上this.name=name;说明是形参中的name赋值给this.name属性。


4.Super关键字:

答:完成子类在覆盖了父类中的方法后,调用子类所复制的父类的字段和方法。


5.静态方法和非静态方法:

答:(字段也分为静态和非静态俩种)区别以下:

(1)非静态方法必须在类实例化以后经过对象来调用,即:对象名.方法名

静态方法能够在类实例化以前调用,便可以对象名.方法名;也能够类名.方法名

(2)静态方法访问本类成员时,只容许访问静态方法;而非静态方法则能够访问静态方法和非静态方法;

(ps类实例化以后就是对象)


6.类的实例化----------对象

答:类是抽象的不能赋值。实例化以后的类便是对象,可以赋值,并且能够经过对象直接调用函数。对象声明以下:

类名 对象名 = new 类名();

New为实例化对象的关键字。


7.抽象类:

答:专门看成父类,其中的方法均为抽象方法---一种只声明而为实现的方法。抽象方法以及包含抽象方法的类必须用abstract关键字修饰。

规则以下:1)用abstract修饰。2)抽象类不能被实例化。3)抽象方法只需声明,不须要实现。4)含有抽象方法的类必须被称为抽象类,抽象类的子类必须覆盖全部的抽象方法后才能被实例化,不然这个子类仍是个抽象类。

在抽象类中声明构造方法后,在子类中必须明确调用,不然就出错。


8.HTTPS和HTTP的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提 供任何方式的数据加密,若是攻击者截取了Web浏览器和网站服务器之间的传输报文,就能够直接读懂其中的信息,所以HTTP协议不适合传输一些敏感信息, 好比信用卡号、密码等。

为了解决HTTP协议的这一缺陷,须要使用另外一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通讯加密。

HTTPS和HTTP的区别主要为如下四点:

1、https协议须要到ca申请证书,通常免费证书不多,须要交费。

2、http超文本传输协议,信息是明文传输,https 则是具备安全性ssl加密传输协议。

3、http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。

4、http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

相关文章
相关标签/搜索