代碼與編程題
135、寫一個Singleton出來
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有幾種種形式:
第一種形式:?定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public?class?Singleton?{
private?Singleton(){}
????//在自己內部定義自己一個實例,是不是很奇怪?
????//注意這是private?只供內部調用
????private?static?Singleton?instance?=?new?Singleton();
????//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
????public?static?Singleton?getInstance()?{
????return?instance;?
????}?
????}?
????第二種形式:?
public?class?Singleton?{?
private?static?Singleton?instance?=?null;
public?static?synchronized?Singleton?getInstance()?{
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次 ?
//使用時生成實例,提高了效率!
if?(instance==null)
instance=new?Singleton();
return?instance;? }?
}?
其他形式:
定義一個類,它的構造函數為private的,所有方法為static的。
一般認為第一種形式要更加安全些?
136、繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什么?
答:父類:
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 Create
FatherClass Create
ChildClass Create
137、內部類的實現方式?
答:示例代碼如下:
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();
?}
}
輸出結果:
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
138、Java 的通信編程,編程題(或問答),用JAVA SOCKET編程,讀服務器幾個字符,再寫入本地顯示?
答:Server端程序:
package test;
import java.net.*;
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 client come in!IP:"+RemoteIP+RemotePort);
????in = new BufferedReader(new
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 java.net.*;
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.println(line.readLine());
???in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
???System.out.println(in.readLine());
???out.close();
???in.close();
???socket.close();
??}catch(IOException e)
??{
???out.println("Wrong");
??}
?}
?public static void main(String[] args)
?{
??new Client();
?}
};
139、用JAVA實現一種排序,JAVA類實現序列化的方法(二種)?如在COLLECTION框架中,實現比較要實現什么樣的接口?
答:用插入法進行排序代碼如下
package test;
import java.util.*;
class? InsertSort
{
?ArrayList al;
?public InsertSort(int num,int mod)
?{
??al = new ArrayList(num);
??Random rand = new Random();
??System.out.println("The ArrayList Sort Before:");
??for (int i=0;i<num ;i++ )
??{
???al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
???System.out.println("al["+i+"]="+al.get(i));
??}
?}
?public void SortIt()
?{
??Integer tempInt;
??int MaxSize=1;
??for(int i=1;i<al.size();i++)
??{
?????? tempInt = (Integer)al.remove(i);
????if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue())
????{
?????al.add(MaxSize,tempInt);
?????MaxSize++;
?????System.out.println(al.toString());
????} else {
?????for (int j=0;j<MaxSize ;j++ )
?????{
??????if
(((Integer)al.get(j)).intValue()>=tempInt.intValue())
??????{
???????al.add(j,tempInt);
???????MaxSize++;
???????System.out.println(al.toString());
???????break;
??????}
?????}
????}
??}
??System.out.println("The ArrayList Sort After:");
??for(int i=0;i<al.size();i++)
??{
???System.out.println("al["+i+"]="+al.get(i));
??}
?}
?public static void main(String[] args)
?{
??InsertSort is = new InsertSort(10,100);
??is.SortIt();
?}
}
140、編程:編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。
答:代碼如下:
package test;
class? SplitString
{
?String SplitStr;
?int SplitByte;
?public SplitString(String str,int bytes)
?{
??SplitStr=str;
??SplitByte=bytes;
??System.out.println("The String is:'"+SplitStr+"';SplitBytes="+SplitByte);
?}
?public void SplitIt()
?{
??int loopCount;
??
loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/Split
Byte+1);
??System.out.println("Will Split into "+loopCount);
??for (int i=1;i<=loopCount ;i++ )
??{
???if (i==loopCount){
????
System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
???} else {
????
System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
???}
??}
?}
?public static void main(String[] args)
?{
??SplitString ss = new SplitString("test中dd文dsaf中男大3443n中國43中國人
0ewldfls=103",4);
??ss.SplitIt();
?}
}
141、JAVA多線程編程。用JAVA寫一個多線程程序,如寫四個線程,二個加1,二個對一個變量減一,輸出。
希望大家補上,謝謝
142、可能會讓你寫一段Jdbc連Oracle的程序,并實現數據查詢.
答:程序如下:
package hello.ant;
import java.sql.*;
public class? jdbc
{
?String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
?String theUser="admin";
?String thePw="manager";
?Connection c=null;
?Statement conn;
?ResultSet rs=null;
?public jdbc()
?{
??try{
??? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
????????? c = DriverManager.getConnection(dbUrl,theUser,thePw);
??? conn=c.createStatement();
??}catch(Exception e){
???e.printStackTrace();
??}
?}
?public boolean executeUpdate(String sql)
?{
???try
???{
?????conn.executeUpdate(sql);
?????return true;
???}
???catch (SQLException e)
???{
?????e.printStackTrace();
?????return false;
???}
?}
?public ResultSet executeQuery(String sql)
?{
???rs=null;
???try
???{
?????rs=conn.executeQuery(sql);
???}
???catch (SQLException e)
???{
?????e.printStackTrace();
???}
???return rs;
?}
?public void close()
?{
???try
???{
?????conn.close();
?????c.close();
???}
???catch (Exception e)
???{
?????e.printStackTrace();
???}
?}
?public static void main(String[] args)
?{
??ResultSet rs;
??jdbc conn = new jdbc();
??rs=conn.executeQuery("select * from test");
??try{
??while (rs.next())
??{
???System.out.println(rs.getString("id"));
???System.out.println(rs.getString("name"));
??}
??}catch(Exception e)
??{
???e.printStackTrace();
??}
?}
}
143、ORACLE大數據量下的分頁解決方法。一般用截取ID方法,還有是三層嵌套方法。
答:一種分頁方法
<%
? int i=1;
? int numPages=14;
? String pages = request.getParameter("page") ;
? int currentPage = 1;
? currentPage=(pages==null)?(1):{Integer.parseInt(pages)}
? sql = "select count(*) from tables";
? ResultSet rs = DBLink.executeQuery(sql) ;
? while(rs.next()) i = rs.getInt(1) ;
? int intPageCount=1;
? intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
? int nextPage ;
? int upPage;
? nextPage = currentPage+1;
? if (nextPage>=intPageCount) nextPage=intPageCount;
? upPage = currentPage-1;
? if (upPage<=1) upPage=1;
? rs.close();
? sql="select * from tables";
? rs=DBLink.executeQuery(sql);
? i=0;
? while((i<numPages*(currentPage-1))&&rs.next()){i++;}
%>
//輸出內容
//輸出翻頁連接
合計:<%=currentPage%>/<%=intPageCount%><a href="List.jsp?page=1">第一頁</a><a
href="List.jsp?page=<%=upPage%>">上一頁</a>
<%
? for(int j=1;j<=intPageCount;j++){
? if(currentPage!=j){
%>
? <a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
<%
? }else{
? out.println(j);
? }
? }
%>
<a href="List.jsp?page=<%=nextPage%>">下一頁</a><a href="List.jsp?page=<%=intPageCount%>">最后頁
</a>
144、用jdom解析xml文件時如何解決中文問題?如何解析?
答:看如下代碼,用編碼方式加以解決
package test;
import java.io.*;
public class DOMTest
{
?private String inFile = "c:\\people.xml";
?private String outFile = "c:\\people.xml";?
?public static void main(String args[])
?{
??? ?new DOMTest();
??? }
?public DOMTest()
?{
??try
???? {?
???? ?javax.xml.parsers.DocumentBuilder builder =
???? ??
javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
???? ?org.w3c.dom.Document doc = builder.newDocument();
???? ?org.w3c.dom.Element root = doc.createElement("老師");
???? ?org.w3c.dom.Element wang = doc.createElement("王");
???org.w3c.dom.Element liu = doc.createElement("劉");
???? ?wang.appendChild(doc.createTextNode("我是王老師"));
???? ?root.appendChild(wang);
???? ?doc.appendChild(root);
???? ?javax.xml.transform.Transformer transformer =
???? ??javax.xml.transform.TransformerFactory.newInstance().newTransformer();
???? ?transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
???? ?transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");??
? ?
???? ?transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
???? ???????new
javax.xml.transform.stream.StreamResult(outFile));
???? }
???? catch (Exception e)
???? {
???? ?System.out.println (e.getMessage());
???? }
??? }
}
145、編程用JAVA解析XML的方式.
答:用SAX方式解析XML,XML文件如下:
<?xml version="1.0" encoding="gb2312"?>
<person>
? <name>王小明</name>
? <college>信息學院</college>??
? <telephone>6258113</telephone>
? <notes>男,1955年生,博士,95年調入海南大學</notes>
?</person>
?事件回調類SAXHandler.java
?import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
? {
? private Hashtable table = new Hashtable();
? private String currentElement = null;
? private String currentValue = null;
? public void setTable(Hashtable table)
??? {
??? this.table = table;
??? }
? public Hashtable getTable()
??? {
??? return table;
??? }
? public void startElement(String tag, AttributeList attrs)
? throws SAXException
??? {
??? currentElement = tag;
??? }
? public void characters(char[] ch, int start, int length)
? throws SAXException
??? {
??? currentValue = new String(ch, start, length);
??? }
? public void endElement(String name) throws SAXException
??? {
??? if (currentElement.equals(name))
????? table.put(currentElement, currentValue);
??? }
? }
JSP內容顯示源碼,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML文件people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage="ErrPage.jsp"
contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %>
<%@ page import="SAXHandler" %>
<%
File file = new File("c:\\people.xml");
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>");
out.println("<TR><TD>姓名</TD>" + "<TD>" +
? (String)hashTable.get(new String("name")) + "</TD></TR>");
out.println("<TR><TD>學院</TD>" + "<TD>" +
? (String)hashTable.get(new String("college"))+"</TD></TR>");
out.println("<TR><TD>電話</TD>" + "<TD>" +
? (String)hashTable.get(new String("telephone")) + "</TD></TR>");
out.println("<TR><TD>備注</TD>" + "<TD>" +
? (String)hashTable.get(new String("notes")) + "</TD></TR>");
out.println("</TABLE>");
%>
</BODY>
</HTML>
146、EJB的基本架構
答:一個EJB包括三個部分:
? Remote Interface 接口的代碼
? package Beans;
? import javax.ejb.EJBObject;
? import java.rmi.RemoteException;
? public interface Add extends EJBObject
? {
?? //some method declare
? }
? Home Interface 接口的代碼
? package Beans;
? import java.rmi.RemoteException;
? import jaax.ejb.CreateException;
? import javax.ejb.EJBHome;
? public interface AddHome extends EJBHome
? {
??? //some method declare
? }
? EJB類的代碼
? package Beans;
? import java.rmi.RemoteException;
? import javax.ejb.SessionBean;
? import javx.ejb.SessionContext;
? public class AddBean Implements SessionBean
? {
??? //some method declare
? }?
147、如何校驗數字型?
var re=/^\d{1,8}$|\.\d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null)
{
?? sign=-4;
?? break;
}
else{
?? document.form1.all(i).value=parseFloat(str);
}
148、將一個鍵盤輸入的數字轉化成中文輸出
(例如:輸入:1234567?????輸出:一百二拾三萬四千五百六拾七)
用java語言實現,,請編一段程序實現!
?public?class?Reader?{
??private?String?strNum;
??private?String?strNumChFormat;
??private?String?strNumTemp;
??private?int?intNumLen;
??private?String?strBegin;
??public?Reader(String?strNum)?{
????this.strNum?=?strNum;
??}
??public?boolean?check(String?strNum)?{
????boolean?valid?=?false;
????
????if?(strNum.substring(0,1).equals("0")){
?????this.strNum?=?strNum.substring(1);
????}
????try?{
??????new?Double(strNum);
??????valid?=?true;
????}
????catch?(NumberFormatException?ex)?{
??????System.out.println("Bad?number?format!");
????}
????return?valid;
??}
??public?void?init()?{
????strNumChFormat?=?"";
????intNumLen?=?strNum.length();
????strNumTemp?=?strNum;
????strNumTemp?=?strNumTemp.replace('1',?'一');
????strNumTemp?=?strNumTemp.replace('2',?'二');
????strNumTemp?=?strNumTemp.replace('3',?'三');
????strNumTemp?=?strNumTemp.replace('4',?'四');
????strNumTemp?=?strNumTemp.replace('5',?'五');
????strNumTemp?=?strNumTemp.replace('6',?'六');
????strNumTemp?=?strNumTemp.replace('7',?'七');
????strNumTemp?=?strNumTemp.replace('8',?'八');
????strNumTemp?=?strNumTemp.replace('9',?'九');
????strNumTemp?=?strNumTemp.replace('0',?'零');
????strNumTemp?=?strNumTemp.replace('.',?'點');
????strBegin?=?strNumTemp.substring(0,?1);
??}
??public?String?readNum()?{
????if?(check(strNum))?{
??????init();
??????try?{
????????for?(int?i?=?1,?j?=?1,?k?=?1;?i?<?intNumLen;?i++)?{
? ?????????if?(strNumTemp.charAt (intNumLen?-?1)?==?'零'?&&?i?= =?1)?{
????????????strNumChFormat?=?"位";
??????????}
? ?????????else?if?(strNumTemp.charAt (intNumLen?-?i)?==?'零'?&&?j?= =?1)?{
????????? ???strNumChFormat?=?"位"?+? strNumChFormat;
??????????}
? ?????????else?if?(strNumTemp.charAt (intNumLen?-?i)?==?'點')?{
????????????j?=?1;
????????????k?=?1;
????????????strNumChFormat?=?strNumTemp.charAt(intNumLen?-?i)?+?strNumChFormat;
????????????continue;
??????????}
??????????else?{
????????????strNumChFormat?=?strNumTemp.charAt(intNumLen?-?i)?+?strNumChFormat;
??????????}
? ?????????if?(strNumTemp.charAt (intNumLen?-?i?-?1)?!=?'位'?&&
? ????????????? strNumTemp.charAt(intNumLen?-?i?-?1)?!=?'零 ')?{
????????????if?(j?==?1?&&?i?<?intNumLen)?{
? ????????????? strNumChFormat?=?'拾'?+?strNumChFormat;
????????????}
????????????else?if?(j?==?2?&&?i?<?intNumLen)?{
? ????????????? strNumChFormat?=?'百'?+?strNumChFormat;
????????????}
????????????else?if?(j?==?3?&&?i?<?intNumLen)?{
? ????????????? strNumChFormat?=?'千'?+?strNumChFormat;
????????????}
??????????}
??????????if?(j?==?4?&&?i?<?intNumLen)?{
????????????j?=?0;
??????????}
??????????if?(k?==?4?&&?i?<?intNumLen)?{
? ???????????strNumChFormat? =?'萬'?+?strNumChFormat;
??????????}
??????????else?if?(k?==?8?&&?i?<?intNumLen)?{
????????????k?=?0;
? ???????????strNumChFormat? =?'億'?+?strNumChFormat;
??????????}
??????????j++;
??????????k++;
????????}
????????while?(strNumChFormat.indexOf("位")?!=?-1)?{
? ?????????strNumChFormat? =?strNumChFormat.replaceAll("位",?"?");
????????}
????????if?(strNumChFormat.substring(0,?2)?==?"一拾")?{
??????????strNumChFormat?=?strNumChFormat.substring(1,?strNumChFormat.length());
????????}
????????if?(strNumChFormat.indexOf("點")?>=?0)?{
??????????String?rebegin?=?strNumChFormat.substring(0,
??????????????strNumChFormat.indexOf("點"));
? ?????????String?relast? =?strNumChFormat.substring(strNumChFormat.indexOf("點"),
??????????????strNumChFormat.length());
??????????for?(int?i?=?1;?i?<=?relast.length();?i++)?{
????????????relast?=?relast.replaceAll("拾",?"");
????????????relast?=?relast.replaceAll("百",?"");
????????????relast?=?relast.replaceAll("千",?"");
????????????relast?=?relast.replaceAll("萬",?"");
????????????relast?=?relast.replaceAll("億",?"");
??????????}
??????????strNumChFormat?=?rebegin?+?relast;
????????}
??????}
??????catch?(ArrayIndexOutOfBoundsException?ex)?{
????????ex.printStackTrace();
??????}
??????catch?(Exception?ex)?{
????????ex.printStackTrace();
??????}
??????int?off?=?strNumChFormat.indexOf("點");
??????strNumChFormat?=?strBegin?+?strNumChFormat.substring(0);
????}
????else?{
??????strNumChFormat?=?"";
????}
????return?strNumChFormat;
??}
??public?static?void?main(String?args[])?{
????try?{
??????String?number?=?args[0].toString();
??????System.out.println("The?number?is:?"?+?number);
??????Reader?reader?=?new?Reader(number);
??????System.out.println("Output?String:?"?+?reader.readNum());
????}
????catch?(Exception?ex)?{
??????System.out.println("Please?input?like?that:?javac?Reader?<number>");
????}
??}
}
149、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.java
class?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都匹配(就象在同時import?java.util和java.sql兩個包時直接聲明Date一樣)。對于父類的變量,可以用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");"這里顯示有錯。
28、設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。
以下程序使用內部類實現線程,對j增減的時候沒有考慮順序問題。
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();
}
?}
??}
}