Java面试题二:基础语法(续面试题一)

来源:互联网 发布:mac怎么新建txt文件 编辑:程序博客网 时间:2024/06/06 03:29

Java面试题二:基础语法(续面试题一)

节选自《Java求职宝典·java   李伟、白伟明等编著

1.     java中没有引用传递,只有值传递。

2.     java中通过重载和重写实现多态。

3.     自动装包/拆包:自动完成基本数据类型与对应的包装类型的转换。

4.     Java中存在内存泄露。

5.     String不是java的基本数据类型。它是字符串对象。

6.     Java8中基本数据类型:boolean,byte,char,double,float,int,long,short.

7.     Goto作为java语言的保留关键字,但是目前没有使用。

8.     变量和常量的区别:

变量的值可以改变,常量的值不能改变。

9.      “3+5”=+3+5的值是?

“3+5”=35

10. 局部变量可以定义私有修饰类型么?

答:局部变量前不能放置任何访问修饰符,包括private,public和protected,但是final可以用来修饰局部变量,但这样修饰后,它会变为常量。

11. 下列代码的运行结果是:

public class Test {

       publicstatic void main(String[] args) {

              System.out.println((3-2.6==0.4));

       }

}

解答:在java中,浮点数的运算可能出现误差,在本题中,3-2.6的结果是0.3999999999,因此代码的返回值是false。

以下节选自互联网

12.floatfloat f=3.4是否正确?

答:答:不正确;精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4

12. shorts1 = 1; s1 = s1 + 1;有什么错?

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

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

short s1 = 1; s1 += 1;可以正确编译,自动类型提升。

13.int Integer 有什么区别?

答:Java 提供两种不同的类型:引用类型和原始类型(或内置类型); int是java的原始数据类型,Integer是java为int提供的封装类。

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

14.简述逻辑操作(&,|,^)与条件操作(&&,||)的区别?

答:区别主要有两点:

a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型

b.逻辑操作不会产生短路。

15.构造器Constructor是否可被override?

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

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

答:不对,有相同的hash code。

 

 

17.JAVA中,如何跳出当前的多重嵌套循环?

 答:在最外层循环前加label标识,然后用break:label方法即可跳出多重循环。

     示例:

      ok:while(true){

      while(true){

        break ok;

      }

}

18.是否可以继承String?

答:String类是final类,故不可以继承。

19.以下二条语句返回值为true的有:

A:“beijing”==“beijing”;

B:“beijing”.equalsIgnoreCase(newString(“beijing”));

答:A 和B 。

答案详细解析:http://www.cnblogs.com/devinzhang/archive/2012/01/25/2329463.html

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

答:Clone 有缺省行为:super.clone(),他负责产生正确大小的空间,并逐位复制。

21. GC是什么? 为什么要有GC?

答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。

要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc()。

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

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

回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

23.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

答:对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

24.Strings=new String(xyz);创建了几个String Object?

答:两个对象,一个是”xyx”,一个是指向”xyx”的引用对象s。

25.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?

答:接口可以继承接口。

抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。

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

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

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

答:可以;必须只有一个类名与文件名相同并且权限为public,其他类不能为public

28.说出一些常用的类,包,接口,请各举5

答:常用的类:BufferedReader BufferedWriter FileReader FileWirterString Integer;

常用的包:java.lang java.awt java.io java.util java.sql;

常用的接口:Remote List Map Document NodeList

29.AnonymousInner Class (匿名内部类)是否可以extends(继承)其它类?是否可以implements(实现)interface(接口)?

答:可以继承其他类或实现其他接口,在swing编程中常用此方式。

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

答:完全可以。如果不是静态内部类,没有什么限制!

如果把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员

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

答:方法的覆盖Overriding和重载Overloading是java多态性的不同表现;覆盖Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

32.java中一个类被声明为final类型,表示了什么意思?

答:表示该类不能被继承,是顶级类。

33.指出下面程序的运行结果:

class A{

    static{

        System.out.print("1");

    }

    public A(){

        System.out.print("2");

    }

}

class B extends A{

    static{

        System.out.print("a");

    }

    public B(){

        System.out.print("b");

    }

}

public class Hello{

    public static void main(String[] ars){

        A ab = new B();

        ab = new B();

    }

}

答:输出结果为1a2b2b;类的static代码段,可以看作是类首次加载(虚拟机加载)执行的代码,而对于类加载,首先要执行其基类的构造,再执行其本身的构造。

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

答:在switch(expr1)中,expr1 只能是一个整数表达式或者枚举常量(更大字体) ,整数表达 式可以是 int 基本类型或 Integer 包装类型,由于,byte,short,char都可以隐含转换为 int,所 以, 这些类型以及这些类型的包装类型也是可以的。显然, long 和String 类型都不符合 switch 的语法规定,并且不能被隐式转换成 int 类型,所以,它们不能作用于 swtich 语句中。

 

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

答:char 型变量是用来存储 Unicode 编码的字符的,unicode编码字符集中包含了汉字,所以, char

型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码 字符集中,那么,这个char 型变量中就不能存储这个特殊汉字。补充说明:unicode 编码占 用两个字节,所以char 类型的变量也是占用两个字节。

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

答:2 << 3

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

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

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

答:“==”比较的是两个对象时,内存地址和内容是否都相等。

Equals比较的是两个对象时,内容是否相等,和内存地址是没有关系的。

示例:

    public class Test {

       public static void main(String[] args) {

              String a=new String("foo");

              String b=new String("foo");

              System.out.println(a==b);

              System.out.println(a.equals(b));

       }

}

  运行结果为:false

              true

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

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

     在程序运行时的区别:

实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变 量才会被分配空间,才能使用这个实例变量。

静态变量不属于某个实例对象,而是属于类, 所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。

     总之, 实例变量必须创建对象后才可以通过这个对象来使用, 静态变量则可以直接使用 类名来引用。

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

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

41.关于math

答:ceil 该方法就表示向上取整, Math.ceil(11.3) 的结果为12,Math.ceil(-11.3)的结果是-11;

    floor 的英文意义是地板, 该方法就表示向下取整, Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;

42.下面的代码有什么不妥之处?

1. if(username.equals(“zxx”){} 

答:如果username初值为null在编译的时候会有警告,运行的时候抛出异常

如果username写在后面即使初值为null也不会抛异常

   2. int x = 1; return x==1?true:false;

   答:代码冗余无需还要三木运算符判断是否为true或者false,直接返回boolean类型就可以了

43.请说出作用域 publicprivateprotected,以及不写时的区别。

答:

   

44.Overload Override的区别。

Overloaded的方法是否可以改变返回值的类型?重载 Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同, 通过子类创建的实例对象调用这个方法时, 将调用子类中的定义方法, 这相当于把父类中定义的那个完全相同的方法给覆盖了,

这也是面向对象编程的多态性的一种表现。 在覆盖要注意以下的几点: 1

1. 覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2.覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;4、

被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行 覆盖。

 在使用重载要注意以下的几点:

 1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不

同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float), 但是不能为

fun(int,int)) ;

2、不能通过访问权限、返回类型、抛出的异常进行重载;3、方法的异常类型和数目不会对重载造成影响;4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。 如果几个 Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这 是不行的。

45.构造器 Constructor是否可被 override?

 答:Constructor不能被继承,因此不能重写 Override,但可以被重载Overload。

46. 接口是否可继承接口?抽象类是否可实现(implements)接口?

抽象类是否可继承具体类 (concrete class)?

抽象类中是否可以有静态的 main 方法?

答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类不可以继承具体类。抽象类中可以有静态的 main 方法。

只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有 abstract 方法。

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

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

48.abstractclass interface 有什么区别?

答:含有 abstract 修饰符的class 即为抽象类, abstract 类不能创建的实例对象。 含有abstract 方法的类必须定义为 abstract class,abstractclass 类中的方法不必是抽象的。abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静 态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。 接口(interface

)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。 接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。

下面比较一下两者的语法区别:

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

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

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

  的普通方法。

4. 抽象类中的抽象方法的访问类型可以是 public,protected和(默认类型,虽然 eclipse 下不 报错,但应该也不行),但接口中的抽象方法只能是 public 类型的,并且默认即为publicabstract 类型。

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

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

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

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

答:都不可以,因为abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现,至于你的具体实现可以是native和synchronized,也可以不是,抽象方法是不关心这些事的,所以写这两个是没有意义的。然后,static方法是不会被覆盖的,而abstract方法正是要子类去覆盖它,所以也是没有意义的。所以,总的来说,就是java语法不允许你这样做,事实上,也没有意义这样做。

50.什么是内部类?StaticNested Class Inner Class 的不同。

答:内部类就是在一个类的内部定义的类, 内部类中不能定义静态成员, 内部类可以直接访 问外部类中的成员变量, 内部类可以定义在外部类的方法外面, 也可以定义在外部类的方法 体中。在方法外部定义的内部类前面可以加上 static 关键字,从而成为 Static Nested Class,它 不再具有内部类的特性,所有,从狭义上讲,它不是内部类。Static Nested Class 与普通类在 运行时的行为和功能上没有什么区别, 只是在编程引用时的语法上有一些差别, 它可以定义 成 public、protected、默认的、private等多种类型,而普通类只能定义成 public 和默认的这 两种类型。在外面引用 Static Nested Class 类的名称为“外部类名.内部类名” 。在外面不需要创建外部类的实例对象, 就可以直接创建 Static Nested Class,例如, 假设Inner 是定义在 Outer 类中的Static Nested Class,那么可以使用如下语句创建 Inner 类:Outer.Inner inner = newOuter.Inner(); 由于static Nested Class 不依赖于外部类的实例对象,所以,static Nested Class 能访问外部类 的非static 成员变量。当在外部类中访问 Static Nested Class 时,可以直接使用StaticNested Class 的名字,而不需要加上外部类的名字了,在Static Nested Class 中也可以直接引用外部 类的static 的成员变量,不需要加上外部类的名字。 在静态方法中定义的内部类也是Static Nested Class,这时候不能在类前面加static 关键字,

静态方法中的 Static Nested Class 与普通方法中的内部类的应用方式很相似, 它除了可以直接 访问外部类中的 static 的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量 前必须加

final 修饰符。

 【未完待续】。。。

大笑大笑本文由安康学院"雨季"原创!

 

原创粉丝点击