java常考面试题

一、java基础部分

1、一个“java”源文件中是否可以包含对个类(不是内部类)?有什么限制?

    可以有多个类,但是只能由一个public的类,并且public的类名必须与文件名一致。


2、在java中如何跳出多重嵌套循环?

    在java中想要跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即跳出外层循环。

    例如:

         ok:
for(int i=0;i<100;i++){
for(int j=i;j<100;j++){
System.out.print(i+j);
if(j==10) break ok;
}

}

     或者直接添加break语句

for(int i=0;i<100;i++){
for(int j=i;j<100;j++){
System.out.print(i+j);
if(j==10) 
break;
}

}


3、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

    在switch(expr)中,  expr只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以这些类型以及这些类型的包装类型也是可以的。但是,long不符合switch的语法规定,并且不能被隐式的转换成int类型,所以,它们不能作用于switch语句中。

          switch可作用于char,byte,short,int
          switch可作用于char,byte,short,int对应的包装类
          switch不可作用于long,double,float,boolean以及它们的封装类
          switch中可以是字符串类型String(jdk1.7之后才可以作用在String)
          switch中可以是枚举类型


4、short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错?

     对于short s1=1;s1=s1+1;由于s1+1运算时会自动提升表示式的类型,所以结果是int型,再复制short类型s1时,编译器将报告需要转换类型的错误。

     对于short s1=1;s1+=1;+=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。


5、char型变量中能不能存贮一个中文汉字?

     char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,所以,char类型变量是可以存储汉字。不过,如果某个特殊的汉字没有被包围在Unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:Unicode占用两个字节,所以,char类型的变量也是占用两个字节。


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

    使用final修饰变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

         final StringBuffer a=new StringBuffer("immutable");
          a=new StringBuffer("");    //执行这句时将出现错误
          a.append("broken");       //执行这句时编译通过


7、final、finally、finalize修饰符的区别

    final:若一个类被声明为final时,意味着他不能在派生出新的子类,不能作为父类被继承。将变量和方法声明为final,可以保证他们在使用中不被改变,其初始化可以在两个地方,一个是在final变量定义时直接给其赋值,二是在构造函数中。被声明为final的方法只能使用,不能重写。

     final关键字可以用于类,方法,变量前,用来表示该关键字修饰的类,方法,变量具有不可变得特性。

      (1) final关键字用于基本数据类型前:这时表明该关键字修饰的变量是一个常量,在定义后该变量的值就不能被修改。

                final int a;
                a=9;
                a=8;    //出现错误,因为a被定义为final类型,不能再被重新赋值。

      (2) final关键字用于方法声明前:这意味着该方法只能被调用,不能被覆盖,但是可以被重载。

  class People{
    final void output(String name){
    System.out.println(name);
    }
    } 
    class Stu extends People{
    final void output(String name){  //出现错误,不可以被重写
    System.out.println(name);
    }
    final void output(String name,int id){   //没有错误,可以被重载
    System.out.println(name+id);
    }
   
    }

      (3) final关键字用于类名前:此时该类被称为最终类,该类不能被其他类继承。

     final class People{
final void output(String name){
System.out.println(name);
}
}
class Stu extends People{   //类people不能被继承
final void output(String name,int id){  //可以被重载
System.out.println(name);
}
}

    finally:在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会被执行,然后控制就会进入finally块中。

    当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行。假如我们打开了一个文件,但在处理文件过程中发生异常,这时文件还没有被关闭,此时就会产生资源回收问题。对此,java提供了一种好的解决方案,那就是finally子句,finally子句中的语句是一定会被执行的,所以我们只要

    finalize:finalize是方法名。java技术允许使用使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法使用垃圾收集器在确定这个对象没有被引用时对这个对象调用的。总之,finalize()方法是在垃圾收集器中删除对象。 

    finalize方法来自于java.lang.Object,用于回收资源。可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖使用该方法回收任何短缺的资源,这是因为很难知道这个方法什么时候被调用。


8、“==”和equals方法的区别?

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

     如果一个变量指向的数据是对象类型的,那么这时涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Object 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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。


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

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

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


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

     不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那么非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以一个static方法内部发出对非static方法的调用。


11、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层的表单数据的类型。在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义成了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。


12、java语言的优缺点?

     (1) Java为纯面向对象的语言。《Java编程思想》提到java语言是一种“Everything is object”的语言,它能够直接反应现实生活中的对象,例如火车,动物等。

     (2) 平台无关性。Java语言可以“一次编译,到处运行”。无论是在windows平台还是在Linux、MacOS等其他平台上对Java程序进行编译,编译后的程序在其他平台上都可以运行。由于java为解释型语言,编译器会把Java代码变成“中间代码”,然后再java虚拟机上解释执行,由于中间代码与平台无关,因此,java语言可以很好地跨平台执行,具有很好地可移植性。

           



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值