代碼與編程題
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();
}
?}
??}
}