抽象類無法實例化,無法創建對象。現實生活中也有抽象類的類子,比如說人類是一個抽象類,無法創建一個叫人類的對象,人繼承人類來創建對象。況且抽象類中的抽象方法只有聲明,沒有主體,如果實例化了,又如何去實現調用呢?
sleep和wait的區別有: 1,這兩個方法來自不同的類分別是Thread和Object 2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得敏感詞線程可以使用同步控制塊或者方法。 3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在 任何地方使用 synchronized(x){ x.notify() //或者wait() } 4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
共同點 :
1. 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,並返回。
2. wait()和sleep()都可以通過interrupt()方法 打斷線程的暫停狀態 ,從而使線程立刻拋出InterruptedException。
如果線程A希望立即結束線程B,則可以對線程B對應的Thread實例調用interrupt方法。如果此刻線程B正在wait/sleep/join,則線程B會立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結束線程。
需要注意的是,InterruptedException是線程自己從內部拋出的,並不是interrupt()方法拋出的。對某一線程調用 interrupt()時,如果該線程正在執行普通的代碼,那么該線程根本就不會拋出InterruptedException。但是,一旦該線程進入到 wait()/sleep()/join()后,就會立刻拋出InterruptedException 。
不同點 :
1.每個對象都有一個鎖來控制同步訪問。Synchronized關鍵字可以和對象的鎖交互,來實現線程的同步。
sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
2.wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
3.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
1
2
3
4
5
6
7
8
9
10
11
|
public
class
Increment
{
public
static
void
main(String args[])
{
int
a;
a =
6
;
System.out.print(a);
System.out.print(a++);
System.out.print(a);
}
}
|
正確答案: B 你的答案: B (正確)
666
667
677
676
4.下面程序的運行結果是
String str1 = "hello"; String str2 = "he" + new String("llo"); System.err.println(str1 == str2);
正確答案: B 你的答案: 空 (錯誤)
true
false
exception
無輸出
String str1 = "hello";這里的str1指的是方法區的字符串常量池中的“hello”,編譯時期就知道的; String str2 = "he" + new String("llo");這里的str2必須在運行時才知道str2是什么,所以它是指向的是堆里定義的字符串“hello”,所以這兩個引用是不一樣的。 如果用str1.equal(str2),那么返回的是True;因為兩個字符串的內容一樣。
5.
1
2
3
4
5
6
7
8
9
10
11
|
abstract
class
Animal{
abstract
void
say();
}
public
class
Cat
extends
Animal{
public
Cat(){
System.out.printf(
"I am a cat"
);
}
public
static
void
main(String[] args) {
Cat cat=
new
Cat();
}
}
|
正確答案: B 你的答案: B (正確)
I am a cat
Animal能編譯,Cat不能編譯
Animal不能編譯,Cat能編譯
編譯能通過,但是沒有輸出結果
包含抽象方法的類稱為抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:
1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認為public。
2)抽象類不能用來創建對象;
3)如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。
在其他方面,抽象類和普通的類並沒有區別。
5.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public
static
void
main(String[]args)
throws
Exception {
final
Object obj =
new
Object();
Thread t1 =
new
Thread() {
public
void
run() {
synchronized
(obj) {
try
{
obj.wait();
System.out.println(
"Thread 1 wake up."
);
}
catch
(InterruptedException e) {
}
}
}
};
t1.start();
Thread.sleep(
1000
);
//We assume thread 1 must start up within 1 sec.
Thread t2 =
new
Thread() {
public
void
run() {
synchronized
(obj) {
obj.notifyAll();
System.out.println(
"Thread 2 sent notify."
);
}
}
};
t2.start();
}
|
正確答案: B 你的答案: C (錯誤)
Thread 1 wake up Thread 2 sent notify.
Thread 2 sent notify. Thread 1 wake up
A、B皆有可能
程序無輸出卡死
正確答案: A B C D 你的答案: A B C D (正確)
protected abstract void f1();
public final void f1() {}
static final void fq(){}
private void f1() {}
1.接口和抽象類都可以作為聲明使用,但不能實例化。只能用來聲明。
1
2
3
4
|
Integer i01 =
59
;
int
i02 =
59
;
Integer i03 =Integer.valueOf(
59
);
Integer i04 =
new
Integer(
59
)。
|
正確答案: C 你的答案: A (錯誤)
System.out.println(i01== i02);
System.out.println(i01== i03);
System.out.println(i03== i04);
System.out.println(i02== i04);
使用 Java 技術開發 WEB 應用程序 , 深入了解 Servlet 的機制對應用的開發將有重要的推動作用 . 而想深入了解 Servlet 的機制就不得不了解 javax.servlet 包 .
javax.servlet 包中包含了 7 個接口 ,3 個類和 2 個異常類 , 它們分別是 :
接口 :RequestDispatcher,Servlet,ServletConfig,ServletContext,ServletRequest,ServletResponse 和 SingleThreadModel
類 :GenericServlet,ServletInputStream 和 ServletOutputStream
異常類 :ServletException 和 UnavailableException
Servlet 的生命周期
在 Servlet 的接口中定義了一個 Servlet 的生命周期方法 , 分別是 Init,Service 和 Destroy
演示了 Servlet 生命周期方法的簡單 Servlet:
import javax.servlet.*;
import java.io.IOException;
public class PrimitiveServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("service");
}
public void destroy() {
System.out.println("destroy");
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
在 Servlet 中如何獲取 ServletConfig 對象 ?
在 Servlet 的 Init 方法中 ,Servlet Container 將會傳入一個 ServletConfig 對象 , 開發人員可以通過這個對象獲取在 web.xml 文件中定義的Servlet 初始化參數 .
下面是一個獲取 Servlet 初始參數的示例 :
import javax.servlet.*;
import java.util.Enumeration;
import java.io.IOException;
public class ConfigDemoServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
Enumeration parameters = config.getInitParameterNames();
while (parameters.hasMoreElements()) {
String parameter = (String) parameters.nextElement();
System.out.println("Parameter name : " + parameter);
System.out.println("Parameter value : " +
config.getInitParameter(parameter));
}
}
public void destroy() {
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
如何獲取 ServletContext 對象 ?
可以通過 ServletConfig 對象的 getServletContext 方法獲取 ServletContext 對象
import javax.servlet.*;
import java.util.Enumeration;
import java.io.IOException;
public class ContextDemoServlet implements Servlet {
ServletConfig servletConfig;
public void init(ServletConfig config) throws ServletException {
servletConfig = config;
}
public void destroy() {
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
ServletContext servletContext = servletConfig.getServletContext();
Enumeration attributes = servletContext.getAttributeNames();
while (attributes.hasMoreElements()) {
String attribute = (String) attributes.nextElement();
System.out.println("Attribute name : " + attribute);
System.out.println("Attribute value : " +
servletContext.getAttribute(attribute));
}
System.out.println("Major version : " +
servletContext.getMajorVersion());
System.out.println("Minor version : " +
servletContext.getMinorVersion());
System.out.println("Server info : " + servletContext.getServerInfo());
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
如何在 Servlet 之間共享信息 ?
我們可以通過 ServletContext 來維護在不同 Servlet 之間共享的信息 .
如何解決 Servlet 的多 Thread 問題 ?
如果 Servlet 需要讀寫外部資源 , 我們需要考慮 Thread 的問題 , 我們可以使用聲明性接口 SingleThreadModel 來避免多 Thread 之間的資源沖突問題 . 但是需要注意的是 , 如果 Servlet 僅僅只是讀外部資源的話 , 我們通常不應該實現這個接口 . 如果實現這個接口 ,Servlet 在同一時刻只能服務一個用戶請求 , 后至的用戶請求必須在隊列中等待
10.
正確答案: B C F 你的答案: E (錯誤)
char a[][];
String a[];
String[] a;
Object a[50];
String a[50];
Object a[];
-
Java語言中,中文字符所占的字節數取決於字符的編碼方式,一般情況下,采用ISO8859-1編碼方式時,一個中文字符與一個英文字符一樣只占1個字節;采用GB2312或GBK編碼方式時,一個中文字符占2個字節;而采用UTF-8編碼方式時,一個中文字符會占3個字節。
在C++中
在C++中,char是基礎數據類型,8位,1個字節。byte不是基礎數據類型,一般是typedef unsigned char byte;這樣子的,也就是說,byte其實是unsigned char類型,那么也是8位,1個字節。不同的是,char可以表示的范圍是-128-127,而byte可以表示的范圍是0-255。
在Java中
在java中,char和byte都是基礎數據類型,其中的byte和C++中的char類型是一樣的,8位,1個字節,-128-127。但是,char類型,是16位,2個字節, '\u0000'-'\uFFFF'。
為什么java里的char是2個字節?
因為java內部都是用unicode的,所以java其實是支持中文變量名的,比如string 世界 = "我的世界";這樣的語句是可以通過的。
綜上,java中采用GB2312或GBK編碼方式時,一個中文字符占2個字節,而char是2個字節,所以是對的發表於 2015-10-07 14:54:11回復(0) -
A.在Java中,char類型占兩個字節,一個漢字也占兩個字節,所以是正確的。