﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-天猫的Blog-文章分类-面试题</title><link>http://www.blogjava.net/tianmaoye/category/34444.html</link><description>...从明天起，做一个幸福的人。...喂马，劈柴，周游世界。...从明天起，开始关心粮食和蔬菜。...我有一所房子，面朝大海春暖花开......</description><language>zh-cn</language><lastBuildDate>Fri, 05 Sep 2008 10:01:06 GMT</lastBuildDate><pubDate>Fri, 05 Sep 2008 10:01:06 GMT</pubDate><ttl>60</ttl><item><title>Java查错题</title><link>http://www.blogjava.net/tianmaoye/articles/227287.html</link><dc:creator>飞行鱼</dc:creator><author>飞行鱼</author><pubDate>Fri, 05 Sep 2008 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/tianmaoye/articles/227287.html</guid><wfw:comment>http://www.blogjava.net/tianmaoye/comments/227287.html</wfw:comment><comments>http://www.blogjava.net/tianmaoye/articles/227287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianmaoye/comments/commentRss/227287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianmaoye/services/trackbacks/227287.html</trackback:ping><description><![CDATA[<p>1.<br />
abstract class Name {<br />
&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp; public abstract boolean isStupidName(String name) {}<br />
}<br />
大侠们，这有何错误?<br />
答案: 错。Abstract method必须以分号结尾，且不带花括号。<br />
2.<br />
public class Something {<br />
&nbsp;&nbsp; void doSomething () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String s = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l = s.length();<br />
&nbsp;&nbsp; }<br />
}<br />
有错吗?<br />
答案: 错。局部变&nbsp; 量前不能放置任何访问修饰符 (private，public，和protected)。Final可以用来修饰局部变量<br />
(final如同abstract和strictfp，都是非访问修饰符，strictfp只能修饰class和method而非variable)。<br />
3.<br />
abstract class Something {<br />
&nbsp;&nbsp; private abstract String doSomething ();<br />
}<br />
这好像没什么错吧?<br />
答案: 错。Abstract的methods不能以private修饰。Abstract的methods就是让子类implement(实现)具体细节的，怎么可以用private把abstract<br />
method封锁起来呢? (同理，abstract method前不能加final)。<br />
4.<br />
public class Something {<br />
&nbsp;&nbsp; public int addOne(final int x) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ++x;<br />
&nbsp;&nbsp; }<br />
}<br />
这个比较明显。<br />
答案: 错。Int x被修饰成final，意味着x不能在addOne method中被修改。</p>
<p>5.<br />
public class Something {<br />
&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other o = new Other();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Something().addOne(o);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public void addOne(final Other o) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.i++;<br />
&nbsp;&nbsp; }<br />
}<br />
class Other {<br />
&nbsp;&nbsp; public int I;<br />
}<br />
和上面的很相似，都是关于final的问题，这有错吗?<br />
答案: 正确。在addOne method中，参数o被修饰成final。如果在addOne method里我们修改了o的reference<br />
(比如: o = new Other();)，那么如同上例这题也是错的。但这里修改的是o的member vairable<br />
(成员变量)，而o的reference并没有改变。<br />
6.<br />
class Something {<br />
&nbsp;&nbsp;&nbsp; int I;<br />
&nbsp;&nbsp;&nbsp; public void doSomething() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("I = " + i);<br />
&nbsp;&nbsp;&nbsp; }<br />
} <br />
有什么错呢? 看不出来啊。<br />
答案: 正确。输出的是"I = 0"。Int i属於instant variable (实例变量，或叫成员变量)。Instant variable有default value。Int的default value是0。</p>
<p>7.<br />
class Something {<br />
&nbsp;&nbsp;&nbsp; final int I;<br />
&nbsp;&nbsp;&nbsp; public void doSomething() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("I = " + i);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
和上面一题只有一个地方不同，就是多了一个final。这难道就错了吗?<br />
答案: 错。Final int i是个final的instant variable (实例变量，或叫成员变量)。Final的instant variable没有default value，必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int I = 0;"。<br />
8.<br />
public class Something {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Something s = new Something();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("s.doSomething() returns " + doSomething());<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public String doSomething() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Do something &#8230;";<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
看上去很完美。<br />
答案: 错。看上去在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。<br />
9.<br />
此处，Something类的文件名叫OtherThing.java<br />
class Something {<br />
&nbsp;&nbsp;&nbsp; private static void main(String[] something_to_do) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Do something &#8230;");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
这个好像很明显。<br />
答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。<br />
10．<br />
Interface&nbsp; A{<br />
&nbsp;&nbsp; int x = 0;<br />
}<br />
class B{<br />
&nbsp;&nbsp; int x =1;<br />
}<br />
class C extends B implements A {<br />
&nbsp;&nbsp; public void pX(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(x);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new C().pX();<br />
&nbsp;&nbsp; }<br />
}<br />
答案：错误。在编译时会发生错误(错误描述不同的JVM有不同的信息，意思就是未明确的x调用，两个x都匹配（就象在同时import java.util和java.sql两个包时直接声明Date一样）。对于父类的变量,可以用super.x来明确，而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。<br />
11.<br />
interface Playable {<br />
&nbsp;&nbsp;&nbsp; void play();<br />
}<br />
interface Bounceable {<br />
&nbsp;&nbsp;&nbsp; void play();<br />
}<br />
interface Rollable extends Playable, Bounceable {<br />
&nbsp;&nbsp;&nbsp; Ball ball = new Ball("PingPang");<br />
}<br />
class Ball implements Rollable {<br />
&nbsp;&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public Ball(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public void play() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ball = new Ball("Football");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ball.getName());<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
这个错误不容易发现。<br />
答案: 错。"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");"这里显示有错。</p>
<img src ="http://www.blogjava.net/tianmaoye/aggbug/227287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianmaoye/" target="_blank">飞行鱼</a> 2008-09-05 17:39 <a href="http://www.blogjava.net/tianmaoye/articles/227287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>