天天看点

Java面试题

1.

abstract class Name {         private String name;         public abstract boolean isStupidName(String name) {}     }      

答案: 错。abstract method必须以分号结尾,且不带花括号。

2.

public class Something {         void doSomething () {             private String s = "";             int l = s.length();         }     }      

答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量

(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

3.

abstract class Something {         private abstract String doSomething ();     }      

答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract

method封锁起来呢? (同理,abstract method前不能加final)。

4.

public class Something {         public int addOne(final int x) {             return ++x;         }     }      

这个比较明显。

答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。

5.

public class Something {         public static void main(String[] args) {             Other o = new Other();             new Something().addOne(o);         }         public void addOne(final Other o) {             o.i++;         }     }     class Other {         public int i;     }      

答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference

(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable

(成员变量),而o的reference并没有改变。

6.

class Something {         int i;         public void doSomething() {             System.out.println("i = " + i);         }     }      

答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

7.

class Something {         final int i;         public void doSomething() {             System.out.println("i = " + i);         }     }      

答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int i = 0;"。

8.

public class Something {         public static void main(String[] args) {             Something s = new Something();             System.out.println("s.doSomething() returns " + doSomething());         }         public String doSomething() {             return "Do something ...";         }     }      

答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能访问non-static instant variable。

9.

此处,Something类的文件名叫OtherThing.java

class Something {         private static void main(String[] something_to_do) {              System.out.println("Do something ...");         }     }      

答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。

10.

interface A{         int x = 0;     }     class B{         int x = 1;     }     class C extends B implements A {         public void pX(){             System.out.println(x);         }         public static void main(String[] args) {             new C().pX();         }     }      

答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。

11.

interface Playable {         void play();     }     interface Bounceable {         void play();     }     interface Rollable extends Playable, Bounceable {         Ball ball = new Ball("PingPang");     }     class Ball implements Rollable {         private String name;         public String getName() {             return name;         }         public Ball(String name) {             this.name = name;          }         public void play() {             ball = new Ball("Football");             System.out.println(ball.getName());         }     }      

这个错误不容易发现。

答案: 错。"interface Rollable extends Playable, Bounceable"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。

3、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 

答:父类: 

package test;      public class FatherClass {          public FatherClass() {              System.out.println("FatherClass Create");          }      }      

子类: 

package test;     import test.FatherClass;      public class ChildClass extends FatherClass {          public ChildClass() {              System.out.println("ChildClass Create");          }          public static void main(String[] args) {              FatherClass fc = new FatherClass();              ChildClass cc = new ChildClass();          }      }      

输出结果: 

C:>java test.ChildClass 

FatherClass Create 

ChildClass Create 

4、内部类的实现方式? 

答:示例代码如下: 

package test;          public class OuterClass {              private class InterClass {                  public InterClass() {                      System.out.println("InterClass Create");                  }              }              public OuterClass() {                  InterClass ic = new InterClass();                      System.out.println("OuterClass Create");                  }              public static void main(String[] args) {                  OuterClass oc = new OuterClass();              }      }      

输出结果: 

C:>java test/OuterClass 

InterClass Create 

OuterClass Create 

再一个例题: 

public class OuterClass {          private double d1 = 1.0;          //insert code here      }      

You need to insert an inner class declaration at line 3. Which two inner class declarations are 

valid?(Choose two.) 

A. 

class InnerOne{          public static double methoda() {return d1;}      }      

B. 

public class InnerOne{          static double methoda() {return d1;}      }      

C. 

private class InnerOne{          double methoda() {return d1;}      }      

D. 

static class InnerOne{          protected double methoda() {return d1;}      }      

E. 

abstract class InnerOne{          public abstract double methoda();      }      

说明如下: 

一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。 故 A、B 错 

二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1 出错。故 D 错 

三.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确 

四.答案为C、E 

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

基本数据类型包括byte、int、char、long、float、double、boolean和short。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类

原始类型封装类

booleanBoolean

charCharacter

byteByte

shortShort

intInteger

longLong

floatFloat

doubleDouble

引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

Collection 和 Collections的区别。 

  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

HashMap和Hashtable的区别。 

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

Overloaded的方法是否可以改变返回值的类型?

Overloaded的方法是可以改变返回值的类型。

abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

heap和stack有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。

堆是栈的一个组成元素

forward 和redirect的区别

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 

Static Nested Class 和 Inner Class的不同。[/b] 

    Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

什么时候用assert。 

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

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

    short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)

short s1 = 1; s1 += 1;(可以正确编译)

String s = new String("xyz");创建了几个String Object? 

    两个

List, Set, M ASDFFBap是否继承自Collection接口?

    List,Set是,Map不是

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

    都不能

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

    equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

构造器Constructor是否可被override?

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

是否可以继承String类?

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

编程题: 用最有效率的方法算出2乘以8等於几? 

2 << 3

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

不对,有相同的hash code。

Java的接口和C++的虚类的相同和不同处。

由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。

垃圾回收的优点和原理。并考虑2种回收机制。

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

请说出你所知道的线程同步的方法。

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 

描述一下JVM加载class文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

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

能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的

多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 

同步的实现方面有两种,分别是synchronized,wait与notify

线程的基本概念、线程的基本状态以及状态之间的关系

线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 

问:怎样让char类型的东西转换成int类型? 

答:

char c = 'A'; 

int i = c; 

//反过来只要作强制类型转换就行了 

c = (char) I;

87已有学员信息表{学号;姓名},表中已有记录:{1,张一;2,张二;…….100,张一百},现在要把李四放到学号54的位置,后面的其他学员,学号依次递增,请写出sql语句实现。

已有学员信息表{学号,班级,学科,姓名,成绩},现要查询出各班语文成绩前10名,并且数学成绩不在倒数10名范围内的人员信息,请写出sql语句实现。