Java程序员面试宝典Java代码查错.docx
Java程序员面试宝典 Java代码查错JAVA代码查错 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; 有错吗? 答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。 3.abstract class Something private abstract String doSomething ; 这好像没什么错吧? 答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract method封锁起来呢? (同理,abstract method前不能加final)。 4.public class Something public int addOne(final int x) return +x; 这个比较明显。 答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。 5.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; 和上面的很相似,都是关于final的问题,这有错吗? 答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference,(比如: o = new Other;),那么如同上例这题也是错的。但这里修改的是o的member vairable(成员变量),而o的reference并没有改变。 6.class Something int i; public void doSomething System.out.println("i = " + i); 有什么错呢? 看不出来啊。 答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。 7.class Something final int i; public void doSomething System.out.println("i = " + i); 和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗? 答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int i = 0;"。 8.public class Something public static void main(String args) Something s = new Something; System.out.println("s.doSomething returns " + doSomething); public String doSomething return "Do something ." 看上去很完美。 答案: 错。看上去在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。 9.此处,Something类的文件名叫 OtherThing.javaclass Something private static void main(String something_to_do) System.out.println("Do something ."); 这个好像很明显。 答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。 10.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; 答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。 11.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");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。 JAVA编程题 1现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset import java.util.*; public class bycomma public static String splitStringByComma(String source) if(source=null|source.trim.equals("") return null; StringTokenizer commaToker=new tringTokenizer(source,","); String result = new StringcommaToker.countTokens; int i=0; while(commaToker.hasMoreTokens) resulti = commaToker.nextToken; i+; return result; public static void main(String args) String s = splitStringByComma("5,8,7,4,3,9,1"); int ii = new ints.length; for(int i = 0;i<s.length;i+) iii =Integer.parseInt(si); Arrays.sort(ii); /asc for(int i=0;i<s.length;i+) System.out.println(iii); /desc for(int i=(s.length-1);i>=0;i-) System.out.println(iii); 2金额转换,阿拉伯数字的金额转换成中国传统的形式如:>输出。 package test.format; import java.text.NumberFormat; import java.util.HashMap; public class SimpleMoneyFormat public static final String EMPTY = "" public static final String ZERO = "零" public static final String ONE = "壹" public static final String TWO = "贰" public static final String THREE = "叁" public static final String FOUR = "肆" public static final String FIVE = "伍" public static final String SIX = "陆" public static final String SEVEN = "柒" public static final String EIGHT = "捌" public static final String NINE = "玖" public static final String TEN = "拾" public static final String HUNDRED = "佰" public static final String THOUSAND = "仟" public static final String TEN_THOUSAND = "万" public static final String HUNDRED_MILLION = "亿" public static final String YUAN = "元" public static final String JIAO = "角" public static final String FEN = "分" public static final String DOT = "." private static SimpleMoneyFormat formatter = null; private HashMap chineseNumberMap = new HashMap; private HashMap chineseMoneyPattern = new HashMap; private NumberFormat numberFormat NumberFormat.getInstance; private SimpleMoneyFormat numberFormat.setMaximumFractionDigits(4); numberFormat.setMinimumFractionDigits(2); = numberFormat.setGroupingUsed(false); chineseNumberMap.put("0", ZERO); chineseNumberMap.put("1",ONE); chineseNumberMap.put("2", TWO); chineseNumberMap.put("3", THREE); chineseNumberMap.put("4", FOUR); chineseNumberMap.put("5", FIVE); chineseNumberMap.put("6", SIX); chineseNumberMap.put("7", SEVEN); chineseNumberMap.put("8", EIGHT); chineseNumberMap.put("9", NINE); chineseNumberMap.put(DOT, DOT); chineseMoneyPattern.put("1", TEN); chineseMoneyPattern.put("2", HUNDRED); chineseMoneyPattern.put("3", THOUSAND); chineseMoneyPattern.put("4", TEN_THOUSAND); chineseMoneyPattern.put("5", TEN); chineseMoneyPattern.put("6", HUNDRED); chineseMoneyPattern.put("7", THOUSAND); chineseMoneyPattern.put("8", HUNDRED_MILLION); public static SimpleMoneyFormat getInstance if (formatter = null) formatter = new SimpleMoneyFormat; return formatter; public String format(String moneyStr) checkPrecision(moneyStr); String result; result = convertToChineseNumber(moneyStr); result = addUnitsToChineseMoneyString(result); return result; public String format(double moneyDouble) return format(numberFormat.format(moneyDouble); public String format(int moneyInt) return format(numberFormat.format(moneyInt); public String format(long moneyLong) return format(numberFormat.format(moneyLong); public String format(Number moneyNum) return format(numberFormat.format(moneyNum); private String convertToChineseNumber(String moneyStr) String result; StringBuffer cMoneyStringBuffer = new StringBuffer; for (int i = 0; i < moneyStr.length; i+) cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1); /拾佰仟万亿等都是汉字里面才有的单位,加上它们 int indexOfDot = cMoneyStringBuffer.indexOf(DOT); int moneyPatternCursor = 1; for (int i = indexOfDot - 1; i > 0; i-) cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor); moneyPatternCursor = moneyPatternCursor = 8 ? 1 : moneyPatternCursor + 1; String fractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."); cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."), cMoneyStringBuffer.length); while (cMoneyStringBuffer.indexOf("零拾") != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"), cMoneyStringBuffer.indexOf("零拾") + 2, ZERO); while (cMoneyStringBuffer.indexOf("零佰") != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"), cMoneyStringBuffer.indexOf("零佰") + 2, ZERO); while (cMoneyStringBuffer.indexOf("零仟") != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"), cMoneyStringBuffer.indexOf("零仟") + 2, ZERO); while (cMoneyStringBuffer.indexOf("零万") != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"), cMoneyStringBuffer.indexOf("零万") + 2, TEN_THOUSAND); while (cMoneyStringBuffer.indexOf("零亿") != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"), cMoneyStringBuffer.indexOf("零亿") + 2, HUNDRED_MILLION); while (cMoneyStringBuffer.indexOf("零零") != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"), cMoneyStringBuffer.indexOf("零零") + 2, ZERO); if (cMoneyStringBuffer.lastIndexOf(ZERO) = cMoneyStringBuffer.length - 1) cMoneyStringBuffer.delete(cMoneyStringBuffer.length - 1, cMoneyStringBuffer.length); cMoneyStringBuffer.append(fractionPart); result = cMoneyStringBuffer.toString; return result; private String addUnitsToChineseMoneyString(String moneyStr) String result; StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr); int indexOfDot = cMoneyStringBuffer.indexOf(DOT); cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN); cMoneyStringBuffer.insert(cMoneyStringBuffer.length - 1, JIAO); cMoneyStringBuffer.insert(cMoneyStringBuffer.length, FEN); if (cMoneyStringBuffer.indexOf("零角零分") != -1)/没有零头,加整 cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零角零分"), cMoneyStringBuffer.length, "整"); else if (cMoneyStringBuffer.indexOf("零分") != -1)/没有零分,加整 cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零分"), cMoneyStringBuffer.length, "整"); else if(cMoneyStringBuffer.indexOf("零角")!=-1) cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("零角"),cMoneyStringBuffer.indexOf("零角")+2); tmpBuffer.append("整"); result = cMoneyStringBuffer.toString; return result; private void checkPrecision(String moneyStr) int fractionDigits = moneyStr.length - moneyStr.indexOf(DOT) - 1; if (fractionDigits > 2) throw new RuntimeException("金额" + moneyStr + "的小数位多于两位。"); /精度不能比分低 public static void main(String args) System.out.println(getInstance.format(new Double(10010001.01); 3、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 答:父类: package test; public class FatherClass public FatherClass System.out.println("FatherClass Create"); 子类: package test; import test.FatherClass; public class ChildClass extends FatherClass public ChildClass System.out.println("ChildClass Create"); public static void main(String args) FatherClass fc = new FatherClass; ChildClass cc = new ChildClass; 输出结果: C:>java test.ChildClass FatherClass FatherClass Create ChildClass Create 4、内部类的实现方式? 答:示例代码如下: package test; public class OuterClass private class InterClass public InterClass System.out.println("InterClass Create"); public OuterClass InterClass ic = new InterClass; System.out.println("OuterClass Create"); public static void main(String args) OuterClass oc = new OuterClass; Create 输出结果: C:>java test/OuterClass InterClass Create OuterClass Create 再一个例题: public class OuterClass private double d1 = 1.0; /insert code here You need to insert an inner class declaration at line 3. Which two inner class declarations are valid?(Choose two.) A. class InnerOne public static double methoda return d1; B. public class InnerOne static double methoda return d1; C. private class InnerOne double methoda return d1; D. static class InnerOne protected double methoda return d1; E. abstract class InnerOne public abstract double methoda; 说明如下: 一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。 故 A、B 错 二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1 出错。故 D 错 三.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确 四.答案为C、E 5、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示? 答:Server端程序: package test; import .*; import java.io.*; public class Server private ServerSocket ss; private Socket socket; private BufferedReader in; private PrintWriter out; public Server try ss=new ServerSocket(10000); while(true) socket = ss.accept; String RemoteIP = socket.getInetAddress.getHostAddress; String RemotePort = ":"+socket.getLocalPort; System.out.println("A in!IP:"+RemoteIP+RemotePort); in = new BufferedReader(new client come InputStreamReader(socket.getInputStream); String line = in.readLine; System.out.println("Cleint send is :" + line); out = new PrintWriter(socket.getOutputStream,true); out.println("Your Message Received!"); out.close; in.close; socket.close; catch (IOException e) out.println("wrong"); public static void main(String args) new Server; Client端程序: package test; import java.io.*; import .*; public class Client Socket socket; BufferedReader in; PrintWriter out; public Client try System.out.println("Try to Connect to 127.0.0.1:10000"); socket = new Socket("127.0.0.1",10000); System.out.println("The Server Connected!"); System.out.println("Please enter some Character:"); BufferedReader line = new BufferedReader(new InputStreamReader(System.in); out = new PrintWriter(socket.getOutputStream,true); Out 3、 接口和内部类、抽象类的特征答:接口:在一个类里,只有申明没有实现。内部类:是在一个类的内部定义的一个类;抽象类:是以abstract 定义的,里面至少有一个抽象方法。 4、 文件读写的基本类 答:File Reader 类和FileWriter类分别继承自Reader类和Writer类。FileReader类用于读取文件,File Writer类用于将数据写入文件,这两各类在使用前,都必须要调用其构造方法创建相应的对象,然后调用相应的read或 write方法。 6、 线程的基本概念、线程的本状态以及状态之间的关系 ?新建 (Born) : 新建的线程处于新建状态?就绪 (Ready) : 在创建线程后,它将处于就绪状态,等待 start 方法被调用?运行 (Running) : 线程在开始执行时进入运行状态?睡眠 (Sleeping) : 线程的执行可通过使用 sleep 方法来暂时中止。在睡眠后,线程将进入就绪状态?等待 (Waiting) : 如果调用了 wait 方法,线程将处于等待状态。用于在两个或多个线程并发运行时。?挂起 (Suspended) : 在临时停止或中断线程的执行时,线程就处于挂起状态。?恢复 (Resume) : 在挂起的线程被恢复执行时,可以说它已被恢复。?阻塞 (Blocked) 在线程等待一个事件时,就称其处于阻塞状态。?死亡 (Dead) 在 run 方法已完成执行或其 stop 方法被调用之后,线程就处于死亡状态。 5、 串行化的注意事项以及如何实现串行化答:如果有循环引用是不可以串行化的。对象输出流的WriteObject方法和 对象输入流的ReadObect 方法 7、 线程的同步、如何实现线程的同步答:当两个或多个线程同时访问同一个变量,并且以个线程需要修改这个变量。就要用到线程同步。在Java 中,同步是通过 synchronized 关键字来定义的。 诺是想同步化某程序段,可以使用 synchronized(object)方法,其中内的程序语句被同步化。 9、 socket通信TCP传输控制协议,具有极高的可靠性,保证数据包按照顺序准确到达,但其也有着很高的额外负担。UDP使用者数据元协议,并不能保证数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。大多数我们会使用TCP,偶尔才会动用UDP,如声音讯号,即使少量遗失,也无 关紧要。 10、 JAVA的事件委托机制和垃圾回收机制 java 事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。垃圾回收机制 垃圾收集是将分配给对象但不在使用的内存回收或释放的过程。如果一个对象没有指向它的引用或