java面试题

来源:互联网 发布:wis隐形水润面膜知乎 编辑:程序博客网 时间:2024/05/16 05:46

1、改错题

1.class Something

{

     final int i;

     public void doSomething()

     {

         System.out.println("i = " + i);

     }

}

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

2.

public class Something

{

    public int addOne(final int x)

    {

        return++x;

    }

}

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

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里我们修改了oreference

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

(成员变量),而oreference并没有改变。

3.

public class Something

{

    void doSomething ()

   {

        private String s = "";

        int l = s.length();

    }

}

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

2、编程题

1.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。
package java_example150;

public class TestThread3{
 private int j;
 public static void main(String[] args){
  TestThread3 t = new TestThread3();
     Inc inc = t.new Inc();
     Dec dec = t.new Dec();

     for(int i=0;i<2;i++){
      Thread ts = new Thread(inc);
      ts.start();
      ts= new Thread(dec);
      ts.start();
     }
 }
 private synchronized void inc(){
     j++;
     System.out.println(Thread.currentThread().getName()+"-inc:"+j);
 }
 private synchronized void dec(){
     j--;
     System.out.println(Thread.currentThread().getName()+"-dec:"+j);
 }
 class Inc implements Runnable{
    public void run(){
     for(int i=0;i<10;i++){
      inc();
     }
    }
 }

 class Dec implements Runnable{
  public void run(){
   for(int i=0;i<10;i++){
    dec();
   }
     }
 }
}

2.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");"改变了ballreference,而这里的ball来自Rollable interfaceRollable interface里的ballpublic static final的,finalobject是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。


3.如果类a继承类b,实现接口c,而类b和接口c中定义了同名变量,请问会出现什么问题?(瞬联)

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();
       }
}


JAVA常见面试题及解答(精华)  

2009-05-20 14:47:25|  分类:编程语言 |字号 订阅

1transientvolatilejava关键字吗?(瞬联)

如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如:

class T

{   

      transient int a;  //不需要维持

      int b;  //需要维持

}  

这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。

volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变。在多线程程序中,有时两个或更多的线程共享一个相同的实例变量。考虑效率问题,每个线程可以自己保存该共享变量的私有拷贝。实际的变量副本在不同的时候更新,如当进入synchronized方法时。strictfp修饰类或方法,可以确保浮点运算(以及所有切断)正如早期的Java版本那样准确。切断只影响某些操作的指数。当一个类被strictfp修饰,所有的方法自动被strictfp修饰。

strictfp的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp

你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字,例如下面的代码:

strictfp interface A {}

public strictfp class FpDemo1 {   

      strictfp void f() {}   

}  

2.错误的使用方法

interface A {   

    strictfp void f();   

}   

public class FpDemo2 {   

    strictfp FpDemo2() {}   

}

一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合IEEE-754规范

的。例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。
原创粉丝点击