亲身经历,Java面试题整理

77 篇文章 12 订阅
69 篇文章 5 订阅

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


资料1:


一、单继承

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

答:
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为什么类只能单继承,接口可以多继承?

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

 

二、静态和成员

 

2.1成员方法是否可以访问静态变量?

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

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

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

 

三、内部类

3.1内部类分为几种?

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

 

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

答:参数必须是常量

3.3、为什么匿名内部类只能访问常量参数?

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

四、StringBuffer与StringBuilder 

4.1、以下语句会创建几个字符串对象? 

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.2、以上代码有什么缺点?有哪些方式可以优化?

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

4.3、StringBuffer与StringBuilder的区别是什么?

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


五、覆盖

5.1、什么是方法的覆盖?

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


5.2、方法的覆盖的语法要求是什么?

答: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.1、Socket工作在TCP/IP协议栈是哪一层?

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


6.2、传输层常见编程协议有哪些?并说出各自的特点。

TCP,UDP,SPX,NetBIOS,NetBEUI

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

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

6.3、同一台机器上的两个Server程序是否可以使用同一端口?(不可以)
6.4、同一台机器上的不同协议的两个Server是否可以使用同一端口?为什么?
(可以,端口的唯一性的标识不是端口号,而是端口号和协议名称的组合,应用程序和协议寻址时就是靠的这个组合)


七、Web编程
7.1、JSP中的声明脚本,普通脚本、表达式脚本分别用什么标签表示?
( 声明脚本<%! %>;普通脚本<% %>;表达式脚本<%= %>)

7.2、 声明脚本中定义的变量和普通脚本定义的变量有什么区别?使用时要注意什么? 
全局变量到处可以用,例如<%!%>声明的,局部变量就是只有函数内部可以用普通脚本<%%>。 注意:普通脚本<% %> 里面的是java代码,和普通java类的语法一样,而在两个符号外面的都作为html处理。<% java 代码 %>在 JSP Scriptlet 里可直接嵌入任何有效的java语言代码。可以在 scriptlet 内部可以使用java。 <%! 声明 %>在声明部分可以声明变量和方法,它们只当前JSP页面有效。

八、Hibenrate
8.1、一对一关系有哪几种映射方式? 
3种共享主键,外键和关联表
1.共享主键的一对一关联映射
2.外键映射方式(使用外键进行实体一对一关联)
3..关联表映射方式
相互关联关系上的划分:1)一对一外键关联映射(单向) 2)一对一外键关联映射(双向)3)一对一主键关联映射(不重要)
Hibernate Annotation几种关联映射 一对一(One-To-One) 使用@OneToOne注解建立实体Bean之 间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关 联必须在外键列上添加唯一约束),(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上添加唯一约束)。

8.2、什么时候采用共享主键,什么时候采用唯一外键?
共享主键方式:就是限制两个数据表的主键使用相同的值。
唯一外键方式:就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系。
1、共享主键方式:
在注册时,往往不但要填写 登录账户和密码,还要填写其他的详细信息,这两部分信息通常会放在不同的表中。这时登录表和详细信息表属于典型的一对一关系,可以按共享主键方式进行。
在进行该关联时要对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" />
2、唯一外键方式:
多对一的特殊情况。

九、OpenSession与getCurrentSession
9.1、OpenSession() 与getCurrentSession() 两个方法的区别是什么?
getCurrentSession的话会自动关闭,而openSession需要你手动关闭。
如果你正在查询,使用的openSession而没有手动关闭,多次之后会导致连接池溢出,系
统会挂掉的~
1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。
2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭(调用session的close()方法)
3.getCurrentSession () 使用当前的session
openSession() 重新建立一个新的session
4、使用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.2、getCurrentSession() 的实现原理是什么?(ThreadLocal绑定到线程)

十、spring
10.1、简述面向切面编程(AOP)的好处。
1.每个业务逻辑放在一个地方(事务管理,日志管理,安全,其他),避免代码分散到各 个角落 2. 业务逻辑更加清晰。AOP只是一种编程范式,用于提供从另一角度来考虑程序结构以完善面向对象编程。主要优点有:1-降低模块之间的耦合度。2-使系统容 易扩展。3-更好的代码复用。解耦合,高内降低耦合。
10.2、Spring中场勇敢的基础切面有哪些?
权限判断、异常处理,日志记录,事务管理,安全,性能监测,访问控制,
10.3、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的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

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

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

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

 

 

 

  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔狠角色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值