您的位置:首页 > 编程语言 > Java开发

java基础经典五十问

2014-02-08 15:31 155 查看
1、&和&&的区别。

答:&是位运算符,&&是布尔逻辑运算符。&也可用于逻辑运算,但是此时他不支持短路运算(即如果第一个变量的值为false,他还会判断第二个变量的bool值)

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

答:Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11.

3、抽象类是否必须要有抽象方法?

答:不是必须的。如果一个类有抽象方法,这个类必须是抽象类;但是如果一个类是抽象类,不一定有抽象方法。

4、java中的可变长参数一般用于什么情况?注意事项是什么?

答:可变长参数用于处理方法重载中,参数类型相同,个数不同的情况;这样我们就免去写大量重复代码的麻烦!注意事项是:在一个方法中只能有一个可变长参数,而且,必须放在最后一个参数的位置!

5、能否用原始类型来实例化泛型?

答:不可以。如:GenList<int> nList = new GenList<int>(); //会产生编译错误

6、泛型有没有多态?

答:没有多态。编译类型的泛型和运行时类型的泛型一定要一致!

List<Dog> as = new ArrayList<Dog>();

List<Animal> l = as; //error Animal与Dog的父子关系不能推导出List<Animal> 与 List<Dog> 之间的父子类关系

7、List, Set, Map是否继承自Collection接口?

答:List、Set是而Map不是。

8、switch语句的参数需要满足什么条件?

答:参数必须为byte、short、int或char类型(数据类型长度小于等于32位),在JDK5.0中可以是枚举类型!

9、最有效率的算出2乘以8等於几的算法?

答:2 << 3

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

答:不对!两个对象如果满足x.equals(y) == true,那么一定满足x.hashCode()==y.hashCode();

但是如果两个对象如果满足x.hashCode()==y.hashCode(),那么不一定满足x.equals(y) == true;这是java规范中的定义,我们在定义自己的类的时候,很多情况下需要重写equals()方法和hashCode()方法,必须满足上面的规范。

11、java中有没有引用传递?

答:没有,java中只有值传递!虽然我们将一个“对象引用”作为方法参数时,可以在方法中对该引用对应的对象进行修改,并返回给方法调用者,但是我们永远无法改变这个引用本身的值!

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

答:会执行,在return前执行。但是如果此时在finally{}后还有语句,则这些语句不会再执行!

13、在try - catch 块中遇到System.exit(0)还会不会执行finally中的代码?

答:不会再执行!因为exit(0)的作用是终止当前虚拟机!

14、当try后面有多个语句块时,catch异常块的顺序应该遵循什么原则?

答:必须保证子Exception类必须放在父Exception类的前面,这样才可能保证产生的每个异常能分别被捕捉到。也可由同一异常进行处理,前提是这个共用的异常应该是所有这些该被捕获的异常的父类!

15、for-each语句是为处理哪两种类型提出的?

答: 数组和集合.利用该语句消除了程序员需要考虑数组和集合长度的麻烦!

16、int和String,Integer和String以及int和Integer相互转化的方法分别是什么?

答:int--------->String---------------------:静态方法String.valueOf()

String---------->int--------------------:静态方法Integer.parseInt()

Integer-------->String----------------:x.toString()方法//x为一个Integer的实例

String---------->Integer--------------:静态方法Integer.valueOf()

int-------------->Integer--------------:new Integer(int x)

Integer-------->int--------------------:x.intValue()//其中x是一个Integer的实例

17、请对比一下ArrayList和LinkedList?

答:ArrayList 数组 查询快 增删操作慢

LinkedList 链表 查询慢 增删操作快

18、先后执行下面三条语句int a=5;int b=a<<33;System.out.println(b);b的最终结果是多少?

答:结果b=10,移位运算时系统会以32为基数对33求余!

19、接口中是否可以有静态方法?

答:不可以!

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

答:数组没有length()这个方法,有length的属性;String有length()这个方法。

21、abstract的method是否可以是static,native或synchronized修饰的?

答:都不能!

22、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其他方法?

答:视情况而定。

1、如果另一个方法是非互斥方法,那么可以进入。

2、如果另一个方法同样是互斥方法且和该方法对应同一个互斥对象,那么不可以进入。

3、如果另一个方法同样是互斥方法且和该方法对应不同的互斥对象,那么可以进入。

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

答:可能是一个、也可能是两个!一个的情况是只在堆中创建了一个“xyz”对象;两个的情况是在堆中和String池中分别创建了一个!

24、short s1 = 1; s1 = s1 + 1;有错吗? short s1 = 1; s1 += 1;有错吗? short s1=1;s1++;有错吗?

答:前者有错,次者没有错,后者没有错!次者和后者等价于s1=(short)(s1+1)。

25、从局部内部类中访问局部变量需要满足什么条件?

答:将局部对象声明为最终类型。

26、>>和>>>的区别是什么?

答:>>是用符号位填充右移后的空缺,>>>是用0填充右移后的空缺。

27、整数除0有异常,double除0有没有异常?

答:没有异常!Double除0的结果是Infinity(无穷大)!

28、const和goto是不是java的关键字?

答:不是,const和goto是java的保留字。

29、将一个整型变量赋给字符型会不会产生错误?将一个整数赋给字符型会不会产生错误?

答:前者会,后者不会!

30、我们在如下的包结构上定义了一个类ClassA,Packet1.Packet2.ClassA ,运行ClassA时在哪儿运行?

答:运行时要在包结构的上一层目录来运行。即:java Packet1.Packet2.ClassA ,直接在Packet2下运行不会成功!

31、java进行方法重写是应该遵循什么原则?

答:1、重写的方法不能比被重写的方法有更严格的访问权限;

2、重写的方法不能比被重写的方法产生更多的异常;

3、如果方法是静态的,那么重写的方法没有多态;

32、float a=3.4有什么错误?

答:实数在java中默认是Double型的,应该定义为float a=3.4f

33、public class TestWhile{

public static void main(String args[]){

while(true){

System.out.println("hello");

}

System.out.println("stop");

}

}上面的程序能否顺利通过编译?

答:不能!如果将System.out.println("stop");去掉就可以通过!

34、public class TestWhile{

public static void main(String args[]){

boolean bool=true;

while(bool){

System.out.println("hello");

}

System.out.println("stop");

}

}上面的程序能否顺利通过编译?

答:能!!!

35、java中的属性有没有多态性?

答:没有!子类的属性和父类的属性同名时叫遮盖(区覆盖),属性的遮盖是没有多态的。关于属性遮盖的种种问题,可以参见我的另一篇博客-----“java继承时的几个注意事项”!

36、用this()调用同一个类的其他构造方法,需要注意什么?

答:必须将this()放在构造方法的第一行!注意:此时this()是在构造方法中的,即在成员方法中不能使用this()形式来调用构造方法!

37、方法重写时,父类中的私有方法与子类中的方法能否构成覆盖关系?

答:不能!也就是说只有父类被子类继承过来的方法,才有可能与子类自己的方法构成覆盖关系!

38、实现代码复用有哪两种形式?

答:1、白盒复用,也就是继承复用,破坏封装,父类中的可以被子类访问到的就可以被继承,这样会有些不需要的内容被继承下来,所以这种方式不太好。

2、黑盒复用,也叫组合复用,也就是把要复用代码的类的对象作为本类中的一个属性,然后再通过方法的委托来实现有选择的复用。方法的委托就是在本类的方法内部通过该类的对象调用要使用类的方法,不破坏封装。

注意:尽量用组合复用替代继承复用。

39、可否用private和protected修饰一个类?

答:不可以!!

40、public class test{

public static void main(String args[]){

String s="abc";

String s1=s.intern();

System.out.println(s==s1);

}

}

上面的程序输出什么?答:true!

public class test{

public static void main(String args[]){

String s=new String("abc");

String s1=s.intern();

System.out.println(s==s1);

}

}

上面的程序输出什么?答:false!

41、如果子类从父类继承了一个静态方法(没有对其进行重写),那么当通过子类命调用该方法时,会不会加载子类?

答:不会!只会加载父类!

42、向HashSet和TreeSet中添加自定义类时,分别需要注意什么?

答:HashSet:采用哈希算法保证元素不重复,自定义类需要根据实际情况对hashCode()和equals()进行继承或重写!

TreeSet:自定义类必须要实现comparable接口!

43、接口的意义都有哪些?

答: 1,接口可以实现多继承。

2,用接口可以实现混合类型(主类型,副类型),java中可以通过接口分出主次类型。主类型使用继承,副类型,使用接口实现。

3,他起到了降低耦合性的作用,接口可以使方法的定义和实现相分离,也就是将接口的定义者和实现者相分离,接口也可以用于降低模块间或系统间的耦合性。

4、 针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。

44、匿名内部类)是否可以继承其它类,是否可以implements(实现)interface(接口)?

答:匿名的内部类是没有名字的内部类。不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

45、Collection 和 Collections的区别是什么?

答:Collections是个java.util下的类,它包含有各种有关集合操作的静态方法!Collection是个java.util下的接口,它是各种集合结构的父接口。

46、error和exception有什么区别?

答:error是不能再程序中预先对其进行处理的非常严重的程序运行时错误,如缓冲区溢出;

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

47、HashMap和Hashtable的区别?

答:都属于Map接口的类,实现了将惟一键映射到特定的值上。HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。

Hashtable 类似于HashMap,但是不允许null 键和null 值,它也比HashMap慢,因为它是同步的。

48、什么时候用assert?

答:断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true。如果表达式计算为 false,那么系统会报告一个

AssertionError。它用于调试目的:

assert(a > 0); // throws an AssertionError if a <= 0

断言可以有两种形式:

assert Expression1 ;

assert Expression1 : Expression2 ;

Expression1 应该总是产生一个布尔值。

Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。

断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:

javac -source 1.4 Test.java

要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。

要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。

要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。

1.可以在预计正常情况下程序不会到达的地方放置断言 :assert false

2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代

码的健壮性)

3.使用断言测试方法执行的前置条件和后置条件

4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)

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

答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overload是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

50、this关键字是否可以作为函数参数?

答:可以!代码如下:

class A

{

public void run()

{

new B(this).run();//此处this的用法见下面的解释

}

}

class B

{

private A a;

String name = "张三";

public B(A a)

{

this.a = a;

}

public void run()

{

System.out.println(name + " is running!!!!!");

}

}

类A中有个run()方法,类B中也有个run()方法,在类A中的run()方法中调用类B的run()方法,首先我们需要在类A的run()方法中创建一个类B的

对象即new B(A a),

根据第三种this的用法,在该类中,我们可以用this来指向该类的对象实例,所以可以写成new B(this).run();

写出main方法测试一下

class Demo

{

public static void main(String [] args)

{

A a = new A();

a.run();

}

}

运行结果:张三 is running!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: