面试题收集——Java基础部分(一)

1、一个".java"源文件中是否能够包括多个类(不是内部类)?有什么限制? 

  能够有多个类,但只能有一个public的类,而且public的类名必须与文件名相一致。java

2Java有没有goto? 

  java中的保留字,如今没有在java中使用。web

3、说说&&&的区别。 

  &&&均可以用做逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,不然,只要有一方为false,则结果为false面试

  &&还具备短路的功能,即若是第一个表达式为false,则再也不计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当strnull时,后面的表达式不会执行,因此不会出现NullPointerException若是将&&改成&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增加,If(x==33 && ++y>0)不会增加spring

  &还能够用做位运算符,当&操做符两边的表达式不是boolean类型时,&表示按位与操做,咱们一般使用0x0f来与一个整数进行&运算,来获取该整数的最低4bit位,例如,0x31 & 0x0f的结果为0x01。 数据库

4switch语句可否做用在byte上,可否做用在long上,可否做用在String

  switchexpr1)中,expr1只能是一个整数表达式或者枚举常量,整数表达式能够是int基本类型或Integer包装类型,因为,byte,short,char均可以隐含转换为int,因此,这些类型以及这些类型的包装类型也是能够的。显然,longString类型都不符合switch的语法规定,而且不能被隐式转换成int类型,因此,它们不能做用于swtich语句中。 编程

5short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错

  对于short s1 = 1; s1 = s1 + 1; 因为s1+1运算时会自动提高表达式的类型,因此结果是int型,再赋值给short类型s1时,编译器将报告须要强制转换类型的错误bootstrap

  对于short s1 = 1; s1 += 1;因为 += java语言规定的运算符,java编译器会对它进行特殊处理,所以能够正确编译。 设计模式

6char型变量中能不能存贮一个中文汉字?为何

  char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,因此,char型变量中固然能够存储汉字啦。不过,若是某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,因此,char类型的变量也是占用两个字节mvc

7、使用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变? 

  使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容仍是能够改变的app

  例如,对于以下语句:

     final StringBuffer a=new StringBuffer("immutable");
  执行以下语句将报告编译期错误:

    a=new StringBuffer("");
  可是,执行以下语句则能够经过编译:

    a.append(" broken!"); 

  有人在定义方法的参数时,可能想采用以下形式来阻止方法内部修改传进来的参数对象:

    public void method(final  StringBuffer  param){

    } 

  实际上,这是办不到的,在该方法内部仍然能够增长以下代码来修改参数对象:

    param.append("a");

8"=="equals方法究竟有什么区别?

  ==操做符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操做符

  若是一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象自己占用一块内存(堆内存),变量也占用一块内存(栈内存),例如Objet obj = new Object();变量obj是一个内存,new Object()是另外一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,若是要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就须要用==操做符进行比较

  equals方法是用于比较两个独立对象的内容是否相同,就比如去比较两我的的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

  String a=new String("foo");

  String b=new String("foo");

  两条new语句建立了两个对象,而后用a,b这两个变量分别指向了其中一个对象,这是两个不一样的对象,它们的首地址是不一样的,即ab中存储的数值是不相同的,因此,表达式a==b将返回false,而这两个对象中的内容是相同的,因此,表达式a.equals(b)将返回true

  在实际开发中,咱们常常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,记住,字符串的比较基本上都是使用equals方法。

  若是一个类没有本身定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码以下:

  boolean equals(Object o){

    return this==o;

  }

  这说明,若是一个类没有本身定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操做符,也是在比较两个变量指向的对象是不是同一对象,这时候使用equals和使用==会获得一样的结果,若是比较的是两个独立的对象则总返回false若是你编写的类但愿可以比较该类建立的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你本身写代码来决定在什么状况便可认为两个对象的内容是相同的。

9、静态变量和实例变量的区别?

  在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加

  在程序运行时的区别:实例变量属于某个对象的属性,必须建立了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量静态变量不属于某个实例对象,而是属于类,因此也称为类变量,只要程序加载了类的字节码,不用建立任何实例对象,静态变量就会被分配空间,静态变量就能够被使用了。总之,实例变量必须建立对象后才能够经过这个对象来使用,静态变量则能够直接使用类名来引用。

  例如,对于下面的程序,不管建立多少个实例对象,永远都只分配了一个staticVar变量,而且每建立一个实例对象,这个staticVar就会加1;可是,每建立一个实例对象,就会分配一个instanceVar,便可能分配多个instanceVar,而且每一个instanceVar的值都只自加了1次。

public class VariantTest{

  public static int staticVar = 0; 

  public int instanceVar = 0; 

  public VariantTest(){

    staticVar++;

    instanceVar++;

    System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);

  }

}

10、是否能够从一个static方法内部发出对非static方法的调用?

  不能够。由于static方法是要与对象关联在一块儿的,必须建立一个对象后,才能够在该对象上进行方法调用,而static方法调用时不须要建立对象,能够直接调用。也就是说,当一个static方法被调用时,可能尚未建立任何实例对象,若是从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪一个对象上的呢?这个逻辑没法成立,因此,一个static方法内部不能够发出对非static方法的调用

11Integerint的区别

  intjava提供的8种原始数据类型之一。Java为每一个原始类型提供了封装类,Integerjavaint提供的封装类int的默认值为0,而Integer的默认值为null,即Integer能够区分出未赋值和值为0的区别,int则没法表达出未赋值的状况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用IntegerJSP开发中,Integer的默认为null,因此用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,因此用el表达式在文本框中显示时,结果为0,因此,int不适合做为web层的表单数据的类型

  在Hibernate中,若是将OID定义为Integer类型,那么Hibernate就能够根据其值是否为null而判断一个对象是不是临时的,若是将OID定义为了int类型,还须要在hbm映射文件中设置其unsaved-value属性为0

  另外,Integer提供了多个与整数相关的操做方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

12、请说出做用域publicprivateprotected,以及不写时的区别

这四个做用域的可见范围以下表所示。

说明:若是在修饰的元素上面没有写任何访问修饰符,则表示friendly

13OverloadOverride的区别。Overloaded的方法是否能够改变返回值的类型

  Overload是重载的意思,Override是覆盖的意思,也就是重写

  重载Overload表示同一个类中能够有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不一样)

  重写Override表示子类中的方法能够与父类中的某个方法的名称和参数彻底相同,经过子类建立的实例对象调用这个方法时,将调用子类中的定义方法,这至关于把父类中定义的那个彻底相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,由于子类能够解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。若是父类的方法是private类型,那么,子类则不存在覆盖的限制,至关于子类中增长了一个全新的方法

  至于Overloaded的方法是否能够改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。若是几个Overloaded的方法的参数列表不同,它们的返回者类型固然也能够不同。但我估计你想问的问题是:若是两个方法的参数列表彻底同样,是否可让它们的返回值不一样来实现重载Overload?这是不行的,咱们能够用反证法来讲明这个问题,由于咱们有时候调用一个方法时也能够不定义返回结果变量,即不要关心其返回结果,例如,咱们调用map.remove(key)方法时,虽然remove方法有返回值,可是咱们一般都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表彻底相同的方法,仅仅是返回类型不一样,java就没法肯定编程者倒底是想调用哪一个方法了,由于它没法经过返回结果类型来判断。 

  override能够翻译为覆盖,从字面就能够知道,它是覆盖了一个方法而且对其重写,以求达到不一样的做用对咱们来讲最熟悉的覆盖就是对接口方法的实现,在接口中通常只是对方法进行了声明,而咱们在实现时,就须要实现接口声明的全部方法。除了这个典型的用法之外,咱们在继承中也可能会在子类覆盖父类中的方法,在覆盖要注意如下的几点:

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

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

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

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

  overload对咱们来讲可能比较熟悉,能够翻译为重载,它是指咱们能够定义一些名称相同的方法,经过定义不一样的输入参数来区分这些方法,而后再调用时,VM就会根据不一样的参数样式,来选择合适的方法执行在使用重载要注意如下的几点:

  1. 在使用重载时只能经过不一样的参数样式。例如,不一样的参数类型,不一样的参数个数,不一样的参数顺序(固然,同一方法内的几个参数类型必须不同,例如能够是fun(int,float),可是不能为fun(int,int));
  2. 不能经过访问权限、返回类型、抛出的异常进行重载;
  3. 方法的异常类型和数目不会对重载形成影响;
  4. 对于继承来讲,若是某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,若是定义的话,也只是定义了一个新方法,而不会达到重载的效果。

1四、has ais a的区别

  is-a表示的是属于的关系。好比兔子属于一种动物(继承关系)。

  has-a表示组合,包含关系。好比兔子包含有腿,头等组件。

1五、ClassLoader如何加载class

  jvm里有多个类加载器,每一个类加载器能够负责加载特定位置的类,例如,bootstrap类加载负责加载jre/lib/rt.jar中的类, 咱们平时用的jdk中的类都位于rt.jar。extclassloader负责加载jar/lib/ext/*.jar中的类,appclassloader负责classpath指定的目录或jar中的类除了bootstrap以外,其余的类加载器自己也都是java类,它们的父类是ClassLoader

1六、分层设计的好处

  把各个功能按调用流程进行了模块化,模块化带来的好处就是能够随意组合,举例说明:若是要注册一个用户,流程为显示界面并经过界面接收用户的输入,接着进行业务逻辑处理,在处理业务逻辑又访问数据库,若是咱们将这些步骤所有按流水账的方式放在一个方法中编写,这也是能够的,但这其中的坏处就是,当界面要修改时,因为代码全在一个方法内,可能会碰坏业务逻辑和数据库访问的码,一样,当修改业务逻辑或数据库访问的代码时,也会碰坏其余部分的代码。分层就是要把界面部分、业务逻辑部分、数据库访问部分的代码放在各自独立的方法或类中编写,这样就不会出现牵一发而动全身的问题了。这样分层后,还能够方便切换各层,譬如原来的界面是Swing,如今要改为BS界面,若是最初是按分层设计的,这时候不须要涉及业务和数据访问的代码,只需编写一条web界面就能够了。

  分层的好处:

  1.实现了软件之间的解耦;

  2.便于进行分工

  3.便于维护

  4.提升软件组件的重用

  5.便于替换某种产品,好比持久层用的是hibernate,须要更换产品用toplink,就不用该其余业务代码,直接把配置一改。

  6.便于产品功能的扩展。

  7.便于适用用户需求的不断变化

1七、hashCode方法的做用?

  hashcode这个方法是用来鉴定2个对象是否相等的

  equals方法和hashCode方法2个方法都是用来判断2个对象是否相等的,可是他们是有区别的。

  通常来说,equals这个方法是给用户调用的,若是你想判断2个对象是否相等,你能够重写equals方法,而后在代码中调用,就能够判断他们是否相等了。简单来说,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是否是相等举个例子,有个学生类,属性只有姓名和性别,那么咱们能够认为只要姓名和性别相等,那么就说这2个对象是相等的。

  hashcode方法通常用户不会去调用,好比在hashmap中,因为key是不能够重复的,他在判断key是否是重复的时候就判断了hashcode这个方法,并且也用到了equals方法。这里不能够重复是说equalshashcode只要有一个不等就能够了!因此简单来说,hashcode至关因而一个对象的编码,就好像文件中的md5,他和equals不一样就在于他返回的是int型的,比较起来不直观咱们通常在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。举个例子,仍是刚刚的例子,若是姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。

  要从物理上判断2个对象是否相等,用==就能够了,若是两个对象的物理(内存)地址相等,那么这两个对象确定就是同一个对象

1八、什么是AOP?

1.AOP概念介绍

  所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程。

  面向切面编程Aspect-Orlented-Programming,即AOP是对面向对象的思惟方式的有力补充。

  AOP的好处是能够动态地添加和删除在切面上的逻辑而不影响原来的执行代码

2.解释什么是方面(切面)

  所谓方面(切面)指的是贯穿到系统的各个模块中的系统一个功能就是一个方面(切面),好比,记录日志,统一异常处理,事务处理,权限检查,这些功能都是软件系统的一个面,而不是一点,在各个模块中都要出现。

3.什么是面向方面编程

  把系统的一个方面的功能封装成对象的形式来处理就是面向方面(切面)编程

4.怎么进行面向方面编程

  把功能模块对应的对象做为切面嵌入到原来的各个系统模块中,采用代理技术,代理会调用目标,同时把切面功能的代码(对象)加入进来。因此,用spring配置代理对象时只要要配两个属性,分别表示目标和切面对象(Advisor

 19.谈谈你对mvc的理解

  MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。

  MVC中的模型、视图、控制器它们分别担负着不一样的任务。

  • 视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
  • 模型: 模型表示业务数据和业务处理。至关于JavaBean。一个模型能为多个视图提供数据。这提升了应用程序的重用性
  • 控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。而后根据处理的结果调用相应的视图来显示处理的结果。

  MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并经过视图呈现给用户。

  IT公司面试手册:http://www.mianwww.com/
相关文章
相关标签/搜索