日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA常见面试题及解答

發(fā)布時(shí)間:2024/3/13 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA常见面试题及解答 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JAVA常見面試題及解答(精華)??

1transientvolatilejava關(guān)鍵字嗎?(瞬聯(lián))

如果用transient聲明一個(gè)實(shí)例變量,當(dāng)對象存儲時(shí),它的值不需要維持。例如:

class T

{???

??????transient int a;??//不需要維持

??????int b;??//需要維持

}??

這里,如果T類的一個(gè)對象寫入一個(gè)持久的存儲區(qū)域,a的內(nèi)容不被保存,但b的將被保存。

volatile修飾符告訴編譯器被volatile修飾的變量可以被程序的其他部分改變。在多線程程序中,有時(shí)兩個(gè)或更多的線程共享一個(gè)相同的實(shí)例變量。考慮效率問題,每個(gè)線程可以自己保存該共享變量的私有拷貝。實(shí)際的變量副本在不同的時(shí)候更新,如當(dāng)進(jìn)入synchronized方法時(shí)。?strictfp修飾類或方法,可以確保浮點(diǎn)運(yùn)算(以及所有切斷)正如早期的Java版本那樣準(zhǔn)確。切斷只影響某些操作的指數(shù)。當(dāng)一個(gè)類被strictfp修飾,所有的方法自動被strictfp修飾。

strictfp的意思是FP-strict,也就是說精確浮點(diǎn)的意思。在Java虛擬機(jī)進(jìn)行浮點(diǎn)運(yùn)算時(shí),如果沒有指定strictfp關(guān)鍵字時(shí),Java的編譯器以及運(yùn)行環(huán)境在對浮點(diǎn)運(yùn)算的表達(dá)式是采取一種近似于我行我素的行為來完成這些操作,以致于得到的結(jié)果往往無法令你滿意。而一旦使用了strictfp來聲明一個(gè)類、接口或者方法時(shí),那么所聲明的范圍內(nèi)Java的編譯器以及運(yùn)行環(huán)境會完全依照浮點(diǎn)規(guī)范IEEE-754來執(zhí)行。因此如果你想讓你的浮點(diǎn)運(yùn)算更加精確,而且不會因?yàn)椴煌挠布脚_所執(zhí)行的結(jié)果不一致的話,那就請用關(guān)鍵字strictfp

你可以將一個(gè)類、接口以及方法聲明為strictfp,但是不允許對接口中的方法以及構(gòu)造函數(shù)聲明strictfp關(guān)鍵字,例如下面的代碼:

strictfp interface A {}

public strictfp class FpDemo1 {???

??????strictfp void f() {}???

}??

2.?錯(cuò)誤的使用方法

interface A {???

????strictfp void f();???

}???

public class FpDemo2 {???

????strictfp FpDemo2() {}???

}

一旦使用了關(guān)鍵字strictfp來聲明某個(gè)類、接口或者方法時(shí),那么在這個(gè)關(guān)鍵字所聲明的范圍內(nèi)所有浮點(diǎn)運(yùn)算都是精確的,符合IEEE-754規(guī)范

的。例如一個(gè)類被聲明為strictfp,那么該類中所有的方法都是strictfp的。

2)抽象類和接口有什么區(qū)別?(瞬聯(lián))

1.abstract class??Java?語言中表示的是一種繼承關(guān)系,一個(gè)類只能使用一次繼承關(guān)系。但是,一個(gè)類卻可以實(shí)現(xiàn)多個(gè)interface

2.abstract class?中可以有自己的數(shù)據(jù)成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是static final的,不過在?interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。

3.abstract classinterface所反映出的設(shè)計(jì)理念不同。其實(shí)abstract class表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系。

4.實(shí)現(xiàn)抽象類和接口的類必須實(shí)現(xiàn)其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實(shí)現(xiàn)方法。

5.接口中定義的變量默認(rèn)是public static final?型,且必須給其初值,所以實(shí)現(xiàn)類中不能重新定義,也不能改變其值。

6.抽象類中的變量默認(rèn)是?friendly?型,其值可以在子類中重新定義,也可以重新賦值。

7.接口中的方法默認(rèn)都是?public,abstract?類型的。

3)能說一下java的反射(reflection)機(jī)制嗎?(瞬聯(lián))

開放性和原因連接(causally-connected)是反射系統(tǒng)的兩大基本要素

4)在java中怎樣實(shí)現(xiàn)多線程?(瞬聯(lián))

extends Thread

implement Runnable

方法一:繼承?Thread?類,覆蓋方法?run(),我們在創(chuàng)建的?Thread?類的子類中重寫?run() ,加入線程所要執(zhí)行的代碼即可。下面是一個(gè)例子:

  public class MyThread extends Thread
  {
   int count= 1, number;
   public MyThread(int num)
   {
    number = num;
    System.out.println
    ("創(chuàng)建線程?" + number);
   }
   public void run() {
    while(true) {
     System.out.println
      ("線程?" + number + ":計(jì)數(shù)?" + count);
     if(++count== 6) return;
    }
  }
  public static void main(String args[])
  {
   for(int i = 0;i?〈?5; i++) new MyThread(i+1).start();
  }
 }
  
  這種方法簡單明了,符合大家的習(xí)慣,但是,它也有一個(gè)很大的缺點(diǎn),那就是如果我們的類已經(jīng)從一個(gè)類繼承(如小程序必須繼承自?Applet?類),則無法再繼承?Thread?類,這時(shí)如果我們又不想建立一個(gè)新的類,應(yīng)該怎么辦呢?

  我們不妨來探索一種新的方法:我們不創(chuàng)建Thread類的子類,而是直接使用它,那么我們只能將我們的方法作為參數(shù)傳遞給?Thread?類的實(shí)例,有點(diǎn)類似回調(diào)函數(shù)。但是?Java?沒有指針,我們只能傳遞一個(gè)包含這個(gè)方法的類的實(shí)例。

  那么如何限制這個(gè)類必須包含這一方法呢?當(dāng)然是使用接口!(雖然抽象類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避免繼承帶來的限制嗎?)

  Java?提供了接口?java.lang.Runnable?來支持這種方法。

  方法二:實(shí)現(xiàn)?Runnable?接口

  Runnable接口只有一個(gè)方法run(),我們聲明自己的類實(shí)現(xiàn)Runnable接口并提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務(wù)。但是Runnable接口并沒有任何對線程的支持,我們還必須創(chuàng)建Thread類的實(shí)例,這一點(diǎn)通過Thread類的構(gòu)造函數(shù)?public Thread(Runnable target);來實(shí)現(xiàn)。下面是一個(gè)例子:

  public class MyThread implements Runnable
  {
   int count= 1, number;
   public MyThread(int num)
   {
    number = num;
    System.out.println("創(chuàng)建線程?" + number);
   }
   public void run()
   {
    while(true)
    {
     System.out.println
     ("線程?" + number + ":計(jì)數(shù)?" + count);
     if(++count== 6) return;
    }
   }
   public static void main(String args[])
   {
    for(int i = 0; i?〈?5;i++) new Thread(new MyThread(i+1)).start();
   }
  }
  
  嚴(yán)格地說,創(chuàng)建Thread子類的實(shí)例也是可行的,但是必須注意的是,該子類必須沒有覆蓋?Thread?類的run?方法,否則該線程執(zhí)行的將是子類的?run?方法,而不是我們用以實(shí)現(xiàn)Runnable?接口的類的?run?方法,對此大家不妨試驗(yàn)一下。

  使用?Runnable?接口來實(shí)現(xiàn)多線程使得我們能夠在一個(gè)類中包容所有的代碼,有利于封裝,它的缺點(diǎn)在于,我們只能使用一套代碼,若想創(chuàng)建多個(gè)線程并使各個(gè)線程執(zhí)行不同的代碼,則仍必須額外創(chuàng)建類,如果這樣的話,在大多數(shù)情況下也許還不如直接用多個(gè)類分別繼承?Thread?來得緊湊。

  綜上所述,兩種方法各有千秋,大家可以靈活運(yùn)用。

  下面讓我們一起來研究一下多線程使用中的一些問題。

  三、線程的四種狀態(tài)

  1.?新狀態(tài):線程已被創(chuàng)建但尚未執(zhí)行(start()?尚未被調(diào)用)。

  2.?可執(zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU?時(shí)間隨時(shí)可能被分配給該線程,從而使得它執(zhí)行。

  3.?死亡狀態(tài):正常情況下?run()?返回使得線程死亡。調(diào)用?stop()或?destroy()?亦有同樣效果,但是不被推薦,前者會產(chǎn)生異常,后者是強(qiáng)制終止,不會釋放鎖。

  4.?阻塞狀態(tài):線程不會被分配?CPU?時(shí)間,無法執(zhí)行。

  四、線程的優(yōu)先級

  線程的優(yōu)先級代表該線程的重要程度,當(dāng)有多個(gè)線程同時(shí)處于可執(zhí)行狀態(tài)并等待獲得?CPU?時(shí)間時(shí),線程調(diào)度系統(tǒng)根據(jù)各個(gè)線程的優(yōu)先級來決定給誰分配?CPU?時(shí)間,優(yōu)先級高的線程有更大的機(jī)會獲得?CPU?時(shí)間,優(yōu)先級低的線程也不是沒有機(jī)會,只是機(jī)會要小一些罷了。

  你可以調(diào)用?Thread?類的方法?getPriority()?和?setPriority()來存取線程的優(yōu)先級,線程的優(yōu)先級界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,缺省是5(NORM_PRIORITY)。

5)你用過哪種設(shè)計(jì)模式?(瞬聯(lián),IBMaspenTech

設(shè)計(jì):design

模式:pattern

框架:framework

創(chuàng)建模式,結(jié)構(gòu)模式和行為模式

GoF設(shè)計(jì)模式

A.創(chuàng)建模式

設(shè)計(jì)模式之Factory(工廠模式)

使用工廠模式就象使用new一樣頻繁.2002/10/9更新

設(shè)計(jì)模式之Prototype(原型模式)

用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。

設(shè)計(jì)模式之Builder

汽車由車輪?方向盤?發(fā)動機(jī)很多部件組成,同時(shí),將這些部件組裝成汽車也是一件復(fù)雜的工作,Builder模式就是將這兩種情況分開進(jìn)行。

設(shè)計(jì)模式之Singleton(單態(tài)模式)

保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)?2002/10/9更新

B.結(jié)構(gòu)模式

設(shè)計(jì)模式之Facade

可擴(kuò)展的使用JDBC針對不同的數(shù)據(jù)庫編程,Facade提供了一種靈活的實(shí)現(xiàn).

設(shè)計(jì)模式之Proxy

Jive為例,剖析代理模式在用戶級別授權(quán)機(jī)制上的應(yīng)用

設(shè)計(jì)模式之Adapter

使用類再生的兩個(gè)方式:組合(new)和繼承(extends),這個(gè)已經(jīng)在"thinking in java"中提到過.

設(shè)計(jì)模式之Composite

就是將類用樹形結(jié)構(gòu)組合成一個(gè)單位.你向別人介紹你是某單位,你是單位中的一個(gè)元素,別人和你做買賣,相當(dāng)于和單位做買賣。文章中還對Jive再進(jìn)行了剖析。

設(shè)計(jì)模式之Decorator

Decorator是個(gè)油漆工,給你的東東的外表刷上美麗的顏色.

設(shè)計(jì)模式之Bridge

"牛郎織女"分開(本應(yīng)在一起,分開他們,形成兩個(gè)接口),在他們之間搭建一個(gè)橋(動態(tài)的結(jié)合)

設(shè)計(jì)模式之Flyweight

提供Java運(yùn)行性能,降低小而大量重復(fù)的類的開銷.

C.行為模式

設(shè)計(jì)模式之Template

實(shí)際上向你介紹了為什么要使用Java?抽象類,該模式原理簡單,使用很普遍.

設(shè)計(jì)模式之Memento

很簡單一個(gè)模式,就是在內(nèi)存中保留原來數(shù)據(jù)的拷貝.

設(shè)計(jì)模式之Observer

介紹如何使用Java API提供的現(xiàn)成Observer

設(shè)計(jì)模式之Chain of Responsibility

各司其職的類串成一串,好象擊鼓傳花,當(dāng)然如果自己能完成,就不要推委給下一個(gè).

設(shè)計(jì)模式之Command

什么是將行為封裝,Command是最好的說明.

設(shè)計(jì)模式之State

狀態(tài)是編程中經(jīng)常碰到的實(shí)例,將狀態(tài)對象化,設(shè)立狀態(tài)變換器,便可在狀態(tài)中輕松切換.

設(shè)計(jì)模式之Strategy

不同算法各自封裝,用戶端可隨意挑選需要的算法.

設(shè)計(jì)模式之Mediator

Mediator很象十字路口的紅綠燈,每個(gè)車輛只需和紅綠燈交互就可以.

設(shè)計(jì)模式之Interpreter

主要用來對語言的分析,應(yīng)用機(jī)會不多.

設(shè)計(jì)模式之Visitor

訪問者在進(jìn)行訪問時(shí),完成一系列實(shí)質(zhì)性操作,而且還可以擴(kuò)展.

設(shè)計(jì)模式之Iterator

這個(gè)模式已經(jīng)被整合入JavaCollection.在大多數(shù)場合下無需自己制造一個(gè)Iterator,只要將對象裝入Collection中,直接使用Iterator進(jìn)行對象遍歷。

6)請說一下MVC架構(gòu)(瞬聯(lián),IBMaspenTech

Model:模型層

View:視圖層???

Controller:控制層

MVC (Modal View Controler)本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計(jì)數(shù)據(jù)你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。?

模型-視圖-控制器(MVC)是Xerox PARC在八十年代為編程語言Smalltalk-80發(fā)明的一種軟件設(shè)計(jì)模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平臺的設(shè)計(jì)模式,并且受到越來越多的使用ColdFusion?和?PHP?的開發(fā)者的歡迎。模型-視圖-控制器模式是一個(gè)有用的工具箱,它有很多好處,但也有一些缺點(diǎn)。?


MVC如何工作?

MVC是一個(gè)設(shè)計(jì)模式,它強(qiáng)制性的使應(yīng)用程序的輸入、處理和輸出分開。使用MVC應(yīng)用程序被分成三個(gè)核心部件:模型、視圖、控制器。它們各自處理自己的任務(wù)。?

視圖?
視圖是用戶看到并與之交互的界面。對老式的Web應(yīng)用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應(yīng)用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術(shù)已層出不窮,它們包括Macromedia Flash和象XHTML,XML/XSL,WML等一些標(biāo)識語言和Web services.?

如何處理應(yīng)用程序的界面變得越來越有挑戰(zhàn)性。MVC一個(gè)大的好處是它能為你的應(yīng)用程序處理很多不同的視圖。在視圖中其實(shí)沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機(jī)存儲的還是一個(gè)雇員列表,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。?

模型?
模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個(gè)部件中,模型擁有最多的處理任務(wù)。例如它可能用象EJBs和ColdFusion Components這樣的構(gòu)件對象來處理數(shù)據(jù)庫。被模型返回的數(shù)據(jù)是中立的,就是說模型與數(shù)據(jù)格式無關(guān),這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)。由于應(yīng)用于模型的代碼只需寫一次就可以被多個(gè)視圖重用,所以減少了代碼的重復(fù)性。?

控制器?
控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當(dāng)單擊Web頁面中的超鏈接和發(fā)送HTML表單時(shí),控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請求,然后用確定用哪個(gè)視圖來顯示模型處理返回的數(shù)據(jù)。
?

現(xiàn)在我們總結(jié)MVC的處理過程,首先控制器接收用戶的請求,并決定應(yīng)該調(diào)用哪個(gè)模型來進(jìn)行處理,然后模型用業(yè)務(wù)邏輯來處理用戶的請求并返回?cái)?shù)據(jù),最后控制器用相應(yīng)的視圖格式化模型返回的數(shù)據(jù),并通過表示層呈現(xiàn)給用戶。?
為什么要使用?MVC?

大部分Web應(yīng)用程序都是用像ASP,PHP,或者CFML這樣的過程化語言來創(chuàng)建的。它們將像數(shù)據(jù)庫查詢語句這樣的數(shù)據(jù)層代碼和像HTML這樣的表示層代碼混在一起。經(jīng)驗(yàn)比較豐富的開發(fā)者會將數(shù)據(jù)從表示層分離開來,但這通常不是很容易做到的,它需要精心的計(jì)劃和不斷的嘗試。MVC從根本上強(qiáng)制性的將它們分開。盡管構(gòu)造MVC應(yīng)用程序需要一些額外的工作,但是它給我們帶來的好處是無庸質(zhì)疑的。?

首先,最重要的一點(diǎn)是多個(gè)視圖能共享一個(gè)模型,正如我所提及的,現(xiàn)在需要用越來越多的方式來訪問你的應(yīng)用程序。對此,其中一個(gè)解決之道是使用MVC,無論你的用戶想要Flash界面或是?WAP?界面;用一個(gè)模型就能處理它們。由于你已經(jīng)將數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以你可以最大化的重用你的代碼了。?

由于模型返回的數(shù)據(jù)沒有進(jìn)行格式化,所以同樣的構(gòu)件能被不同界面使用。例如,很多數(shù)據(jù)可能用HTML來表示,但是它們也有可能要用Macromedia Flash和WAP來表示。模型也有狀態(tài)管理和數(shù)據(jù)持久性處理的功能,例如,基于會話的購物車和電子商務(wù)過程也能被Flash網(wǎng)站或者無線聯(lián)網(wǎng)的應(yīng)用程序所重用。?

因?yàn)槟P褪亲园?#xff0c;并且與控制器和視圖相分離,所以很容易改變你的應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。如果你想把你的數(shù)據(jù)庫從MySQL移植到Oracle,或者改變你的基于RDBMS數(shù)據(jù)源到LDAP,只需改變你的模型即可。一旦你正確的實(shí)現(xiàn)了模型,不管你的數(shù)據(jù)來自數(shù)據(jù)庫或是LDAP服務(wù)器,視圖將會正確的顯示它們。由于運(yùn)用MVC的應(yīng)用程序的三個(gè)部件是相互對立,改變其中一個(gè)不會影響其它兩個(gè),所以依據(jù)這種設(shè)計(jì)思想你能構(gòu)造良好的松偶合的構(gòu)件。?

對我來說,控制器的也提供了一個(gè)好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,這樣控制器可以為構(gòu)造應(yīng)用程序提供強(qiáng)有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶的需求選擇模型進(jìn)行處理,然后選擇視圖將處理結(jié)果顯示給用戶。?

MVC的缺點(diǎn)?
MVC的缺點(diǎn)是由于它沒有明確的定義,所以完全理解MVC并不是很容易。使用MVC需要精心的計(jì)劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費(fèi)一些時(shí)間去思考。?

你將不得不花費(fèi)相當(dāng)可觀的時(shí)間去考慮如何將MVC運(yùn)用到你的應(yīng)用程序,同時(shí)由于模型和視圖要嚴(yán)格的分離,這樣也給調(diào)試應(yīng)用程序到來了一定的困難。每個(gè)構(gòu)件在使用之前都需要經(jīng)過徹底的測試。一旦你的構(gòu)件經(jīng)過了測試,你就可以毫無顧忌的重用它們了。?

根據(jù)我個(gè)人經(jīng)驗(yàn),由于我們將一個(gè)應(yīng)用程序分成了三個(gè)部件,所以使用MVC同時(shí)也意味著你將要管理比以前更多的文件,這一點(diǎn)是顯而易見的。這樣好像我們的工作量增加了,但是請記住這比起它所能帶給我們的好處是不值一提。?

MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序,花費(fèi)大量時(shí)間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會得不償失。?

MVC是一條創(chuàng)建軟件的好途徑?
MVC設(shè)計(jì)模式是一個(gè)很好創(chuàng)建軟件的途徑,它所提倡的一些原則,像內(nèi)容和顯示互相分離可能比較好理解。但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應(yīng)用程序,尤其是應(yīng)用程序的構(gòu)架方面。如果你肯接受MVC,并且有能力應(yīng)付它所帶來的額外的工作和復(fù)雜性,MVC將會使你的軟件在健壯性,代碼重用和結(jié)構(gòu)方面上一個(gè)新的臺階。

7)如果類a繼承類b,實(shí)現(xiàn)接口c,而類b和接口c中定義了同名變量,請問會出現(xiàn)什么問題?(瞬聯(lián))


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();
?????? }
}
答案:錯(cuò)誤。在編譯時(shí)會發(fā)生錯(cuò)誤(錯(cuò)誤描述不同的JVM有不同的信息,意思就是未明確的x調(diào)用,兩個(gè)x都匹配(就象在同時(shí)import java.util和java.sql兩個(gè)包時(shí)直接聲明Date一樣)。對于父類的變量,可以用super.x來明確(輸出的是1),而接口的屬性默認(rèn)隱含為?public static final.所以可以通過A.x來明確(輸出的是0)。

下面的代碼運(yùn)行時(shí)會不會報(bào)錯(cuò)
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());
??????? }
}

答案:?錯(cuò)。"interface Rollable extends Playable, Bounceable"沒有問題。interface可繼承多個(gè)interfaces,所以這里沒錯(cuò)。問題出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里聲明的interface variable (接口變量,也可稱成員變量),默認(rèn)為public static final。也就是說"Ball ball = new Ball("PingPang");"實(shí)際上是"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是不能被改變r(jià)eference的。因此編譯器將在"ball = new Ball("Football");"這里顯示有錯(cuò)。

8)請說一下java中為什么要引入內(nèi)部類?還有匿名內(nèi)部類?(瞬聯(lián),IBM

9)請說一下finalfinallyfinalize的區(qū)別?(瞬聯(lián))

final?用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。

10)請說一下HTTP請求的基本過程(IBM

11java中存在內(nèi)存泄漏問題嗎?請舉例說明?(IBM

會??

int i,i2;???? return (i-i2);????? //when i為足夠大的正數(shù),i2為足夠大的負(fù)數(shù)。結(jié)果會造成溢位,導(dǎo)致錯(cuò)誤。

12)請說一下java中的內(nèi)存回收機(jī)制所采用的算法(IBM,瞬聯(lián))

雖然垃圾回收關(guān)心著大部分的問題,包括內(nèi)存管理,使得程序員的任務(wù)顯得更加輕松,但是程序員還是可能犯些錯(cuò)誤導(dǎo)致內(nèi)存泄漏問題。GC(垃圾回收)通過遞歸對所有從“根”對象(堆棧中的對象,靜態(tài)數(shù)據(jù)成員,JNI句柄等等)繼承下來的引用進(jìn)行工作,然后標(biāo)記所有可以訪問的活動著的對象。而這些對象變成了程序唯一能夠操縱的對象,其他的對象都被釋放了。因?yàn)镚C使得程序不能夠訪問那些被釋放的對象,所以這樣做是安全的。

13)請說一下System.gc()函數(shù)的作用。什么時(shí)候可以調(diào)用垃圾回收器?(瞬聯(lián))

垃圾回收函數(shù),手動調(diào)用的.

當(dāng)一個(gè)對象停止被活動聲明所引用,它就變成了垃圾(garbage)可以被回收重新使用

14)你做過的項(xiàng)目中采用了什么安全認(rèn)證機(jī)制?(IBM

15Math.round()什么作用?

???? Math.Round(3.44, 1) = 3.4
?????? Math.Round(3.45, 1) = 3.4
?????? Math.Round(3.46, 1) = 3.5
?????? -----------------------------------------------
?????? Math.Round(3.54, 1) = 3.5
?????? Math.Round(3.55, 1) = 3.6
?????? Math.Round(3.56, 1) = 3.6
?????? -----------------------------------------------
?????? Math.Round(3.64, 1) = 3.6
?????? Math.Round(3.65, 1) = 3.6
?????? Math.Round(3.66, 1) = 3.7
?????? -----------------------------------------------
?????? Math.Round(3.74, 1) = 3.7
?????? Math.Round(3.75, 1) = 3.8
?????? Math.Round(3.76, 1) = 3.8

這種舍入方法叫做銀行家舍入(Banker'sRound),這就是已經(jīng)規(guī)定下來的標(biāo)準(zhǔn)、Round的標(biāo)準(zhǔn)、世界的標(biāo)準(zhǔn)。

Round <>?四舍五入

16、設(shè)計(jì)4個(gè)線程,其中兩個(gè)線程每次對j增加1,另外兩個(gè)線程對j每次減少1。寫出程序。
以下程序使用內(nèi)部類實(shí)現(xiàn)線程,對j增減的時(shí)候沒有考慮順序問題。

package java_example150;

public class TestThread3{
?private int j;
?public static void main(String[] args){
??TestThread3 t = new TestThread3();
???? Inc inc = t.new Inc();
???? Dec dec = t.new Dec();

???? for(int i=0;i<2;i++){
???? ?Thread ts = new Thread(inc);
???? ?ts.start();
???? ?ts= new Thread(dec);
???? ?ts.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<10;i++){
????? inc();
???? }
??? }
?}

?class Dec implements Runnable{
??public void run(){
???for(int i=0;i<10;i++){
????dec();
???}
???? }
?}
}

?

17.CORBA是什么?用途是什么??
答:CORBA?標(biāo)準(zhǔn)是公共對象請求代理結(jié)構(gòu)(Common Object Request Broker Architecture),由對象管理組織?(Object Management Group,縮寫為?OMG)標(biāo)準(zhǔn)化。它的組成是接口定義語言(IDL),?語言綁定(binding:也譯為聯(lián)編)和允許應(yīng)用程序間互操作的協(xié)議。?其目的為:
1. 用不同的程序設(shè)計(jì)語言書寫?
2. 在不同的進(jìn)程中運(yùn)行?
3. 為不同的操作系統(tǒng)開發(fā)

18.JAVA代碼查錯(cuò)

1.

abstract class Name

{

????private String name;

????public abstract boolean isStupidName(String name)?{}

}

答案:?錯(cuò)。abstract method必須以分號結(jié)尾,且不帶花括號。

2.

public class Something

{

????void doSomething ()

???{

????????private?String s = "";

????????int l = s.length();

????}

}

答案:?錯(cuò)。局部變量前不能放置任何訪問修飾符?(privatepublic,和protected)final可以用來修飾局部變量

(final如同abstractstrictfp,都是非訪問修飾符,strictfp只能修飾classmethod而非variable)

3.

abstract class Something

{

????private?abstract String doSomething ();

}

答案:?錯(cuò)。abstractmethods不能以private修飾。abstractmethods就是讓子類implement(實(shí)現(xiàn))具體細(xì)節(jié)的,怎么可以用privateabstractmethod封鎖起來呢? (同理,abstract method前不能加final)

4.

public class Something

{

????public int addOne(final int x)

????{

????????return?++x;

????}

}

答案:?錯(cuò)。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;

}

答案:?正確。在addOne method中,參數(shù)o被修飾成final。如果在addOne method里我們修改了oreference

(比如: o = new Other();),那么如同上例這題也是錯(cuò)的。但這里修改的是omember vairable

(成員變量),而oreference并沒有改變。

6.

class Something

{

?????int i;

?????public void doSomething()

?????{

?????????System.out.println("i = " + i);

?????}

}

答案:?正確。輸出的是"i = 0"int i屬於instant variable (實(shí)例變量,或叫成員變量)instant variabledefault valueintdefault value0

7.

class Something

{

?????final int i;

?????public void doSomething()

?????{

?????????System.out.println("i = " + i);

?????}

}

答案:?錯(cuò)。final int i?是個(gè)final?instant variable (實(shí)例變量,或叫成員變量)finalinstant variable沒有default value,必須在constructor (構(gòu)造器)結(jié)束之前被賦予一個(gè)明確的值。可以修改為"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 ...";

?????}

}

答案:?錯(cuò)。看上去在maincall doSomething沒有什么問題,畢竟兩個(gè)methods都在同一個(gè)class里。但仔細(xì)看,mainstatic的。static?method不能直接call non-static methods可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能訪問non-static instant variable

?

總結(jié)

以上是生活随笔為你收集整理的JAVA常见面试题及解答的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。