1.什么是Java虛擬機(jī)?為什么Java被稱作是“平臺無關(guān)的編程語言”?
java虛擬機(jī)是一個可以執(zhí)行java字節(jié)碼的虛擬機(jī)進(jìn)程。java源文件被編譯成能被java虛擬機(jī)執(zhí)行的字節(jié)碼文件。Java被設(shè)計成允許應(yīng)用程序可以運(yùn)行在任意的平臺,而不需要程序員為每一個平臺重寫或者重新編譯。java虛擬機(jī)讓這個變?yōu)榭赡?,因為它知道底層硬件平臺的指令長度和其它特性。
java的跨平臺不是java源程序的跨平臺 ,如果是這樣,那么所以語言都是跨平臺的, java源程序先經(jīng)過javac編譯器編譯成二進(jìn)制的.class字節(jié)碼文件(java的跨平臺指的就是.class字節(jié)碼文件的跨平臺,.class字節(jié)碼文件是與平臺無關(guān)的),.class文件再運(yùn)行在jvm上,java解釋器(jvm的一部分)會將其解釋成對應(yīng)平臺的機(jī)器碼執(zhí)行,所以java所謂的跨平臺就是在不同平臺上安裝了不同的jvm,而在不同平臺上生成的.class文件都是一樣的,而.class文件再由對應(yīng)平臺的jvm解釋成對應(yīng)平臺的機(jī)器碼執(zhí)行。
2.JDK和JRE的區(qū)別是什么?
java運(yùn)行時環(huán)境(JRE),它包括java虛擬機(jī)、java核心類庫和支持文件,但不包含開發(fā)工具(JDK)---編譯器、調(diào)試器和其他工具
java開發(fā)工具包(JDK)是完整的java軟件開發(fā)包,包含了JRE,編譯器和其他的工具(比如:javaDoc,java調(diào)試器),可以讓開發(fā)者開發(fā)、編譯。執(zhí)行java應(yīng)用程序。
3.”static”關(guān)鍵字是什么意思?Java中是否可以覆蓋(override)一個private或者是static的方法?
“static”關(guān)鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實(shí)例變量的情況下被訪問。Java中static方法不能被覆蓋,因為方法覆蓋是基于運(yùn)行時動態(tài)綁定的,而static方法是編譯時靜態(tài)綁定的。static方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。java中也不可以覆蓋private的方法,因為private修飾的變量和方法只能在當(dāng)前類中使用,如果是其他的類繼承當(dāng)前類是不能訪問到private變量或方法的,當(dāng)然也不能覆蓋。
Static表示靜態(tài)的意思,可用于修飾成員變量和成員函數(shù),被靜態(tài)修飾的成員函數(shù)只能訪問靜態(tài)成員,不可以訪問非靜態(tài)成員。靜態(tài)是隨著類的加載而加載的,因此可以直接用類進(jìn)行訪問。 重寫是子類中的方法和子類繼承的父類中的方法一樣(函數(shù)名,參數(shù),參數(shù)類型,反回值類型),但是子類中的訪問權(quán)限要不低于父類中的訪問權(quán)限。重寫的前提是必須要繼承,private修飾不支持繼承,因此被私有的方法不可以被重寫。靜態(tài)方法形式上可以被重寫,即子類中可以重寫父類中靜態(tài)的方法。但是實(shí)際上從內(nèi)存的角度上靜態(tài)方法不可以被重寫。
首先是static關(guān)鍵字,static原意是“靜態(tài)的”。
①static可以修飾內(nèi)部類,但是不能修飾普通類。靜態(tài)內(nèi)部類的話可以直接調(diào)用靜態(tài)構(gòu)造器(不用對象)。
②static修飾方法,static方法就是沒有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過來是可以的。而且可以在沒有創(chuàng)建任何對象的前提下,僅僅通過類本身來調(diào)用static方法。這實(shí)際上正是static方法的主要用途。方便在沒有創(chuàng)建對象的情況下來進(jìn)行調(diào)用(方法/變量)。
最常見的static方法就是main,因為所有對象都是在該方法里面實(shí)例化的,而main是程序入口,所以要通過類名來調(diào)用。還有就是main中需要經(jīng)常訪問隨類加載的成員變量。
③static修飾變量,就變成了靜態(tài)變量,隨類加載一次,可以被多個對象共享。
④static修飾代碼塊,形成靜態(tài)代碼塊,用來優(yōu)化程序性能,將需要加載一次的代碼設(shè)置成隨類加載,靜態(tài)代碼塊可以有多個。
Java中static方法不能被覆蓋,因為方法覆蓋是基于運(yùn)行時動態(tài)綁定的,而static方法是編譯時靜態(tài)綁定的。
還有私有的方法不能被繼承,子類就沒有訪問權(quán)限,肯定也是不能別覆蓋的。
4.是否可以在static環(huán)境中訪問非static變量?
static變量在Java中是屬于類的,它在所有的實(shí)例中的值是一樣的。當(dāng)類被Java虛擬機(jī)載入的時候,會對static變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來訪問非static的變量,編譯器會報錯,因為這些變量還沒有被創(chuàng)建出來,還沒有跟任何實(shí)例關(guān)聯(lián)上。
因為靜態(tài)的成員屬于類,隨著類的加載而加載到靜態(tài)方法區(qū)內(nèi)存,當(dāng)類加載時,此時不一定有實(shí)例創(chuàng)建,沒有實(shí)例,就不可以訪問非靜態(tài)的成員。
在static環(huán)靜中,不可以訪問非static。因為靜態(tài)的成員屬于類,隨著類的加載而加載到靜態(tài)方法區(qū)內(nèi)存,當(dāng)類加載時,此時不一定有實(shí)例創(chuàng)建,沒有實(shí)例,就不可以訪問非靜態(tài)的成員。類的加載先于實(shí)例的創(chuàng)建,因此靜態(tài)環(huán)境中,不可以訪問非靜態(tài)!
5.Java支持的數(shù)據(jù)類型有哪些?什么是自動拆裝箱?
Java語言支持的8種基本數(shù)據(jù)類型是:byte,short,int,long,float,double,boolean,char
自動裝箱是指java編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型之間做一個轉(zhuǎn)化,比如:把int轉(zhuǎn)化成Integer,double轉(zhuǎn)化成Double。
Java支持的數(shù)據(jù)類型包括兩種:一種是基本數(shù)據(jù)類型,包含byte,char,short, boolean ,int , long, float,double;另一種是引用類型:如String等,其實(shí)是對象的引用,JVM中虛擬棧中存的是對象的地址,創(chuàng)建的對象實(shí)質(zhì)在堆中,通過地址來找到堆中的對象的過程,即為引用類型。自動裝箱就是Java編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型間的轉(zhuǎn)化,即int轉(zhuǎn)化為Integer,自動拆箱是Integer調(diào)用其方法將其轉(zhuǎn)化為int的過程
6.Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?
Java中的方法重載發(fā)生在同一個類里面兩個或者是多個方法的方法名相同但是參數(shù)不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。
方法重寫的原則:
重寫方法的方法名稱、參數(shù)列表必須與原方法的相同,返回類型可以相同也可以是原類型的子類型(從Java SE5開始支持)。
重寫方法不能比原方法訪問性差(即訪問權(quán)限不允許縮小)。
重寫方法不能比原方法拋出更多的異常。
被重寫的方法不能是final類型,因為final修飾的方法是無法重寫的。
被重寫的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進(jìn)行重寫。
被重寫的方法不能為static。如果父類中的方法為靜態(tài)的,而子類中的方法不是靜態(tài)的,但是兩個方法除了這一點(diǎn)外其他都滿足重寫條件,那么會發(fā)生編譯錯誤;反之亦然。即使父類和子類中的方法都是靜態(tài)的,并且滿足重寫條件,但是仍然不會發(fā)生重寫,因為靜態(tài)方法是在編譯的時候把靜態(tài)方法和類的引用類型進(jìn)行匹配。
重寫是發(fā)生在運(yùn)行時的,因為編譯期編譯器不知道并且沒辦法確定該去調(diào)用哪個方法,JVM會在代碼運(yùn)行的時候作出決定。
方法重載的原則:
方法名稱必須相同。
參數(shù)列表必須不同(個數(shù)不同、或類型不同、參數(shù)類型排列順序不同等)。
方法的返回類型可以相同也可以不相同。
僅僅返回類型不同不足以成為方法的重載。
重載是發(fā)生在編譯時的,因為編譯器可以根據(jù)參數(shù)的類型來選擇使用哪個方法。
重寫和重載的不同:
方法重寫要求參數(shù)列表必須一致,而方法重載要求參數(shù)列表必須不一致。
方法重寫要求返回類型必須一致(或為其子類型),方法重載對此沒有要求。
方法重寫只能用于子類重寫父類的方法,方法重載用于同一個類中的所有方法。
方法重寫對方法的訪問權(quán)限和拋出的異常有特殊的要求,而方法重載在這方面沒有任何限制。
父類的一個方法只能被子類重寫一次,而一個方法可以在所有的類中可以被重載多次。
重載是編譯時多態(tài),重寫是運(yùn)行時多態(tài)。
7.Java中,什么是構(gòu)造方法?什么是構(gòu)造方法重載?什么是復(fù)制構(gòu)造方法?
當(dāng)新對象被創(chuàng)建的時候,構(gòu)造方法會被調(diào)用。每一個類都有構(gòu)造方法。在程序員沒有給類提供構(gòu)造方法的情況下,Java編譯器會為這個類創(chuàng)建一個默認(rèn)的構(gòu)造方法。Java中構(gòu)造方法重載和方法重載很相似??梢詾橐粋€類創(chuàng)建多個構(gòu)造方法。每一個構(gòu)造方法必須有它自己唯一的參數(shù)列表。Java不支持像C++中那樣的復(fù)制構(gòu)造方法,這個不同點(diǎn)是因為如果你不自己寫構(gòu)造方法的情況下,Java不會創(chuàng)建默認(rèn)的復(fù)制構(gòu)造方法。
8.Java支持多繼承么?
Java中類不支持多繼承,只支持單繼承(即一個類只有一個父類)。但是java中的接口支持多繼承,即一個子接口可以有多個父接口(接口的作用是來擴(kuò)展對象的功能,一個子接口繼承多個父接口,說明子接口擴(kuò)展了多個功能,當(dāng)實(shí)現(xiàn)接口時,類就擴(kuò)展了相應(yīng)的功能)
9.接口和抽象類的區(qū)別是什么?
(1)接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法
(2)類可以實(shí)現(xiàn)很多個接口,但是只能繼承一個抽象類
(3)類可以不實(shí)現(xiàn)抽象類和接口聲明的所有方法,當(dāng)然,在這種情況下,類也必須得聲明成是抽象的
(4)抽象類可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口
(5)Java接口中聲明的變量默認(rèn)都是final的。抽象類可以包含非final的變量
(6)Java接口中的成員函數(shù)默認(rèn)是public的。抽象類的成員函數(shù)可以是private,protected或者是public
(7)接口是絕對抽象的,不可以被實(shí)例化。抽象類也不可以被實(shí)例化,但是,如果它包含main方法的話是可以被調(diào)用的
從設(shè)計層面來說,抽象是對類的抽象,是一種模板設(shè)計,接口是行為的抽象,是一種行為的規(guī)范
10.什么是值傳遞和引用傳遞?
值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量;引用傳遞一般是對于對象型基本變量而言的,傳遞是該對象地址的一個副本,并不是原對象本身;一般認(rèn)為java內(nèi)的傳遞都是值傳遞,java中實(shí)例對象的傳遞都是引用傳遞
例如:public void add(int a) { int b = a; } 這個可以看作是值傳遞,a是基本數(shù)據(jù)類型,他把他的值傳給了bpublic void add(Object obj) { Object objTest = obj;? }這個可以看作是址傳遞,obj是引用數(shù)據(jù)類型,是把他棧中指向堆中的對象的地址值賦值給了objTest.這時候就同時有兩個引用指向了堆中的某個Object對象? 其實(shí)這樣看來,java應(yīng)該只有值傳遞的。如果是基本數(shù)據(jù)類型,傳遞的就是實(shí)際的值. 如果是引用數(shù)據(jù)類型,傳遞的就是該引用的地址值.
11.進(jìn)程和線程的區(qū)別是什么?
進(jìn)程是執(zhí)行著的應(yīng)用程序,而線程是進(jìn)程內(nèi)部的一個執(zhí)行序列。一個進(jìn)程可以有多個線程,線程又叫做輕量級進(jìn)程,線程的劃分小于進(jìn)程,線程隸屬于某個進(jìn)程。進(jìn)程是程序的一種動態(tài)形式,是CPU、內(nèi)存等資源占用的基本單位,而線程是不能占有這些資源的。 進(jìn)程之間相互獨(dú)立,通信比較困難,而線程之間共享一塊內(nèi)存區(qū)域,通信比較方便。 進(jìn)程在執(zhí)行的過程中,包含比較固定的入口,執(zhí)行順序,出口,而線程的這些過程會被應(yīng)用程序所控制
線程與進(jìn)程的區(qū)別歸納:
a.地址空間和其它資源:進(jìn)程間相互獨(dú)立,同一進(jìn)程的各線程間共享。某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見。
b.通信:進(jìn)程間通信IPC,線程間可以直接讀寫進(jìn)程數(shù)據(jù)段(如全局變量)來進(jìn)行通信——需要進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性。
c.調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多。
d.在多線程OS中,進(jìn)程不是一個可執(zhí)行的實(shí)體。
12.創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?
創(chuàng)建線程的方式有4種:繼承Thread類;實(shí)現(xiàn)Runnable接口;應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池;實(shí)現(xiàn)Callable接口
實(shí)現(xiàn)Runnable接口這種方式更受歡迎,因為這不需要繼承Thread類,在應(yīng)用設(shè)計中已經(jīng)繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實(shí)現(xiàn)接口。同時,線程池也是非常高效的,很容易實(shí)現(xiàn)和使用。
①繼承Thread類(真正意義上的線程類),是Runnable接口的實(shí)現(xiàn)。
②實(shí)現(xiàn)Runnable接口,并重寫里面的run方法。
③使用Executor框架創(chuàng)建線程池。Executor框架是juc里提供的線程池的實(shí)現(xiàn)。
調(diào)用線程的start():啟動此線程;調(diào)用相應(yīng)的run()方法
繼承于Thread類的線程類,可以直接調(diào)用start方法啟動線程(使用static也可以實(shí)現(xiàn)資源共享).一個線程(對象)只能夠執(zhí)行一次start(),而且不能通過Thread實(shí)現(xiàn)類對象的run()去啟動一個線程。
實(shí)現(xiàn)Runnable接口的類需要再次用Thread類包裝后才能調(diào)用start方法。(三個Thread對象包裝一個類對象,就實(shí)現(xiàn)了資源共享)。
線程的使用的話,注意鎖和同步的使用。(多線程訪問共享資源容易出現(xiàn)線程安全問題)
一般情況下,常見的是第二種。
* Runnable接口有如下好處:
*①避免點(diǎn)繼承的局限,一個類可以繼承多個接口。
*②適合于資源的共享
/*
* Thread的常用方法:
* 1.start():啟動線程并執(zhí)行相應(yīng)的run()方法
* 2.run():子線程要執(zhí)行的代碼放入run()方法中
* 3.currentThread():靜態(tài)的,調(diào)取當(dāng)前的線程
* 4.getName():獲取此線程的名字
* 5.setName():設(shè)置此線程的名字
* 6.yield():調(diào)用此方法的線程釋放當(dāng)前CPU的執(zhí)行權(quán)(很可能自己再次搶到資源)
* 7.join():在A線程中調(diào)用B線程的join()方法,表示:當(dāng)執(zhí)行到此方法,A線程停止執(zhí)行,直至B線程執(zhí)行完畢,
* A線程再接著join()之后的代碼執(zhí)行
* 8.isAlive():判斷當(dāng)前線程是否還存活
* 9.sleep(long l):顯式的讓當(dāng)前線程睡眠l毫秒 ?(只能捕獲異常,因為父類run方法沒有拋異常)
* 10.線程通信(方法在Object類中):wait()
notify() ?notifyAll()
*設(shè)置線程的優(yōu)先級(非絕對,只是相對幾率大些)
* getPriority():返回線程優(yōu)先值
* setPriority(int newPriority):改變線程的優(yōu)先級
*/
13.概括的解釋下線程的幾種可用狀態(tài)
14.什么是Servlet?
Servlet是用來處理客戶端請求并產(chǎn)生動態(tài)網(wǎng)頁內(nèi)容的java類。Servlet主要是用來處理或者是存儲HTML表單提交的數(shù)據(jù),產(chǎn)生動態(tài)內(nèi)容,再無狀態(tài)HTTP協(xié)議下管理狀態(tài)信息
15.說一下Servlet的體系結(jié)構(gòu)
所有的Servlet都必須要實(shí)現(xiàn)的核心的接口是javax.servlet.Servlet.每一個Servlet都必須要直接或者是間接實(shí)現(xiàn)這個接口,或者是繼承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多線程可以并行的為多個請求服務(wù)
16.Applet和Servlet有什么區(qū)別
Applet試運(yùn)行在客戶端主機(jī)的瀏覽器上的客戶端java程序。而Servlet是運(yùn)行在web服務(wù)器上的服務(wù)端的組件。Applet可以使用用戶界面類,而servlet沒有用戶界面,相反Servlet是等待客戶端的HTTP請求,然后為請求產(chǎn)生響應(yīng)。
17.解釋下Servlet的生命周期
對每一個客戶端的請求,Servlet引擎載入servlet,調(diào)用它的init()方法,完成Servlet的初始化。然后,Servlet對象通過為每一個請求單獨(dú)調(diào)用service()方法來處理所有隨后來自客戶端的請求,最后,調(diào)用Servlet.
18.doGet()方法和doPost()方法有什么區(qū)別?
doGet():GET方法會把名值對追加在請求的URL后面。因為URL對字符數(shù)目有限制,進(jìn)而限制了用在客戶端請求的參數(shù)值的數(shù)目,并且請求中的參數(shù)值是可見的,因此敏感信息不能用這種方式傳遞
doPost():POST方法通過把請求參數(shù)值放在請求體中來克服GET方法的限制,因此,可以發(fā)送的參數(shù)的數(shù)目是沒有限制的。最后,通過POST請求傳遞的敏感信息對外部客戶端是不可見的
19.什么是Web應(yīng)用程序?
Web應(yīng)用程序是對Web或者是應(yīng)用服務(wù)器的動態(tài)擴(kuò)展,有兩種類型的Web應(yīng)用:面向表現(xiàn)和面向服務(wù)的。面向表現(xiàn)的Web應(yīng)用程序會產(chǎn)生包含了很多標(biāo)記語言和動態(tài)內(nèi)容的交互的web頁面作為對請求的響應(yīng)。而面向服務(wù)的Web應(yīng)用實(shí)現(xiàn)了Web服務(wù)的端點(diǎn),一般來說,一個Web應(yīng)用可以看成是一組安裝在服務(wù)器URL名稱空間的特定自己下面的Servlet的集合。
20.什么是cookie?session和cookie有什么區(qū)別?
cookie是Web服務(wù)器發(fā)送給瀏覽器的一塊信息。瀏覽器會在本地文件中給每一個Web服務(wù)器存儲cookie。以后瀏覽器在給特定的Web服務(wù)器發(fā)請求的時候,同時會發(fā)送所有為該服務(wù)器存儲的cookie。
session和cookie的區(qū)別:
無論客戶端瀏覽器做怎么樣的設(shè)置,session都應(yīng)該能正常工作。客戶端可以禁用cookie,但是session仍然能夠工作的,因為客戶端無法禁止服務(wù)端的session。
在存儲的數(shù)據(jù)量方面session和cookie也是不一樣的。session能夠存儲任意的java對象,cookie只能存儲String類型的對象
21.sendRedirect()和forward()方法有什么區(qū)別?
sendRedirect()方法會創(chuàng)建一個新的請求,而forward()方法只是把請求轉(zhuǎn)發(fā)到一個新的目標(biāo)上。重定向(redirect)以后,之前請求作用于范圍以內(nèi)的對象就失敗了,因為會產(chǎn)生一個新的請求,而轉(zhuǎn)發(fā)(forwarding)以后,之前請求作用于范圍以內(nèi)的對象 還是能訪問的。一般 認(rèn)為sendRedict()要比forward()慢
22.什么是JSP頁面
JSP頁面是一種包含了靜態(tài)數(shù)據(jù)和JSP元素兩種類型的文本的文本文檔。靜態(tài)數(shù)據(jù)可以用任何基于文本的格式來表示,比如:HTML或者XML。JSP是一種混合了靜態(tài)內(nèi)容和動態(tài)產(chǎn)生的內(nèi)容的技術(shù)
23.JSP請求是如何被處理的?
瀏覽器首先要請求一個以.jsp擴(kuò)展名結(jié)尾的頁面,發(fā)起JSP請求,然后web服務(wù)器會讀取這個請求,使用jsp編譯器把jsp頁面轉(zhuǎn)化成一個servlet類。需要注意的是,只有第一次請求頁面或者是JSP文件發(fā)生改變的時候JSP文件才會被編譯,然后服務(wù)器調(diào)用Servlet類,處理瀏覽器的請求。一旦請求執(zhí)行結(jié)束,servlet會把響應(yīng)發(fā)送給客戶端。
24.JSP有什么優(yōu)點(diǎn)?
下面列出了使用JSP的優(yōu)點(diǎn):
JSP頁面是被動態(tài)編譯成Servlet的,因此,開發(fā)者可以很容易的更新展現(xiàn)代碼。
JSP頁面可以被預(yù)編譯。
JSP頁面可以很容易的和靜態(tài)模板結(jié)合,包括:HTML或者XML,也可以很容易的和產(chǎn)生動態(tài)內(nèi)容的代碼結(jié)合起來。
開發(fā)者可以提供讓頁面設(shè)計者以類XML格式來訪問的自定義的JSP標(biāo)簽庫。
開發(fā)者可以在組件層做邏輯上的改變,而不需要編輯單獨(dú)使用了應(yīng)用層邏輯的頁面。
25.抽象的定義?抽象和封裝的不同點(diǎn)?
抽象是把想法從具體的實(shí)例中分離出來的步驟,因此,要根據(jù)他們的功能而不是實(shí)現(xiàn)細(xì)節(jié)來創(chuàng)建類,java支持創(chuàng)建只暴露接口而不包含方法實(shí)現(xiàn)的抽象的類,這種抽象技術(shù)的主要目的是把類的行為和實(shí)現(xiàn)細(xì)節(jié)分離開
抽象和封裝是互補(bǔ)的概念。一方面,抽象關(guān)注對象的行為。另一方面,封裝關(guān)注對象行為的細(xì)節(jié)。一般是通過隱藏對象內(nèi)部狀態(tài)信息做到封裝,因此,封裝可以看成是用來提供抽象的一種策略。
26.繼承的定義?
繼承給對象提供了從基類獲取字段和方法的能力。繼承提供了代碼的重用性,也可以在不修改類的情況下給現(xiàn)存的類添加新特性。
27.多態(tài)的定義?
多態(tài)是編程語言給不同的底層數(shù)據(jù)類型做相同的借口展示的一種能力。一個多態(tài)類型桑的錯做可以應(yīng)用到其他類型的值上面。
28.封裝的定義和好處有哪些?
封裝給對象提供了隱藏內(nèi)部特性和行為的能力。對象提供一些能被其他對象訪問的方法來改變它內(nèi)部的數(shù)值。在java當(dāng)中 ,有3總修飾符:public,private,protected.每一種修飾符給其他的位于同一個包或者不同包下面對象賦予了不同的訪問權(quán)限。
封裝的一些好處:
通過隱藏對象的屬性來保護(hù)對象內(nèi)部的狀態(tài);提高了diamante的可用性和可維護(hù)性,因為對象的行為可以被單獨(dú)的改變或者是擴(kuò)展;禁止對象之間的不良交互提高模塊化
或者
一是用private把類的細(xì)節(jié)與外界隔離起來,從而實(shí)現(xiàn)數(shù)據(jù)項和方法的隱藏,而要訪問這些數(shù)據(jù)項和方法唯一的途徑就是通過類本身,類才有資格調(diào)用它所擁有的資源(方法,數(shù)據(jù)項屬性等等)。所以第一個好處就是數(shù)據(jù)的安全性提高了。
二是通過隱藏隔離,只允許外部對類做有限的訪問,開發(fā)者可以自由的改變類的內(nèi)部實(shí)現(xiàn),而無需修改使用該類的那些程序。只要那些在類外部就能被調(diào)用的方法保持其外部特征不變,內(nèi)部代碼就可以自由改變,各取所需,利于分工。
三就是提高了代碼的重用性,封裝成工具類以后能夠減少很多繁瑣的步驟。
29.面向?qū)ο筌浖_發(fā)的優(yōu)點(diǎn)有哪些?
代碼開發(fā)模塊化,更易于維護(hù)和修改;代碼復(fù)用;增強(qiáng)代碼的可靠性和靈活性;增加代碼的可理解性;面向?qū)ο缶幊逃泻芏嘀匾奶匦?,比如:封裝,繼承,多態(tài)和抽象。
28.隱含對象是什么意思?有哪些隱含對象?
jsp隱含對象是頁面中的一些java對象,jsp容器讓這些java對象可以為開發(fā)者所利用。開發(fā)者不用明確的聲明就可以直接使用它們。jsp隱含對象也叫做預(yù)定義變量,下面列出了jsp頁面中的隱含對象:
application;page;request;response;session;exception;out;config;pageContext;
29.什么是表達(dá)式(Expression)?
列表很長,可以分上,中,下發(fā)布,jsp表達(dá)式是Web服務(wù)器把腳本語言表達(dá)式的值轉(zhuǎn)化成一個String 對象,插入到返回給客戶端的數(shù)據(jù)流中。表達(dá)式是在<%=和%>這兩個標(biāo)簽之間定義的。
30.聲明(Decalaration)在哪里?
聲明跟java中的變量的聲明很相似,它用來聲明隨后被表達(dá)式或者scriptlet使用的變量。添加的聲明必須要用開始和結(jié)束標(biāo)簽包起來。
31.什么是Scriptlets?
JSP技術(shù)中,scriptlet是嵌入在JSP頁面中的一段Java代碼。scriptlet是位于標(biāo)簽內(nèi)部的所有的東西,在標(biāo)簽與標(biāo)簽之間,用戶可以添加任意有效的scriplet。
32.什么是JSP動作(JSP action)?
JSP動作以XML語法的結(jié)構(gòu)來控制Servlet引擎的行為。當(dāng)JSP頁面被請求的時候,JSP動作會被執(zhí)行,它們可以被動態(tài)的插入到文件中,重用JavaBean組件,轉(zhuǎn)發(fā)用戶到其他的頁面,或者是給java插件產(chǎn)生HTML代碼,下面列出了可用的動作:
jsp:include----當(dāng)JSP頁面被請求的時候包含一個文件
jsp:useBean------找出或者是初始化JavaBean
jsp:setProperty------設(shè)置JavaBean的屬性
jsp:getProperty--------獲取JavaBean的屬性
jsp:forward--------把請求轉(zhuǎn)發(fā)到新的頁面
jsp:plugin------產(chǎn)生特定瀏覽器的代碼
33.什么是JSP指令(Directive)?JSP中有哪些不同類型的指令?
Directive是jsp頁面被編譯成servlet的時候,jsp引擎要處理的指令。Directive用來設(shè)置頁面級別的指令,從外部插入數(shù)據(jù),指定自定義的標(biāo)簽庫。Directive是定義在<%@和%>之間的,下面列出了不同類型的Directive:
包含指令(include directive):用來包含文件和合并文件內(nèi)容到當(dāng)前的頁面
頁面指令(page directive):用來定義jsp頁面中特定的屬性,比如錯誤頁面和緩沖區(qū)
Taglib指令:用來聲明頁面中使用的自定義的標(biāo)簽庫
34.作用域public,private,protected以及不寫時的區(qū)別

35.Anonymous Inner Class (匿名內(nèi)部類)是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)
匿名的內(nèi)部類是沒有名字的內(nèi)部類,不能繼承其他類,但是一個內(nèi)部類可以作為一個接口,由另一個內(nèi)部類實(shí)現(xiàn)
36.靜態(tài)內(nèi)部類意味著:創(chuàng)建一個static內(nèi)部類的對象,不需要一個而外部類對象;不能從一個static內(nèi)部類的一個對象訪問一個外部類對象
37.&是位運(yùn)算符,表示按位與運(yùn)算;&&是邏輯運(yùn)算符,表示邏輯與(and);
對于&不管怎樣,都會執(zhí)行&符號左右兩邊的程序;對于&&,只有&&左邊的程序為真(true)后,才會執(zhí)行&&右邊的程序
&:只要左右兩邊有一個為false,則為false;只有全部為true,結(jié)果為true;
&&:只要符號左邊為false,則結(jié)果九尾false;當(dāng)左邊為true,同時右邊為true,則結(jié)果為true
38.Collection和Collections的區(qū)別
Collection是集合類的上級接口,繼承于他的接口主要有Set、List
Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序、現(xiàn)成安全化等操作
39.什么時候使用assert?
assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言中都支持這種機(jī)制;在實(shí)現(xiàn)中,assertion就是在程序中的一條語句,它對一個boolean表達(dá)式進(jìn)行檢查,一個正確程序必須保證這個boolean表達(dá)式的值為true;如果該值為false,說明程序已經(jīng)處于不正確的狀態(tài)下,系統(tǒng)將給出警告或退出。一般來說,assertion用于保證程序最基本、關(guān)鍵的正確性。assertion檢查通常在開發(fā)和測試時開啟。為了提高性能,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的
40.String s = new String("xyz");創(chuàng)建了幾個String Object,他們之間有什么區(qū)別?
創(chuàng)建了兩個String Object? 。
這個跟常量池沒有關(guān)系,只要是new,都是重新分配堆空間,如果不區(qū)分棧和堆,這里創(chuàng)建了1個String?Object。
如果是從jvm角度來說的話,它是創(chuàng)建了兩個對象,String?s是在棧里創(chuàng)建了一個變量,new?String("xyz")是在堆里創(chuàng)建了一個對象并被s引用到。
String str = "aaa" + new String("bbb")創(chuàng)建了幾個String對象?
"aa"一個對象; ?new String("bbb") 一個對象;
41.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數(shù)最接近的長整數(shù),參數(shù)加1/2后求其floor
42.short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?
short?s1?=?1;?s1?=?s1?+?1;(s1+1運(yùn)算結(jié)果是int型,需要強(qiáng)制轉(zhuǎn)換類型)short?s1?=?1;?s1?+=?1;(可以正確編譯)
java語言規(guī)范中關(guān)于復(fù)合賦值的解釋是這樣的:E1 op=E2等價于E1=(T)(E1 op E2),這里的T是E1的數(shù)據(jù)類型; 原來這個復(fù)合賦值是自帶了隱式的強(qiáng)制類型轉(zhuǎn)換的
43.java中有g(shù)oto保留字,現(xiàn)在沒有在java中使用
44.數(shù)組和字符串的區(qū)別
(1)數(shù)組沒有l(wèi)ength()這個方法,有l(wèi)ength屬性;String有l(wèi)ength()這個方法