常见问题

1、单继承

 1.1、java类是否支持多重继承?(不支持,但支持多接口)

 1.2、java类是否可以同时实现多个接口?(可以)

 1.3、一个接口是否可以继承其它接口?(可以)

 1.4、一个接口是否可以同时继承多个接口?(可以)

 1.5、为什么类只能单继承而接口可以多集(继承)成?(类如果多继承的话,存在不同的类中有相同的方法,调用是会出现混乱,而接口不会出现这种情况)

2、静态变量

 2.1、普通成员方法是否可以访问静态变量?(可以)

 2.2、静态方法是否可以访问普通成员变量?(不可以,因为静态方法在主程式加载时就已经执行,如果调用普通成员变量,可能变量未初始化,导致出现空指针异常。)

 2.3、为什么静态方法不能访问普通成员变量?(不可以,

牵扯到类加载与类实例化的问题。类中的静态方法与静态变量都是类加载的时候进行初始化的,而类中普通方法跟普通变量都是在类实例化的时候才初始化,普通成员方法可以访问静态变量是因为普通方法初始化的时候说明类已经在实例化了,此时静态变量、静态方法都已经初始化完毕,所以可以访问。而静态方法不能访问普通成员变量是因为静态方法初始化的时候类并没有实例化,也就是说此时普通成员变量还没有初始化,所以不能访问。java中的普通成员是在new一个对象的时候才产生的,而static成员是编译这个类的时候就产生了。有一个先后顺序。方法同理。所以你写静态方法的时候没有创建对象实例,所以还没有非静态的成员,所以不能调用)

 

3、内部类

 3.1、内部类分为哪几种?(Java里分为匿名内部类,局部内部类,静态内部类,成员内部类)

 3.2、匿名内部类是否可以访问所在方法的参数有什么要求?(参数必须是常量)

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

 

4、StringBuffer与StringBuilder

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

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

 

 答:?个分别是???请选择“Hello”、“world”、“Hello world”、

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

  4.2、以上代码有什么缺点?有哪些方式可以优化?

 (在程式中这样的语句多的话,会很费内存,优化方式是:将其为String str +=“Hello”的格式;如对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。)

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

 String 字符串常量

 StringBuffer 字符串变量(线程安全,多线程使用)

 StringBuilder 字符串变量(非线程安全,一个可变的字符序列是5.0新增的,不保证同步,单线程使用)

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

 

5、覆盖(override)

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

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

  1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

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

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

  4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行;

 

 5.3、为什么访问控制符要求越来越宽泛,异常类型要越来越具体?

java类的访问控制符主要是为了体现面向对象的封装和继承的特的,对于封装来说越小越好,继承的话就用protocted关键词,越小别人对你的耦合度就越小,比如private,只有自己能访问到。访问控制符越宽泛访问就越容易;而异常越来越具体捕获和处理就越容易对程序的性能就更有优势,对程序员的效率更好

 

6、网络层编程

 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是否可以使用同一端口?为什么?

 可以,端口的唯一性的标识不是端口号,而是端口号和协议名称的组合,应用程序和协议寻址时就是靠的这个组合

 

7、JSP编程

 7.1、JSP中的声明脚本,普通脚本、表达式脚本分别用什么标签表示?

声明脚本<%! %>;普通脚本<% %>;表达式脚本<%= %>

 

 7.2、声明脚本中定义的变量和普通脚本定义的变量有什么区别?使用时要注意什么?

全局变量到处可以用,例如<%!%>声明的,局部变量就是只有函数内部可以用普通脚本<%%>。

 注意:普通脚本<% %>里面的是java代码,和普通java类的语法一样,而在两个符号外面的都作为html处理。<% java 代码%>在JSP Scriptlet 里可直接嵌入任何有效的java语言代码。可以在scriptlet 内部可以使用java。

<%! 声明 %>在声明部分可以声明变量和方法,它们只当前JSP页面有效。

 

8、关系映射

 8.1、一对一关系有哪几种映射方式?

3种共享主键,外键和关联表:

 1.共享主键的一对一关联映射

 2.外键映射方式(使用外键进行实体一对一关联)

 3.关联表映射方式相互关联关系上的划分:

1)一对一外键关联映射(单向)

 2)一对一外键关联映射(双向)

3)一对一主键关联映射(不重要)

 

Hibernate Annotation几种关联映射:一对一(One-To-One) 使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:

(1).关联的实体都共享同样的主键,

(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),

(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上添加唯一约束)。

 

 8.2、什么时候采用共享主键,什么时候采用唯一外键?

 

Hibernate有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式。共享主键方式:就是限制两个数据表的主键使用相同的值。

唯一外键方式:就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系。

 1、共享主键方式:

在注册时,往往不但要填写登录账户和密码,还要填写其他的详细信息,这两部分信息通常会放在不同的表中。这时登录表和详细信息表属于典型的一对一关系,可以按共享主键方式进行。

 

 在进行该关联时要对POJO类的ORM映射文件*.hbm.xml 进行修改:

 如:

 Login 表与Login 类的ORM映射文件Login.hbm.xml 文件在<class...></class>标签中添加:

 

 

 

而detail 表与Detail 类的ORM映射文件Detail.hbm.xml 文件中添加:

 

 

 

2、唯一外键方式:多对一的特殊情况。

 

9、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

绑定到线程)

 

10、AOP编程

 10.1、简述面向切面编程(AOP)的好处。

 1.每个业务逻辑放在一个地方(事务管理,日志管理,安全,其他),避免代码分散到各个角落

 2.业务逻辑更加清晰。AOP只是一种编程范式,用于提供从另一角度来考虑程序结构以完善面向对象编程。主要优点有:

1-降低模块之间的耦合度。

2-使系统容易扩展。

3-更好的代码复用。解耦合,高内降低耦合。

 

   10.2、Spring中场勇敢的基础切面有哪些?

 权限判断、异常处理,日志记录,事务管理,安全,性能监测,访问控制,

 10.3、spring切面的实现原理是什么?

反射实现AOP动态代理模式

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章