Java初级试题

一、问答题(80分)

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

**一个".java"源文件中可以包括多个类,但只能有一个public类,且该public类的类名与文件名相同。

2、  Java有没有goto?

**goto是java里的保留字,已经很少使用。

3、  说说&和&&的区别。

** &是位运算符,表示位运算与。&&是逻辑运算符,表示逻辑运算与。

   &也可以逻辑运算,只不过它是普通与,&&是短路与;

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

Jdk1.7之前,Switch能作用在byte上,不能作用在long和String上。

从jdk1.7开始也能String上

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

short s1 = 1; s1 = s1 + 1是int型的,要强制转换为short型的.

short s1 = 1; s1 += 1(自动会把1判别为short型);编译运行都没错。

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

可以,char是两个字节,是十六位的unicode编码,中文汉字占两个字节。所以可以表示中文汉字。

7、  说说break和continue的区别

Continue只能出现在循环体力,而break还可以出现在switch里的case里面。

都出现在循环体里时:Break 是结束当前所在循环,continue是结束当前循环的本次循环,继续执行当前循环得下次循环。

(要结束多层循环,可以用break 标记名)

8、  "=="和equals方法究竟有什么区别?

(1、==既可以比较对象又可以比较基本数据类型,而equals只能比较对象{比较原始数据类型只能用==}2、比较对象时,二者比较的都是内存地址。但重写equals的类比较的是对象内容,如String,Integer等)

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

1、静态变量(类变量)可以不用实例化对象,直接由类调用(实例对象也可调用静态变量),而实例变量不能。

2、静态变量不初始化,会有默认值,而实例变量不初始化,就不能使用,编译不通过,只能由实例对象调用。

 

10、              静态方法和实例方法的区别?

1、静态方法可以不用实例化对象,直接由类调用,而实例方法不能,静态方法里面只能直接调用静态属性和静态方法。

2、静态变量里不能使用非静态的成员,而实例变量可以使用静态和非静态的成员,还可以调用实例方法,使用实例变量。

 

11、              说说while和do while的区别

While(先执行循环条件)和do while(先执行循环体) 都是循环语句,当条件为真时,二者执行次数相等。当条件为假时,while不会执行,而do while会执行一次循环。

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

Math.round(11.5)结果为12,Math.round(-11.5)为-11;

13、              int 和 Integer 有什么区别

int是java里的基本数据类型,并不面向对象,没有方法和属性。Integer是int的封装类(引用类型),面向对象,提供很多方法和属性,方便使用,更加灵活。

14、              请说出作用域public,private,protected,以及不写时的区别(类前面只能用public或者不写。四种访问控制修饰符都可以修饰属性和方法)

                        包外                          包内                   子类            本类

 Public      可以访问            可以访问           可以访问     可以访问

 

 

     Private         不可以                      不可以                  不可以           可以防问

Protected       不可以                         可以防问              可以防问       可以访问

默认               不可以                         可以防问              不可以           可以防问

15、              Overload和Override的区别

Overload是方法重载,重载规则是同名不同参,属于一个类里面的多态(同一个类里面有多个同名字的方法,只是参数列表不同)。

Override是方法重写,方法名同,参数列表和返回类型相同,访问权限不能比父类的小,需要有继承关系,是子类重写父类方法。

16、              构造器Constructor是否可被override?

不可以,(构造器不能被继承,只有继承下来的东西才有资格被重写),但可以被重载。

17、              接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)?(接口可以多继承,类是单继承多实现)

一个接口是可以继承(多个)接口。 抽象类是可以实现(implements)(多个)接口。 抽象类是可以继承具体类(concrete class)。

18、              面向对象的特征有哪些方面

抽象,封装,继承,多态(同一种事物的多种形态,方法重载是一个类里的多态,方法重写,父类引用指向子类对象);

19、              abstract class和interface有什么区别?(执行顺序:静态属性(只执行一次)->静态代码块->普通属性->普通块->构造器)

抽象类是实现类的抽象,接口是抽象类的再抽象。

抽象类,可有抽象方法,也可以没有,实现类(普通类)必须没有抽象方法,实现类可以实例化,抽象类是不能被实例化的,1,但抽象类里可以有构造器(类里面至少有一个构造器)。

,2,接口是抽象类的再抽象,(接口里不能定义构造器的)3,接口里面的属性必须是常量,4,接口里的方法全是构造方法。5,接口里面没有初始化块,类里面可以定义。

20、              String是最基本的数据类型吗?(引用数据类型:类,接口,数组)

String 不是基本的数据类型,属于引用数据类型。(是一个final类,不能被继承)。

21、              String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?(产生了三个对象)

没有改变,String类声明的对象内容不可改变,不过这两行代码执行后会产生新的对象

22、              是否可以继承String类?

不可以,String是一个final类,不能被继承。

 

23、              String 和StringBuffer的区别

        String类声明的对象内容不可改变,不能被改变,

       Stringbuffer 是字符串变量,可以被改变。

24、              数组有没有length()这个方法? String有没有length()这个方法?

      数组没有length()这个方法,有length属性. String有length()这个方法。

 

25、              这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 为什么?(String每次运算都会产生一个新的对象)

         7个。只要用“”括起来的就是一个对象,然后相加后又产生一个对象abcd

26、              try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会被执行,在return前执行。

 

27、              下面的程序代码输出的结果是多少? 2

public class  smallT

{

    public static void  main(String args[])

    {

        smallT t  = new  smallT();

        int  b  =  t.get();

        System.out.println(b);

    }

   

    public int  get()

    {

        try

        {

            return 1 ;//执行不了

        }

        finally

        {

            return 2 ;//ruturn

        }

    }

}

28、              final, finally, finalize的区别。

        Fianl 是java关键字,表示最终的,可以修饰类,方法,变量,final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是常量。

         Finally 是出现异常时都会执行的,

        Finalize 是一个类,回收垃圾。

29、              请写出你最常见到的5个runtime exception。

ArrayIndexOutException

ClassNotFoundException

IOException

FileNotFoundException

IndexOutOfBoundsException

空指针

算术异常

输入不合法

30、              多线程有几种实现方法?分别是什么

2种,一个是实现Runnable接口,一种是继承Thread类。

31、              启动一个线程是用run()还是start()?

        用start()启动一个线程,但并不一定立即执行,而是通过run方法(任务方法)来决定线程的执行与停止

32、              sleep() 和 wait() 有什么区别?

        sleep()是休眠一段时间,时间一到,变有编译器自动启动,并不释放对象锁。Wait()释放对象锁。

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

public class ThreadTest1

{

private int j;

public static void main(String args[]){

   ThreadTest1 tt=new ThreadTest1();

   Inc inc=tt.new Inc();

   Dec dec=tt.new Dec();

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

       Thread t=new Thread(inc);

       t.start();

          t=new Thread(dec);

       t.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<100;i++){

       inc();

       }

   }

}

class Dec implements Runnable{

   public void run(){

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

       dec();

       }

   }

}

}

   

34、              说说List和Set的区别和联系

 

        List 存放对象时是有序的,可以有重复值,也可以有多个空值,而set是无序的不能有重复值。

二者 都继承自collection

Map是以键值对存在的,以键找值

35、              说出一些常用的类,包,接口,请各举5个

         类:TreeMap,System,Object,Toolkit,Exception

包:java.util.*; java.io.*; java.exception.*; java.lang.*; java.net.*;

接口:list,set  ,map,collection,Runnuble

36、              垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?(程序员不可能也不能够写代码来回收垃圾,回收垃圾是jdk自己判断回收的)

     基本原理就是虚拟机每隔一段时间就会运行一次垃圾回收或是在虚拟机认为需要的时候。
主动调用是System.gc()。垃圾回收器运行了当然会收回内在。但悲剧的是,垃圾回收是任何程序员都无法自己控制的,也就是说即使调用了System.gc(),也只是通知虚拟机要回收垃圾,至于虚拟机什么时候运行回收器就不知道了。

 

37、              继承有什么好处?

 

       继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起类的新层次。

简单点就是便于维护便于子类扩展,让你少写代码,代码越多出错概率也就越大

        可以避免代码复用,方便。实现多态

38、              说说Java多态的表现形式。

1、  有继承

2、  子类重写父类方法

3、  父类引用指向子类对象

不同对象调用同一个方法会出现不同的结果

39、              UML是什么?常用的UML图形有哪些?

         UML是(统一)标准建模语言,是一种面向对象的建模语言,它是运用统一的、标准化的标记和定义实现对软件系统进行面向对象的描述和建模。

               标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。(流程图,功能模块图,用例图,e-r图)

40、              什么是单例模式,请写段程序表达单例。(单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。)

        一个类有且只能创建一个对象,每次创建的对象都是一个对象。

        //懒汉式单例类.在第一次调用的时候实例化

 public class Singleton2 {

     //私有的默认构造子

     private Singleton2() {}

     //注意,这里没有final   

     private static Singleton2 single=null;

     //静态工厂方法

     public synchronized  static Singleton2 getInstance() {

          if (single == null) { 

              single = new Singleton2();

          } 

         return single;

     }

 }

二、代码纠错题(10

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

大侠们,这有何错误?

 

局部变量前不能用任何访问修饰符(protected public private),final是可以用来修饰局部变量的。Final 属于非访问修饰符。

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

大侠们,这有何错误?

private abstract String doSomething ();
抽象方法必须被重写,不能是私有的

4、public class Something {    //常量没赋初值是不能使用的
   public int addOne(final int x) {
       return ++x;//常量的值不能被修改
   }
}

大侠们,这有何错误?

常量不能被修改

5、class Something {
    final int i; //常量没赋初值是不能使用的,常量是没有默认值的,成员变量是有默认值的(现在就要赋值,否则编译出错)

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

大侠们,这有何错误?

错误

三、编程题(10分)

1、使用Java编程:打印九九乘法表

package test;

 

public class Demo1 {

 

    public static void main(String[] args) {

       for(int i=1;i<=9;i++){

           for(int j=1;j<=i;j++){

              System.out.print(j+"*"+i+"="+i*j+"\t");

           }

           System.out.println();

       }

    }

}

 

2、使用Java编程:使用冒泡排序,将给出的数据由小到大排序。

(数据:5  9  87  56  93  12  45  66  100  2)

package test;

 

public class Demo2 {

 

    public static void main(String[] args) {

       int in[]={5 ,9,  87,  56,  93,  12,  45,  66,  100,  2};

       for(int i=in.length-1;i>0;i--){

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

              if(in[i]<in[j]){

                 int temp=in[i];

                 in[i]=in[j];

                 in[j]=temp;

              }

          }

       }

       for(int i:in){

           System.out.print(i+"  ");

       }

    }

}