131、j2ee中的應(yīng)用服務(wù)器有哪些?(ACD)
A. Weblogic
B. Tomcat
C. JBoss
D. WebSphere
E. IIS
EJB是sun的服務(wù)器端組件模型,最大的用處是部署分布式應(yīng)用程序當(dāng)然,還有許多方式可以實(shí)現(xiàn)分布式應(yīng)用,類似微軟的.net技術(shù)。
憑借 java 跨平臺(tái)的優(yōu)勢(shì),用EJB 技術(shù)部署的分布式系統(tǒng)可以不限于特定的平臺(tái)。EJB(EnterpriseJavaBean)是J2EE的一部分,定義了一個(gè)用于開發(fā)基于組件的企業(yè)多重應(yīng)用程序的標(biāo)準(zhǔn)。其特點(diǎn)包括網(wǎng)絡(luò)服務(wù)支持和核心開發(fā)工具(SDK)。
在J2EE里,Enterprise Java Beans(EJB)稱為Java企業(yè)Bean,是Java 的核心代碼,分別是會(huì)話 Bean(Session Bean),實(shí)體 Bean(Entity Bean)和消息驅(qū)動(dòng) Bean(MessageDriven Bean)。
簡單來講:比如做一個(gè)工程就和蓋房子,如果,你會(huì) java,那么你就擁有了基本的技能,一步一步累磚,總能把房子蓋好但是EJB就是一個(gè)框架,蓋房子的時(shí)候,先有這個(gè)框架,然后你根據(jù)這個(gè)框架去累磚,房子就會(huì)蓋的又快又好。java是基礎(chǔ),EJB 是在java上發(fā)展出來的模型,框架。
服務(wù)器集群就是指將很多服務(wù)器集中起來一起進(jìn)行同一種服務(wù),在客戶端看來就象是只有一個(gè)服務(wù)器。集群可以利用多個(gè)計(jì)算機(jī)進(jìn)行并行計(jì)算從而獲得很高的計(jì)算速度,也可以用多個(gè)計(jì)算機(jī)做備份,從而使得任何一個(gè)機(jī)器壞了整個(gè)系統(tǒng)還是能正常運(yùn)行。一旦在服務(wù)器上安裝并運(yùn)行了群集服務(wù),該服務(wù)器即可加入群集。群集化操作可以減少單點(diǎn)故障數(shù)量,并且實(shí)現(xiàn)了群集化資源的高可用性。
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
System.out.println("沒有去重前的數(shù)據(jù)為>>>" + list.toString());
for (int i = 0; i < list.size() - 1; i++) {
for (int j = list.size() - 1; j > i; j--) {
if (list.get(j).equals(list.get(i))) {
list.remove(j);
}
}
}
System.out.println("去重后的數(shù)據(jù)為>>>" + list.toString());
}
}
135、利用 java 面向?qū)ο蟮乃悸吩O(shè)計(jì)正方形、長方形、圓的計(jì)算面積的類圓:
class MianJi {
float r;
float pai = (float) 3.14;
void gongShi() {
Float s = pai * r * r;
System.out.println("圓的面積為" + s);
}
void zhengFangXing(float bianChang) {
System.out.println("正方形的面積為" + bianChang * bianChang);
}
void changFangXing(float chang, float kuan) {
System.out.println("長方形的面積為" + chang * kuan);
}
public static void main(String[] arg) {
MianJi c = new MianJi();
System.out.println("請(qǐng)輸入圓的半徑:");
Scanner sc = new Scanner(System.in);
c.r = sc.nextFloat();
c.gongShi();
System.out.println("請(qǐng)輸入正方形的邊長:");
float bian = sc.nextFloat();
c.zhengFangXing(bian);
System.out.println("請(qǐng)輸入長方形的長和寬:");
float chang = sc.nextFloat();
float kuan = sc.nextFloat();
c.changFangXing(chang, kuan);
}
}
136、任何>=6的偶數(shù)都可以分解為兩個(gè)質(zhì)數(shù)之和,從鍵盤輸入一個(gè)偶數(shù),輸出其分解的質(zhì)數(shù)
public class Test {
public static void main(String[] args) {
int num = inPut();
outPut(num);
}
public static int inPut() {
Scanner sc = new Scanner(System.in);
System.out.println("請(qǐng)輸入大于 6 的偶數(shù):");
int num = sc.nextInt();
if (num % 2 != 0 || num <= 6) {
System.out.println("輸入錯(cuò)誤,請(qǐng)重新輸入大于 6 的偶數(shù):");
return inPut();
}
return num;
}
public static boolean isPrim(int num) {
for (int i = 2; i <= Math.sqrt((double) num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
public static void outPut(int num) {
for (int i = 2; i <= num / 2; i++) {
if (isPrim(i) == true && isPrim(num - i) == true) {
System.out.println(i + " " + (num - i));
}
}
}
}
137、什么叫對(duì)象?什么叫類?什么是面向?qū)ο螅∣OP)?
類的概念:類是具有相同屬性和行為的一組對(duì)象的集合。它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說明和服務(wù)說明兩個(gè)主要部分。
對(duì)象的概念:對(duì)象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。從更抽象的角度來說,對(duì)象是問題域或?qū)崿F(xiàn)域中某些事物的一個(gè)抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用;它是一組屬性和有權(quán)對(duì)這些屬性進(jìn)行操作的一組服務(wù)的封裝體。客觀世界是由對(duì)象和對(duì)象之間的聯(lián)系組成的。
類與對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類對(duì)象的抽象就是類。類描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象。
上面大概就是它們的定義吧,也許你是剛接觸面象對(duì)象的朋友,不要被概念的東西搞暈了, 給你舉個(gè)列子吧,如果你去中關(guān)村想買幾臺(tái)組裝的PC機(jī),到了那里你第一步要干什么,是不是裝機(jī)的工程師和你坐在一起,按你提供的信息和你一起完成一個(gè)裝機(jī)的配置單呀,這個(gè)配置單就可以想像成是類,它就是一張紙,但是它上面記錄了你要買的PC機(jī)的信息,如果用這個(gè)配置單買10臺(tái)機(jī)器,那么這10臺(tái)機(jī)子,都是按這個(gè)配置單組成的,所以說這10臺(tái)機(jī)子是一個(gè)類型的,也可以說是一類的。那么什么是對(duì)象呢,類的實(shí)例化結(jié)果就是對(duì)象,用這個(gè)配置單配置出來(實(shí)例化出來)的機(jī)子就是對(duì)象,是我們可以操作的實(shí)體,10 臺(tái)機(jī)子,10 個(gè)對(duì)象。每臺(tái)機(jī)子都是獨(dú)立的,只能說明他們是同一類的,對(duì)其中一個(gè)機(jī)(對(duì)象)做任何動(dòng)作都不會(huì)影響其它9臺(tái)機(jī)器,但是我對(duì)類修改,也就是在這個(gè)配置單上加一個(gè)或少一個(gè)配件,那么裝出來的9個(gè)機(jī)子都改變了,這是類和對(duì)象的關(guān)系(類的實(shí)例化結(jié)果就是對(duì)象)
● 修飾類
當(dāng)用final修飾一個(gè)類時(shí),表明這個(gè)類不能被繼承。也就是說,如果一個(gè)類你永遠(yuǎn)不會(huì)讓他被繼承,就可以用final進(jìn)行修飾。final類中的成員變量可以根據(jù)需要設(shè)為final,但是要注意 final 類中的所有成員方法都會(huì)被隱式地指定為final 方法。在使用 final 修飾類的時(shí)候,要注意謹(jǐn)慎選擇,除非這個(gè)類真的在以后不會(huì)用來繼承或者出于安全的考慮,盡量不要將類設(shè)計(jì)為 final類。
● 修飾方法
被final修飾的方法將不能被子類覆蓋,主要用于:
把方法鎖定,以防任何繼承類修改它的含義。
在早期的Java實(shí)現(xiàn)版本中,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用,所以效率能夠提升。
● 修飾變量
對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。當(dāng)用 final 作用于類的成員變量時(shí),成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時(shí)或者構(gòu)造器中進(jìn)行初始化賦值,而且final變量一旦被初始化賦值之后,就不能再被賦值了。
● java.lang.*
提供利用Java編程語言進(jìn)行程序設(shè)計(jì)的基礎(chǔ)類。最重要的類是Object(它是類層次結(jié)構(gòu)的根)和Class(它的實(shí)例表示正在運(yùn)行的應(yīng)用程序中的類)。
● java.util.*
包含集合框架、遺留的Collection類、事件模型、日期和時(shí)間設(shè)施、國際化和各種實(shí)用工具類(字符串標(biāo)記生成器、隨機(jī)數(shù)生成器和位數(shù)組、日期 Date 類、堆棧 Stack 類、向量 Vector 類等)。集合類、時(shí)間處理模式、日期時(shí)間工具等各類常用工具包。
● java.io.*
Java 的核心庫java.io提供了全面的IO接口。包括:文件讀寫、標(biāo)準(zhǔn)設(shè)備輸出等。Java 中 IO是以流為基礎(chǔ)進(jìn)行輸入輸出的,所有數(shù)據(jù)被串行化寫入輸出流,或者從輸入流讀入。
● java.net.*
并非所有系統(tǒng)都支持 IPv6 協(xié)議,而當(dāng) Java 網(wǎng)絡(luò)連接堆棧嘗試檢測(cè)它并在可用時(shí)透明地使用它時(shí),還可以利用系統(tǒng)屬性禁用它。在IPv6不可用或被顯式禁用的情況下,Inet6Address 對(duì)大多數(shù)網(wǎng)絡(luò)連接操作都不再是有效參數(shù)。雖然可以保證在查找主機(jī)名時(shí) java.net.InetAddress.getByName之類的方法不返回Inet6Address,但仍然可能通過傳遞字面值來創(chuàng)建此類對(duì)象。在此情況下,大多數(shù)方法在使用 Inet6Address 調(diào)用時(shí)都將拋出異常。
● java.sql.*
提供使用JavaTM編程語言訪問并處理存儲(chǔ)在數(shù)據(jù)源(通常是一個(gè)關(guān)系數(shù)據(jù)庫)中的數(shù)據(jù)的API。此API包括一個(gè)框架,憑借此框架可以動(dòng)態(tài)地安裝不同驅(qū)動(dòng)程序來訪問不同數(shù)據(jù)源。
重載需要滿足的條件:在同一類中定義的方法,方法名必須相同,參數(shù)一定不同。
發(fā)生覆蓋的條件:“三同一不低”,子類和父類的方法名稱,參數(shù)列表,返回類型必須完全相同,而且子類方法的訪問修飾符的權(quán)限不能比父類低。子類方法不能拋出比父類方法更多的異常。即子類方法所拋出的異常必須和父類方法所拋出的異常一致,或者是其子類,或者什么也不拋出;被覆蓋的方法不能是final類型的。因?yàn)閒inal修飾的方法是無法覆蓋的。被覆蓋的方法不能為private。否則在其子類中只是新定義了一個(gè)方法,并沒有對(duì)其進(jìn)行覆蓋。被覆蓋的方法不能為static。所以如果父類中的方法為靜態(tài)的,而子類中的方法不是靜態(tài)的,但是兩個(gè)方法除了這一點(diǎn)外其他都滿足覆蓋條件,那么會(huì)發(fā)生編譯錯(cuò)誤。反之亦然。即使父類和子類中的方法都是靜態(tài)的,并且滿足覆蓋條件,但是仍然不會(huì)發(fā)生覆蓋,因?yàn)殪o態(tài)方法是在編譯的時(shí)候把靜態(tài)方法和類的引用類型進(jìn)行匹配。
重寫規(guī)則:重寫方法不能比被重寫方法限制有更嚴(yán)格的訪問級(jí)別。(但是可以更廣泛,比如父類方法是包訪問權(quán)限,子類的重寫方法是public訪問權(quán)限)。比如:Object類有個(gè)toString()方法,開始重寫這個(gè)方法的時(shí)候我們總?cè)菀淄沺ublic修飾符,編譯器當(dāng)然不會(huì)放過任何教訓(xùn)我們的機(jī)會(huì)。出錯(cuò)的原因就是:沒有加任何訪問修飾符的方法具有包訪問權(quán)限,包訪問權(quán)限比 public當(dāng)然要嚴(yán)格了,所以編譯器會(huì)報(bào)錯(cuò)的。參數(shù)列表必須與被重寫方法相同。重寫有個(gè)孿生的弟弟叫重載,也就是后面要出場(chǎng)的。如果子類方法的參數(shù)與父類對(duì)應(yīng)的方法不同,那么就是你認(rèn)錯(cuò)人了,那是重載,不是重寫。返回類型必須與被重寫方法的返回類型相同。
父類方法A:void eat(){}子類方法B:int eat(){}兩者雖然參數(shù)相同,可是返回類型不同,所以不是重寫。
父類方法A:int eat(){} 子類方法 B:long eat(){} 返回類型雖然兼容父類,但是不同就是不同,所以不是重寫。???????