抽象類不能實例化對象


抽象類無法實例化,無法創建對象。現實生活中也有抽象類的類子,比如說人類是一個抽象類,無法創建一個叫人類的對象,人繼承人類來創建對象。況且抽象類中的抽象方法只有聲明,沒有主體,如果實例化了,又如何去實現調用呢?

 

sleep和wait的區別有:
  1,這兩個方法來自不同的類分別是Thread和Object
  2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得敏感詞線程可以使用同步控制塊或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }
   4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常


Java中的多線程是一種搶占式的機制,而不是分時機制。搶占式的機制是有多個線程處於可運行狀態,但是只有一個線程在運行。 
共同點 : 
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不需要捕獲異常 
4.sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。
5.wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池准備獲得對象鎖進入運行狀態。
 
3.a++可以理解為當訪問a之后再對a進行加一操作
以下程序的運行結果是()
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.

假設如下代碼中,若t1線程在t2線程啟動之前已經完成啟動。代碼的輸出是()
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皆有可能
程序無輸出卡死

選擇B
執行obj.wait();時已釋放了鎖,所以t2可以再次獲得鎖,然后發消息通知t1執行,但這時t2還沒有釋放鎖,所以肯定是執行t2,然后釋放鎖,之后t1才有機會執行。
notify()就是對對象鎖的喚醒操作。但有一點需要注意的是notify()調用后,並不是馬上就釋放對象鎖的,而是在相應的synchronized(){}語句塊執行結束,自動釋放鎖后,JVM會在wait()對象鎖的線程中隨機選取一線程,賦予其對象鎖,喚醒線程,繼續執行。這樣就提供了在線程間同步、喚醒的操作。
 
下列選項中是正確的方法聲明的是?()

正確答案: A B C D   你的答案: A B C D (正確)

protected abstract void f1();
public final void f1() {}
static final void fq(){}
private void f1() {}

1.接口和抽象類都可以作為聲明使用,但不能實例化。只能用來聲明。


在jdk1.5的環境下,有如下4條語句:
1
2
3
4
Integer i01 =  59 ;
int i02 =  59 ;
Integer i03 =Integer.valueOf( 59 );
Integer i04 =  new Integer( 59 )。
以下輸出結果為false的是:

正確答案: C   你的答案: A (錯誤)

System.out.println(i01== i02);
System.out.println(i01== i03);
System.out.println(i03== i04);
System.out.println(i02== i04);
JVM中一個字節以下的整型數據會在JVM啟動的時候加載進內存,除非用new Integer()顯式的創建對象,否則都是同一個對象
所有只有i04是一個新對象,其他都是同一個對象。所有A,B選項為true
C選項i03和i04是兩個不同的對象,返回false
D選項i02是基本數據類型,比較的時候比較的是數值,返回true
 
 
10.javax是Sun公司提供的一個擴展包,算是對原 JAVA 包的一些優化處理,現在已經有很多都是基於JAVAX的程序開發而不是java包。
11.

使用 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.

Which statement declares a variable a which is suitable for referring to an array of 50 string objects?

正確答案: B C F   你的答案: E (錯誤)

char a[][];
String a[];
String[] a;
Object a[50];
String a[50];
Object a[];
在java 中,聲明一個數組時,不能直接限定數組長度,只有在創建實例化對象時,才能對給定數組長度.。
如下,1,2,3可以通過編譯,4,5不行。而String是Object的子類,所以上述BCF均可定義一個存放50個String類型對象的數組。
1. String a[]=new String[50];
2. String b[];
3. char c[];
4. String d[50];
5. char e[50];

 

    • 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類型占兩個字節,一個漢字也占兩個字節,所以是正確的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM