Java面试题基础篇一

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

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

2.Java中有没有goto?

  goto是java中的保留字,但现在没有在java中使用。

3.说说&和&&的区别?

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

  &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。

  &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用OxOf来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,Ox31 & OxOf的结果为Ox01。

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

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

  ok:

  for(int i=0;i<10;i++)    {

           for(int j=0;j<10;j++)              {

                    System.out.println(“i=” + i + “,j=” + j);

                    if(j == 5) break ok;

           }

}

  我们通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

  

int arr[][] = {{1,2,3},{4,5,6,7},{9}};

  for(int i=0;i<arr.length && !found;i++)   {

           for(int j=0;j<arr[i].length;j++){

                    System.out.println(“i=” + i + “,j=” + j);

                    if(arr[i][j]  == 5) {

                             found = true;

                             break;

                    }
           }
}

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

  在switch(condition)中,condition只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐式转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,但是在Java1.7中引入了新特性,所以switch语句能作用于String上,前提是Java版本在1.7及1.7以上。

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

  对于前者,s1+1会自动转化为int型,提升了表达式的类型,此时再赋值给short型的话,编译器将报告需要强制类型装换的错误。

  对于后者,+=是java规定的运算符,java编译器会对他进行特殊的处理,因此可以正确编译。

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

  char型变量是用来存储Unicode编码字符的,Unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字。不过某些个特殊汉字没有被包括在Unicode编码字符集中,那么,此时char类型变量中就不能存储这个特殊汉字。值得注意的是,Unicode编码字符占两个字节,所以char类型的变量也是占用两个字节。

8.用最有效率的方法算出2*8等于几?

  2<<3,移位运算符,一个数左移了几位,就相当于乘以了2的几次方。

9.请设计一个一百亿的计算器。

  我们知道int的正数范围为2的31次方,表示的大小为20亿,也就是说不能用普通的加减来计算100亿,咱们可以设计一个类似于java.math.BigInteger类的一个类,这个类内有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数,有一个构造函数,把一个包含有多位数值的字符串转换到内部的符号和字节数组中,提供加减乘除的功能。

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

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

  例如,对于如下语句:

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

  a=new StringBuffer("");
  但是,执行如下语句则可以通过编译:

  a.append(" broken!");

11.“==”和equals方法究竟有什么区别?

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

  equals方法是用于比较两个独立对象的内容是否相同。

  一般来说字符串比较用的是equals。

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

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

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

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

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

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

14.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中还定义了表示整数的最大值和最小值的常量。

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

  Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

16.请说出作用域public、private、protected,以及不写时的区别。

  

这四个作用域的可见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly(同一package中的所有类都能访问)。

 

17.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

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

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

18.构造器Constructor是否可被Override?

  构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

19.接口是否可继承接口?抽象类是否可以实现(implement)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?

  接口可以继承接口。抽象类可以实现接口,抽象类可以继承具体类,抽象类中可以有静态的main方法。

20.写clone()方法时,通常都有一行代码,是什么?

  clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

21.面向对象的特征有哪些方面?

  封装、继承、抽象、多态

22.java中实现多态的机制是什么?

  靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

24.abstract class和interface有什么区别?

  1.抽象类可以有构造方法,接口中不能有构造方法。

  2.抽象类中可以有普通成员变量,接口中没有普通成员变量

  3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

  4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

  eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

  5. 抽象类中可以包含静态方法,接口中不能包含静态方法

  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

  7. 一个类可以实现多个接口,但只能继承一个抽象类。

25.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronize?

26.什么是内部类?Static Nested Class 和 Inner Class 的不同。

  内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特性,只是为了找一个容身之处,所以需要放到一个类中而已。

27.内部类可以引用它的包含类的成员吗?有没有什么限制?

  

  完全可以。如果不是静态内部类,那没有什么限制!如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员,

28.Anonymous Inner Class(匿名内部类)是否可以extends(继承)其他类,是否可以implement(实现)interface(接口)?

  

  可以继承其他类或实现其他接口。不仅是可以,而是必须!

29.下面程序的输出结果是多少?

 

  

import java.util.Date;
public  class Test extends Date{
	public static void main(String[] args) {
		new Test().test();
	}
	public void test(){
		System.out.println(super.getClass().getName());
	}
}

 

  在test方法中,直接调用getClass().getName()方法,返回的是Test类名由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。如果想得到父类的名称,应该用如下代码:getClass().getSuperClass().getName();

30.String是最基本的数据类型吗?

  不是,他是final类型的。

31.String s='Hello';s=s+"world!";这两行代码执行后,原始的String对象中的内容到底变了没?

  没有变,只是s所指的对象发生了改变。

32.是否可以继承String类?

  String类是final类故不可以继承。

  

 

猜你喜欢

转载自www.cnblogs.com/gory/p/12131576.html