Java基础面试题(一)

  今天整理一些实习生面试时面试官经常问的一些基础Java面试题(一):

  1.说说&和&&的区别。

  &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

  &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(www != null&& !www.equals(“”))表达式,当wwwr为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,

     则会抛出NullPointerException异常;If(x==100 &++y>0) y会增长,If(x==100 && ++y>0)不会增长

  &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作

  补充按位与:   运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1; 即:两位同时为“1”,结果才为“1”,否则为0;例如:3&5  即 0000 0011 & 0000 0101 = 0000 0001   因此,3&5的值得1。

 

  2.用最有效率的方法算出2乘以16等于几?  答案:2 << 4    

  因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以16等於几的最效率的方法是2 << 4

  

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

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

  eg:final StringBuffer a=new StringBuffer("www"); 执行如下语句将报告编译期错误:a=new StringBuffer("");  但是,执行如下语句则可以通过编译:a.append(" xxxxx").

 

  4."=="和equals方法究竟有什么区别?

  ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
  如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占    用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
  equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
  String a=new String("foo");
  String b=new String("foo");
  两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,

  所以,表达式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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

 

 

  5.Integer与int的区别

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

 

  6.下面的代码有什么不妥之处?

  6.1. if(name.equals(“xxx”){}
  name可能为NULL,会报空指针错误;改为"xxx".equals(name)
  6.2. int x = 1;
  return x==1?true:false; 这个改成return x==1;就可以!

 

  7.多态的好处

  主要有以下优点:
  1.可替换性:多态对已存在代码具有可替换性
  2.可扩充性:增加新的子类不影响已经存在的类结构
  3.接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的。
  4.灵活性
  5.简化性

 

  8.代码中实现多态主要有以下三种方式:

  1. 接口实现 
  2. 继承父类重写方法 
  3. 同一类中进行方法重载

 

  9.虚拟机是如何实现多态的

  动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法。

 

  10.Overload和Override的区别

    Overload是重载的意思,Override是覆盖的意思,也就是重写。
    在使用重载要注意以下的几点:
    1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));
    2、不能通过访问权限、返回类型、抛出的异常进行重载;
    3、方法的异常类型和数目不会对重载造成影响;
    4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

    在覆盖要注意以下的几点:
    1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
    2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
    3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
    4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

 

  11.接口和抽象类的区别

    比较 抽象类 接口
    1.默认方法   抽象类可以有默认的方法实现 java 8之前,接口中不存在方法的实现.
    2.实现方式   子类使用extends关键字来继承抽象类.如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现. 子类使用implements来实现接口,需要提供接口中所有声明的实现.
    3.构造器   抽象类中可以有构造器, 接口中不能
    4.和正常类区别   抽象类不能被实例化 接口则是完全不同的类型
    5.访问修饰符   抽象方法可以有public,protected和default等修饰 接口默认是public,不能使用其他修饰符
    6.多继承   一个子类只能存在一个父类 一个子类可以存在多个接口
    7.添加新方法   想抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码 如果往接口中添加新方法,则子类中需要实现该方法.
    8.抽象类中可以包含静态方法,接口中不能包含静态方法
    9.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

  

  12  .1.是否可以继承String类?

      java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类;

    2.什么是不可变对象?

      不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。

    3.能否创建一个包含可变对象的不可变对象?

      当然可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。

    

  

  13. java 创建对象的几种方式

    1.采用new
    2.通过反射
    3.采用clone
    4.通过序列化机制

 

  14.final, finally, finalize的区别。

  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
  finally是异常处理语句结构的一部分,表示总是执行。
  finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

 

  15.switch中能否使用string做参数

  在idk 1.7之前,switch只能支持byte, short, char, int或者其对应的封装类以及Enum类型。从idk 1.7之后switch开始支持String。

  

  16.Object中有哪些公共方法?

  equals()
  clone()
  getClass()
  notify(),notifyAll(),wait()
  toString

     

  

 

      

 

 

  

posted @ 2019-07-11 11:08  金色大海  阅读(403)  评论(0编辑  收藏  举报