Java复习题

时间:2022-04-29 16:29:51

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

答:可以,但只能有一个public,并且public类名与文件名一致

2Java有没有goto?  

答:保留为关键字

3、说说&&&的区别。

答:&&有短路功能,&可以做位运算符

4、在JAVA中如何跳出当前的多重嵌套循环?

答:一、使用带有标号的break 语句,即可跳出外层循环。

  二、循环条件逻辑与布尔标志符,满足条件后取反

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

答: 在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。

  由于在JDK7.0中引入了新特性,所以witch语句可以接收一个String类型的值,String可以作用在switch语句上

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

答:一、s1+1为int型,转换为short报错,编译器将报告需要强制转换类型的错误。

  二、隐含强制转换,不报错

7char型变量中能不能存贮一个中文汉字?为什么?  

答: char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。

  补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

8、用最有效率的方法算出2乘以8等於几?  

答:2<<3。位运算cpu直接支持的,效率最高

9、请设计一个一百亿的计算器

先不考虑long类型,由于int的正数范围为2的31次方,表示的最大数值约等于2*1000*1000*1000,也就是20亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:

()这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数

()有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中

()提供加减乘除的功能

public class BigInteger

{

int sign;

byte[] val;

public Biginteger(String val)

{

sign = ;

val = ;

}

public BigInteger add(BigInteger other)

{

}

public BigInteger subtract(BigInteger other)

{

}

public BigInteger multiply(BigInteger other)

{

}

public BigInteger divide(BigInteger other)

{

}

}

参看jdk中自带的java.math.BigInteger类的源码。

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

答:a:基本类型 值不能发生改变

  b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的

tips:有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:public void method(final  StringBuffer  param){   }

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:param.append("a");

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

答:如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

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

对于下面的程序,无论创建多少个实例对象,永远都只分配了一个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);

  }

}

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

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

14Integerint的区别

答:Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。Integer提供了多个与整数相关的操作方法

15Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:四舍五入算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整

16、下面的代码有什么不妥之处?

  都是些括号问题

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

只要记住了有4种访问权限(public,protected,friendly,private),4个访问范围(当前类,当前包,子类,不同包),水平和垂直方向上分别按排从小到大排列

18OverloadOverride的区别。Overloaded的方法是否可以改变返回值的类型?  

区别很大

  重写Override:表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。

  (非重写)如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

 19、 线程如何同步和通讯。同学回答说synchronized方法或代码块!面试官似乎不太满意!

只有多个synchronized代码块使用的是同一个监视器对象,这些synchronized代码块之间才具有线程互斥的效果,假如a代码块用obj1作为监视器对象,假如b代码块用obj2作为监视器对象,那么,两个并发的线程可以同时分别进入这两个代码块中。 …这里还可以分析一下同步的原理。

  对于同步方法的分析,所用的同步监视器对象是this

接着对于静态同步方法的分析,所用的同步监视器对象是该类的Class对象

  接着对如何实现代码块与方法的同步进行分析。

 20、ClassLoader如何加载class

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