第一篇:JAVA程序員必需搞懂的問題
JAVA程序員必需搞懂的問題(建議管理員置頂)
1.簡單類型是按值傳遞的Java 方法的參數是簡單類型的時候,是按值傳遞的(pass by value)。這一點我們可以通過一個簡單的例子來說明:
/* 例 1 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void test(boolean test){
test =!test;
System.out.println(“In test(boolean): test = ” + test);
}
public static void main(String[] args){
boolean test = true;
System.out.println(“Before test(boolean): test = ” + test);
test(test);
System.out.println(“After test(boolean): test = ” + test);
}
}
運行結果:
Before test(boolean): test = true
In test(boolean): test = false
After test(boolean): test = true
不難看出,雖然在 test(boolean)方法中改變了傳進來的參數的值,但對這個參數源變量本身并沒有影響,即對 main(String[])方法里的 test 變量沒有影響。那說明,參數類型是簡單類型的時候,是按值傳遞的。以參數形式傳遞簡單類型的變量時,實際上是將參數的值作了一個拷貝傳進方法函數的,那么 在方法函數里再怎么改變其值,其結果都是只改變了拷貝的值,而不是源值。
2.什么是引用
Java 是傳值還是傳引用,問題主要出在對象的傳遞上,因為 Java 中簡單類型沒有引用。既然爭論中提到了引用這個東西,為了搞清楚這個問題,我們必須要知道引用是什么。簡單的說,引用其實就像是一個對象的名字或者別名(alias),一個對象在內存中會請求一塊空間來保存數據,根據對象的大小,它可能需要占用的空間大小也不等。訪問對象的時候,我們不會直接是訪問對象 在內存中的數據,而是通過引用去訪問。引用也是一種數據類型,我們可以把它想象為類似 C 語言中指針的東西,它指示了對象在內存中的地址——只不過我們不能夠觀察到這個地址究竟是什么。
如果我們定義了不止一個引用指向同一個對象,那么這些引用是不相同的,因為引用也是一種數據類型,需要一定的內存空間來保存。但是它們的值是相同的,都指示同一個對象在內存的中位置。比如
String a = “Hello”;
String b = a;
這里,a 和 b 是不同的兩個引用,我們使用了兩個定義語句來定義它們。但它們的值是一樣的,都指向同一個對象 “Hello”。也許你還覺得不夠直觀,因為 String 對象的值本身是不可更改的(像 b = “World”;b = a;這種情況不是改變了 “World” 這一對象的值,而是改變了它的引用 b 的值使之指向了另一個 String 對象 a)。那么我們用 StringBuffer 來舉一個例子:
/* 例 2 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void main(String[] args){
StringBuffer a = new StringBuffer(“Hello”);
StringBuffer b = a;
b.append(“, World”);
System.out.println(“a is ” + a);
}
}
運行結果:
a is Hello, World
這個例子中 a 和 b 都是引用,當改變了 b 指示的對象的值的時候,從輸出結果來看,a 所指示的對象的值也改變了。所以,a 和 b 都指向同一個對象即包含 “Hello” 的一個 StringBuffer 對象。
這里我描述了兩個要點:
引用是一種數據類型,保存了對象在內存中的地址,這種類型即不是我們平時所說的簡單數據類型也不是類實例(對象);
不同的引用可能指向同一個對象,換句話說,一個對象可以有多個引用,即該類類型的變量。
3.對象是如何傳遞的呢
關于對象的傳遞,有兩種說法,即“它是按值傳遞的”和“它是按引用傳遞的”。這兩種說法各有各的道理,但是它們都沒有從本質上去分析,即致于產生了爭論。
既然現在我們已經知道了引用是什么東西,那么現在不妨來分析一下對象作是參數是如何傳遞的。還是先以一個程序為例:
/* 例 3 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void test(StringBuffer str){
str.append(“, World!”);
}
public static void main(String[] args){
StringBuffer string = new StringBuffer(“Hello”);
test(string);
System.out.println(string);
}
}
運行結果:
Hello, World!
test(string)調用了 test(StringBuffer)方法,并將 string 作為參數傳遞了進去。這里 string 是一個引用,這一點是勿庸置疑的。前面提到,引用是一種數據類型,而且不是對象,所以它不可能按引用傳遞,所以它是按值傳遞的,它么它的值究竟是什么呢? 是對象的地址。
由此可見,對象作為參數的時候是按值傳遞的,對嗎?錯!為什么錯,讓我們看另一個例子:
/* 例 4 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void test(String str){
str = “World”;
}
public static void main(String[] args){
String string = “Hello”;
test(string);
System.out.println(string);
}
}
運行結果:
Hello
為什么會這樣呢?因為參數 str 是一個引用,而且它與 string 是不同的引用,雖然它們都是同一個對象的引用。str = “World” 則改變了 str 的值,使之指向了另一個對象,然而 str 指向的對象改變了,但它并沒有對 “Hello” 造成任何影響,而且由于 string 和 str 是不同的引用,str 的改變也沒有對 string 造成任何影響,結果就如例中所示。
其結果是推翻了參數按值傳遞的說法。那么,對象作為參數的時候是按引用傳遞的了?也錯!因為上一個例子的確能夠說明它是按值傳遞的。
結果,就像光到底是波還是粒子的問題一樣,Java 方法的參數是按什么傳遞的問題,其答案就只能是:即是按值傳遞也是按引用傳遞,只是參照物不同,結果也就不同。
4.正確看待傳值還是傳引用的問題
要正確的看待這個問題必須要搞清楚為什么會有這樣一個問題。
實際上,問題來源于 C,而不是 Java。
C 語言中有一種數據類型叫做指針,于是將一個數據作為參數傳遞給某個函數的時候,就有兩種方式:傳值,或是傳指針,它們的區(qū)別,可以用一個簡單的例子說明:
/* 例 5 */
/**
* @(#)test.c
* @author fancy
*/
void Swapvalue(int a, int b){
int t = a;
a = b;
b = t;
}
void SwapPointer(int * a, int * b){
int t = * a;
* a = * b;
* b = t;
}
void main(){
int a = 0, b = 1;
printf(“1 : a = %d, b = %dn”, a, b);
Swapvalue(a, b);
printf(“2 : a = %d, b = %dn”, a, b);
SwapPointer(&a, &b);
printf(“3 : a = %d, b = %dn”, a, b);
}
運行結果:: a = 0, b = 1: a = 0, b = 1: a = 1, b = 0
大家可以明顯的看到,按指針傳遞參數可以方便的修改通過參數傳遞進來的值,而按值傳遞就不行。
當 Java 成長起來的時候,許多的 C 程序員開始轉向學習Java,他們發(fā)現,使用類似 Swapvalue 的方法仍然不能改變通過參數傳遞進來的簡單數據類型的值,但是如果是一個對象,則可能將其成員隨意更改。于是他們覺得這很像是 C 語言中傳值/傳指針的問題。但是 Java 中沒有指針,那么這個問題就演變成了傳值/傳引用的問題??上⑦@個問題放在 Java 中進行討論并不恰當。
討論這樣一個問題的最終目的只是為了搞清楚何種情況才能在方法函數中方便的更改參數的值并使之長期有效。
Java 中,改變參數的值有兩種情況,第一種,使用賦值號“=”直接進行賦值使其改變,如例 1 和例 4;第二種,對于某些對象的引用,通過一定途徑對其成員數據進行改變,如例 3。對于第一種情況,其改變不會影響到方法該方法以外的數據,或者直接說源數據。而第二種方法,則相反,會影響到源數據——因為引用指示的對象沒有變,對 其成員數據進行改變則實質上是改變的該對象。
5.如何實現類似 swap 的方法
傳值還是傳引用的問題,到此已經算是解決了,但是我們仍然不能解決這樣一個問題:如果我有兩個 int 型的變量 a 和 b,我想寫一個方法來交換它們的值,應該怎么辦?結論很讓人失望——沒有辦法!因此,我們只能具體情況具體討論,以經常使用交換方法的排序為例:
/** 例 6 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void swap(int[] data, int a, int b){
int t = data[a];
data[a] = data;
data = t;
}
public static void main(String[] args){
int[] data = new int[10];
for(int i = 0;i < 10;i++){
data =(int)(Math.random()* 100);
System.out.print(“ ” + data);
}
System.out.println();
for(int i = 0;i < 9;i++){
for(int j = i;j < 10;j++){
if(data > data[j]){
swap(data, i, j);
}
}
}
for(int i = 0;i < 10;i++){
System.out.print(“ ” + data);
}
System.out.println();
}
}
運行結果(情況之一):
69 94 38 95 31 50 97 84 131 38 50 69 78 84 94 95 97
swap(int[] data, int a, int b)方法在內部實際上是改變了 data 所指示的對象的成員數據,即上述討論的第二種改變參數值的方法。希望大家能夠舉一反三,使用類似的方法來解決相關問題。
第二篇:JAVA程序員必需搞懂的問題
1.簡單類型是按值傳遞的Java 方法的參數是簡單類型的時候,是按值傳遞的(pass by value)。這一點我們可以通過一個簡單的例子來說明:
/* 例 1 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void test(boolean test){
test =!test;
System.out.println(“In test(boolean): test = ” + test);
}
public static void main(String[] args){
boolean test = true;
System.out.println(“Before test(boolean): test = ” + test);
test(test);
System.out.println(“After test(boolean): test = ” + test);
}
}
運行結果:
Before test(boolean): test = true
In test(boolean): test = false
After test(boolean): test = true
不難看出,雖然在 test(boolean)方法中改變了傳進來的參數的值,但對這個參數源變量本身并沒有影響,即對 main(String[])方法里的 test 變量沒有影響。那說明,參數類型是簡單類型的時候,是按值傳遞的。以參數形式傳遞簡單類型的變量時,實際上是將參數的值作了一個拷貝傳進方法函數的,那么在方法函數里再怎么改變其值,其結果都是只改變了拷貝的值,而不是源值。
2.什么是引用
Java 是傳值還是傳引用,問題主要出在對象的傳遞上,因為 Java 中簡單類型沒有引用。既然爭論中提到了引用這個東西,為了搞清楚這個問題,我們必須要知道引用是什么。簡單的說,引用其實就像是一個對象的名字或者別名(alias),一個對象在內存中會請求一塊空間來保存數據,根據對象的大小,它可能需要占用的空間大小也不等。訪問對象的時候,我們不會直接是訪問對象在內存中的數據,而是通過引用去訪問。引用也是一種數據類型,我們可以把它想象為類似 C 語言中指針的東西,它指示了對象在內存中的地址——只
不過我們不能夠觀察到這個地址究竟是什么。
如果我們定義了不止一個引用指向同一個對象,那么這些引用是不相同的,因為引用也是一種數據類型,需要一定的內存空間來保存。但是它們的值是相同的,都指示同一個對象在內存的中位置。比如
String a = “Hello”;
String b = a;
這里,a 和 b 是不同的兩個引用,我們使用了兩個定義語句來定義它們。但它們的值是一樣的,都指向同一個對象 “Hello”。也許你還覺得不夠直觀,因為 String 對象的值本身是不可更改的(像 b = “World”;b = a;這種情況不是改變了 “World” 這一對象的值,而是改變了它的引用 b 的值使之指向了另一個 String 對象 a)。那么我們用 StringBuffer 來舉一個例子:
/* 例 2 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void main(String[] args){
StringBuffer a = new StringBuffer(“Hello”);
StringBuffer b = a;
b.append(“, World”);
System.out.println(“a is ” + a);
}
}
運行結果:
a is Hello, World
這個例子中 a 和 b 都是引用,當改變了 b 指示的對象的值的時候,從輸出結果來看,a 所指示的對象的值也改變了。所以,a 和 b 都指向同一個對象即包含 “Hello” 的一個 StringBuffer 對象。
這里我描述了兩個要點:
引用是一種數據類型,保存了對象在內存中的地址,這種類型即不是我們平時所說的簡單數據類型也不是類實例(對象);
不同的引用可能指向同一個對象,換句話說,一個對象可以有多個引用,即該類類型的變量。
3.對象是如何傳遞的呢
關于對象的傳遞,有兩種說法,即“它是按值傳遞的”和“它是按引用傳遞的”。這兩種說法各有各的道理,但是它們都沒有從本質上去分析,即致于產生了爭論。
既然現在我們已經知道了引用是什么東西,那么現在不妨來分析一下對象作是參數是如何傳遞的。還是先以一個程序為例:
/* 例 3 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void test(StringBuffer str){
str.append(“, World!”);
}
public static void main(String[] args){
StringBuffer string = new StringBuffer(“Hello”);
test(string);
System.out.println(string);
}
}
運行結果:
Hello, World!
test(string)調用了 test(StringBuffer)方法,并將 string 作為參數傳遞了進去。這里 string 是一個引用,這一點是勿庸置疑的。前面提到,引用是一種數據類型,而且不是對象,所以它不可能按引用傳遞,所以它是按值傳遞的,它么它的值究竟是什么呢?是對象的地址。由此可見,對象作為參數的時候是按值傳遞的,對嗎?錯!為什么錯,讓我們看另一個例子:
/* 例 4 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void test(String str){
str = “World”;
}
public static void main(String[] args){
String string = “Hello”;
test(string);
System.out.println(string);
}
}
運行結果:
Hello
為什么會這樣呢?因為參數 str 是一個引用,而且它與 string 是不同的引用,雖然它們都是同一個對象的引用。str = “World” 則改變了 str 的值,使之指向了另一個對象,然而 str 指向的對象改變了,但它并沒有對 “Hello” 造成任何影響,而且由于 string 和 str 是不同的引用,str 的改變也沒有對 string 造成任何影響,結果就如例中所示。
其結果是推翻了參數按值傳遞的說法。那么,對象作為參數的時候是按引用傳遞的了?也錯!因為上一個例子的確能夠說明它是按值傳遞的。
結果,就像光到底是波還是粒子的問題一樣,Java 方法的參數是按什么傳遞的問題,其答案就只能是:即是按值傳遞也是按引用傳遞,只是參照物不同,結果也就不同。
4.正確看待傳值還是傳引用的問題
要正確的看待這個問題必須要搞清楚為什么會有這樣一個問題。
實際上,問題來源于 C,而不是 Java。
C 語言中有一種數據類型叫做指針,于是將一個數據作為參數傳遞給某個函數的時候,就有兩種方式:傳值,或是傳指針,它們的區(qū)別,可以用一個簡單的例子說明: /* 例 5 */
/**
* @(#)test.c
* @author fancy
*/
void Swapvalue(int a, int b){
int t = a;
a = b;
b = t;
}
void SwapPointer(int * a, int * b){
int t = * a;
* a = * b;
* b = t;
}
void main(){
int a = 0, b = 1;
printf(“1 : a = %d, b = %dn”, a, b);
Swapvalue(a, b);
printf(“2 : a = %d, b = %dn”, a, b);
SwapPointer(&a, &b);
printf(“3 : a = %d, b = %dn”, a, b);
}
運行結果:: a = 0, b = 1: a = 0, b = 1: a = 1, b = 0
大家可以明顯的看到,按指針傳遞參數可以方便的修改通過參數傳遞進來的值,而按值傳遞就不行。
當 Java 成長起來的時候,許多的 C 程序員開始轉向學習Java,他們發(fā)現,使用類似 Swapvalue 的方法仍然不能改變通過參數傳遞進來的簡單數據類型的值,但是如果是一個對象,則可能將其成員隨意更改。于是他們覺得這很像是 C 語言中傳值/傳指針的問題。但是 Java 中沒有指針,那么這個問題就演變成了傳值/傳引用的問題??上⑦@個問題放在 Java 中進行討論并不恰當。
討論這樣一個問題的最終目的只是為了搞清楚何種情況才能在方法函數中方便的更改參數的值并使之長期有效。
Java 中,改變參數的值有兩種情況,第一種,使用賦值號“=”直接進行賦值使其改變,如例 1 和例 4;第二種,對于某些對象的引用,通過一定途徑對其成員數據進行改變,如例 3。對于第一種情況,其改變不會影響到方法該方法以外的數據,或者直接說源數據。而第二種方法,則相反,會影響到源數據——因為引用指示的對象沒有變,對其成員數據進行改變則實質上是改變的該對象。
5.如何實現類似 swap 的方法
傳值還是傳引用的問題,到此已經算是解決了,但是我們仍然不能解決這樣一個問題:如果我有兩個 int 型的變量 a 和 b,我想寫一個方法來交換它們的值,應該怎么辦?結論很讓人失望——沒有辦法!因此,我們只能具體情況具體討論,以經常使用交換方法的排序為例:
/** 例 6 */
/**
* @(#)Test.java
* @author fancy
*/
public class Test {
public static void swap(int[] data, int a, int b){
int t = data[a];
data[a] = data;
data = t;
}
public static void main(String[] args){int[] data = new int[10];
for(int i = 0;i < 10;i++){
data =(int)(Math.random()* 100);System.out.print(“ ” + data);}
System.out.println();
for(int i = 0;i < 9;i++){
for(int j = i;j < 10;j++){if(data > data[j]){
swap(data, i, j);
}
}
}
for(int i = 0;i < 10;i++){
System.out.print(“ ” + data);}
System.out.println();
}
}
運行結果(情況之一):
69 94 38 95 31 50 97 84 131 38 50 69 78 84 94 95 97
第三篇:java程序員
如何迅速成為Java高手[Tomjava原創(chuàng)]
很多網友問我學習Java有沒有什么捷徑,我說“無他,唯手熟爾”。但是我卻很愿意將自己學習的一些經驗寫出來,以便后來者少走彎路,幫助別人是最大的快樂嘛!
要想學好Java,首先要知道Java的大致分類。我們知道,自從Sun推出Java以來,就力圖使之無所不包,所以Java發(fā)展到現在,按應用來分主要分為三大塊:J2SE,J2ME和J2EE,這也就是Sun ONE(Open Net Environment)體系。J2SE就是Java2的標準版,主要用于桌面應用軟件的編程;J2ME主要應用于嵌入是系統(tǒng)開發(fā),如手機和PDA的編程;J2EE是Java2的企業(yè)版,主要用于分布式的網絡程序的開發(fā),如電子商務網站和ERP系統(tǒng)。J2SE開發(fā)桌面應用軟件比起VC,VB,DEPHI這些傳統(tǒng)開發(fā)語言來說,優(yōu)勢好象并不明顯。J2ME對于初學者來說,好象又有點深奧,而且一般開發(fā)者很難有開發(fā)環(huán)境。所以現在應用最廣泛又最好學的就是J2EE了。J2EE又包括許多組件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要學習起來可不是一兩天的事。
那么又該如何學習J2EE呢?當然Java語法得先看一看的,I/O包,Util包,Lang包你都熟悉了嗎?然后再從JSP學起。如果你學過HTML,那么事情要好辦的多,如果沒有,那你快去補一補HTML基礎吧。其實JSP中的Java語法也不多,它更象一個腳本語言,有點象ASP。然后你就該學一學Servlet了。Servlet就是服務器端小程序,他負責生成發(fā)送給客戶端的HTML文件。JSP在執(zhí)行時,也是先轉換成Servlet再運行的。雖說JSP理論上可以完全取代Servlet,這也是SUN推出JSP的本意,可是Servlet用來控制流程跳轉還是挺方便的,也令程序更清晰。接下來你應該學習一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代碼的混亂方式了,這種方式跟ASP又有什么區(qū)別呢?還好,SUN提供了Javabean可以把你的JSP中的Java代碼封裝起來,便于調用也便于重用。接著就是EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean還是有區(qū)別的。它是一個體系結構,你可以搭建更安全、更穩(wěn)定的企業(yè)應用。它的大量代碼已由中間件(也就是我們常聽到的Weblogic,Websphere這些J2EE服務器)完成了,所以我們要做的程序代碼量很少,大部分工作都在設計和配置中間件上。至于JDBC,就不用我多說了,你如果用java編過存取數據庫的程序,就應該很熟悉。還有,如果你要用Java編發(fā)送電子郵件的程序,你就得看看Javamail了。
好了,對Java和J2EE有了一些基本概念之后,你就應該編一些程序了,千萬不要紙上談兵哦。最好找一些有實例且?guī)Ч獗P的書來看,這樣看到好的程序就可以直接Ctrl+C再Ctrl+V,也不用勞您老大架再親自把它再輸一遍吧,再說直接復制還不用怕出錯,何樂而不為呢!還有就是要經常上一些好的Java編程文章,有好的文章要Cut下來,有問題盡管問,只要問題不是太傻,一般高手都會回答你的。下面介紹幾個好的Java方面的編程網站:
CSDN論壇 http:///那里Java資料比較全;
java.com.cnhttp://.cn/看這域名就知道有多牛,注冊用戶快接近一萬了,同時在線人數也在一千左右,人氣很旺的;
IBM的開發(fā)者網絡http://IBM永遠的藍色巨人;
那么我書也看了,程序也做了,別人問我的問題我都能解決了,是不是就成為高手了呢?當然沒那么簡單,這只是萬里長征走完了第一步。不信?那你出去接一個項目,你知道怎么下手嗎,你知道怎么設計嗎,你知道怎么組織人員進行開發(fā)嗎?你現在腦子里除了一些散亂的代碼之外,可能再沒有別的東西了吧!你現在最缺的是實際的工作經驗,而不是書本上那些
憑空想出來的程序。所以你快去找一份Java的編程工作來做吧(如果是在校學生可以去做兼職?。?,在實踐中提高自己,那才是最快的。不過你得祈禱在公司里碰到一個高手,而且他還愿意不厭其煩地教你,這樣好象有點難哦!
還有一個辦法就是讀開放源碼的程序了。我們知道開放源碼大都出自高手,他們設計合理,考慮周到,再加上有廣大的程序員參與,代碼的價值自然是字字珠嘰,鏗鏘有力(對不起,偶最近《金裝四大才子》看多了)。學Java必讀的兩個開源程序就是Jive和Pet Store.。Jive是國外一個非常著名的BBS程序,完全開放源碼。論壇的設計采用了很多先進的技術,如Cache、用戶認證、Filter、XML等,而且論壇完全屏蔽了對數據庫的訪問,可以很輕易的在不同數據庫中移植。論壇還有方便的安裝和管理程序,這是我們平時編程時容易忽略的一部份(中國程序員一般只注重編程的技術含量,卻完全不考慮用戶的感受,這就是我們與國外軟件的差距所在)。Jive的資料在很多網站上都有,大家可以找來研究一下。相信你讀完代碼后,會有脫胎換骨的感覺。遺憾的是Jive從2.5以后就不再無條件的開放源代碼,同時有l(wèi)icence限制。不過幸好還有中國一流的Java程序員關注它,外國人不開源了,中國人就不能開源嗎?這里向大家推薦一個漢化的Jive版本—J道。Jive(J道版)是由中國Java界大名鼎鼎的banq在Jive 2.1版本基礎上改編而成, 全中文,增加了一些實用功能,如貼圖,用戶頭像和用戶資料查詢等,而且有一個開發(fā)團隊在不斷升級。你可以訪問banq的網站http:///去下載,或到同濟技術論壇的服務器上ftp://nro.shtdu.edu.cn去下,安裝上有什么問題,可以到論壇上去提問。Pet Store.(寵物店)是SUN公司為了演示其J2EE編程規(guī)范而推出的開放源碼的程序,應該很具有權威性,想學J2EE和EJB的朋友不要錯過了。
你一定會高興地說,哈哈,原來成為Java高手就這么簡單啊!記得Tomjava也曾碰到過一個項目經理,號稱Java很簡單,只要三個月就可以學會。其實說這種話的人就如當年小日本號稱“三個月拿下中國”一樣大言不慚。不是Tomjava潑你冷水,你現在只是學到了Java的骨架,卻還沒有學到Java的精髓。接下來你得研究設計模式了。設計模式是高級程序員真正掌握面向對象核心思想的必修課。設計模式并不是一種具體“技術”,它講述的是思想,它不僅僅展示了接口或抽象類在實際案例中的靈活應用和智慧,讓你能夠真正掌握接口或抽象類的應用,從而在原來的Java語言基礎上躍進一步,更重要的是,設計模式反復向你強調一個宗旨:要讓你的程序盡可能的可重用。關于設計模式的資料,還是向大家推薦banq的網站http:///,他把GOF的23種模式以通俗易懂的方式詮釋出來,純Java描述,真是經典中的經典。有時間再研究一下MVC結構(把Model-View-Control分離開的設計思想)吧,現在很流行的Structs就是它的一種實現方式,不過Structs用起來實在是很繁,我們只要學習其精髓即可,我們完全可以設計自己的MVC結構。然后你再研究一下軟件Refactoring(重整)和極限XP編程,相信你又會上一個臺階。
做完這些,你不如整理一下你的Java代碼,把那些經典的程序和常見的應用整理出來,再精心打造一番,提高其重用性和可擴展性。你再找?guī)讉€志同道合的朋友成立一個工作室吧,你可以去承接一些項目做了,一開始可能有些困難,可是你有技術積累,又考慮周全,接下項目來可以迅速作完,相信大家以后都會來找你的,所以Money就嘩啦啦的來了。。。當然你也可以參加一些開源項目,一方面可以提高自己,另一方面也是為中國軟件事業(yè)做貢獻嘛!開發(fā)者在互聯(lián)網上用CVS合作開發(fā),用QQ,MSN,E-mail討論聯(lián)系,天南海北的程序員分散在各地卻同時開發(fā)同一個軟件,是不是很有意思呢?
下面介紹兩個好的開源項目網站:
湖北省軟件公共開發(fā)平臺http://gro.clinux.org/
共創(chuàng)聯(lián)盟http://cosoft.org.cn/
哇,好高興哦,我終于成為高手了!非也,非也。古人云:“識時務者為俊杰”。你知道計算
機界現在的發(fā)展形勢嗎?你知道微軟的.NET藍圖和SUN ONE計劃之間的明爭暗斗嗎?你知道計算機技術將向何處發(fā)展嗎?其實從各大計算機廠商最近的動作,都可以看出來“Web服務將是下一代互聯(lián)網應用的制高點”,而微軟的.NET藍圖和SUN ONE計劃的斗爭焦點,也就是Web服務。Web服務就是一個嶄新的分布式計算模型,它是一系列標準的綜合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同語言編寫的軟件能夠輕易的集成起來,使網絡資源和Web站點變成一種服務而不是混亂的垃圾場。不遠的將來,我們就可以在家里點擊一下鼠標,就可以完成出門旅游的全部準備工作,包括定飛機票,定旅游線路,定好房間等。請注意,這所有的一切都是Web站點間自動完成的,再也不用象現在一樣,表面上是電子商務,實際上很多環(huán)節(jié)都是人工操作。也許你會覺得這是天方夜談,不過就近的說,你也很有可能承接一個項目,要集成兩個企業(yè)的ERP系統(tǒng)。很有可能上游企業(yè)的系統(tǒng)是用Dephi編的,而下游企業(yè)的系統(tǒng)是用Java編的。你說你是Java高手,大家都看者你怎么做呢。所以啊,你還得學習新技術,如Web服務,而且你Dephi也要懂一點吧(Dephi6現在已經提供Web服務的控件了)。你編的Java系統(tǒng),可能要和.NET集成,所以你.NET要懂一點吧?到最后,你可能發(fā)現你已經成為Java高手了,但很多時間卻在搞別的技術。太極張三豐里說,最厲害的招式就是沒有招式,可能就是這個道理吧!
因為剛剛興起,所以網上Web服務的資料不是很多,我還是給大家推薦幾個網站吧: 中國UDDI技術聯(lián)盟http:///developerWorks/cn/xml/index.shtml?csdnIBM可是Web服務的力推者
嗚?你費勁千心萬苦,總算成為Java高手了,怎叫人不由喜極而泣呢!是啊,真不容易,真不簡單,真叫人感動??!那么打個電話告訴我吧,什么?我的電話號碼是多少?昏到,你打電話問不就知道了嗎,真是的??
第四篇:java程序員面試題
1、你怎樣理解Struts,又那些配置文件,以及作用? 理解:http://ruixin.iteye.com/blog/899289 配置文件:struts.xml 作用:struts 框架mvc 實現低耦合,便于程序的維護~ 配置文件控制流程的轉向 很清晰~ 主要負責具體業(yè)務的實現和頁面的轉向~
2、怎么樣來捕獲數據庫中的異常?
3、如何處理網頁中的驗證信息,如何友好的進行處理?
4、用javaScript實現java中的監(jiān)聽器功能?
5、你對對日外包的看法?
6、數據庫連接方式由哪幾種?
Jdbc、連接池、hibernate
7、你清楚哪幾種設計模式,談談各種設計模式的類結構。
8、談談jsp和sevlet的區(qū)別,以及它們性能上的區(qū)別。
jsp是servlet的一種簡化,jsp編譯后是“類servlet”。servlet 主要是用來處理業(yè)務層;
jsp 則是主要負責 表現層。
servlet完全是java程序代碼構成,擅長于流程控制和事務處理,而通過servlet來生成動態(tài)網頁很不直觀; 對于靜態(tài)的html標簽,servlet都必須使用頁面輸出流逐行輸出。Servlet中沒有內置對象。Jsp由html代碼和jsp標簽構成可以方便地編寫動態(tài)網頁,在struts框架中,jsp位于MVC設計模式的視圖層,而servlet位于控制層。
總之,使用jsp只需要完成程序員需要輸出到客戶端的內容,至于jsp中的java腳本如果鑲嵌到一個類中,由jsp容器完成,而servlet則是個完整的java類,這個類的service方法用于生成對客戶端的響應
9、如何來編寫存儲過程,如何優(yōu)化存儲過程,以及存儲過程和TSQL的區(qū)別。
10、提供的培訓,CMM-5軟件開發(fā)流程培訓、代碼編寫規(guī)范和業(yè)務流程培訓、對日語的培訓。
1、為什么要選擇這個行業(yè),和計算機專業(yè)的相比有什么優(yōu)勢?
2、Servlet是什么,以及生命周期?
Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。
與cgi的區(qū)別在于servlet處于服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成后就銷毀,所以效率上低于servlet。
3、怎么理解事務?
4、怎么理解MVC?
自己做自己的事情,主要強調分層,5、同時插入大量數據,使用何種方法優(yōu)化?Batch
6、多個有關系得怎么樣操作?
7、你認為你還有什么優(yōu)點在前面沒有提到?
8、對加班的看法?
9、與上級意見不一致時怎么樣處理?10、11、12、13、14、15、16、17、18、19、20、21、22、23、你如何理解團隊精神?
你怎樣處理學習新技術和項目開發(fā)之間的矛盾? 怎樣去學習新技術?
作為一個初級程序員怎么樣彌補與有經驗程序員之間的差距? 你對索引的理解,索引有幾種,什么時候用索引? 對Oracle理解?
怎樣優(yōu)化復雜的查詢語句? 你對Jdbc理解?
對Finally塊的理解和應用? 游標的理解? ResultSet 重載,重寫? 簽名
EJB的事務,Hibernate的事務? Struts的標簽? 重定向和跳轉? A、
a.地址欄不改變跳轉——服務器端跳轉,服務器之間內部轉,相同的request,可傳參;
b.執(zhí)行到跳轉語句后無條件立刻跳轉——之后的代碼不再被執(zhí)行;
注意:如果使用forward跳轉,則一定要在跳轉之前釋放掉全部的資源;
c.使用forward時,request設置的屬性依然能保留在下一個頁面(setAttribute);d.通過
e.地址中的”/”代表是:http://localhost:8080/Test B、response.sendRedirect(“地址”):效率低,速度慢
a.地址欄改變跳轉——客戶端跳轉(其中地址可以是任意的)
b.所有代碼執(zhí)行完畢之后再跳轉,跳轉語句后面的代碼還是會執(zhí)行,除非在其后面加上return(return)需復雜一些。
<% Response.sendRedirect(“aa.jsp”);boolean b = true;
if(b){ Return;} System.out.println(“aaaaaaaaaa”);%>
c.不能保存request屬性——地址改變了,客戶端跳轉,不同的request d.通過對URL地址的重寫傳遞參數:
response.sendRedirect(“responseDemo04.jsp?id=mldn”);
e.地址中的”/”代表是:http://localhost:8080/
下面是兩種比較重要的跳轉,我還是與上次的一次,把我做的筆記貼出來:24、25、Hibernate的左聯(lián)結和右連接,緩存,數據加載? 面向對象如何理解?
26、EJB中CMP和BMP,SessionBean的機制?27、28、29、對日外包是否有抵觸情緒? 如何減少Servlet的請求? 對設計模式了解多少?作過的項目中用過那些設計模式? 30、31、32、33、34、35、36、37、38、39、40、41、42、43、44、45、怎樣看待團隊合作,在團隊合作中你扮演什么樣的角色,遇到技術難題時怎么解決? Exception的層次結構? EJB對數據庫的訪問機制? Struts中是否有事務處理? Hibernate的其它功能(除了ORM)? 如何提高數據庫中的數據查詢效率? 作為項目經理如何對組內成員分工? 描述一下你做過項目的流程。
加班到12點,突然有人來問你技術上的難題,你會如何處理? Oracle的冷備份、熱備份 Strurs中怎樣實現 Hibernate怎樣實現ORM Spring 的事務處理機制
Strurs的驗證方式,Javascript的驗證的方式
一個是服務器端驗證,一個是客戶端驗證
Struts的工作機制 Delete/trancate的區(qū)別
trancate與delete都是刪除數據,不同的是trancate是將表的所有數據都刪除,而delete可以有選擇地刪除數據; delete刪除數據是記錄在日志中的,可以通過其將數據恢復,而trancate則是將整個表截斷,其操作是不記錄在日志里的。46、47、48、作為項目組長,你遇到的最大問題是什么?如何解決?
Ajax/內嵌框架實現局部刷新,有什么差別?
Exception/Error的區(qū)別,在什么情況下可以拋出RuntimeException 父類不同
知道異常和錯誤最本質的區(qū)別就是異常能被開發(fā)人員處理而錯誤時系統(tǒng)本來自帶的,一般無法處理也不需要我們程序員來處理。
在程序運行時候出錯而又不是系統(tǒng)原因差生的,一般是由于程序原因產生,比如程序寫的不夠嚴謹、完善
典型的RuntimeException
有
ArithmeticException、ClassCastException、IndexOutOfBoundsException、NullPointerException、UnsupportedOperationException 等.49、50、51、52、53、54、55、56、57、58、59、Orcale 物化視圖(MV)
業(yè)務處理模塊中,是如何處理事務? Sql語句如何優(yōu)化 數據庫右連接
JDBC的連接關閉在哪?
Finally語句塊內
錯誤處理模塊是放在哪個層的。接口能否繼承接口。
接口可以繼承接口..但是要使用extends~而不是用implements 抽象類能否繼承實體類。
抽象類是可以繼承實體類,但前提是實體類必須有明確的構造函數 答案很明確,可以繼承。
項目中查詢時怎么樣實現的?
作為項目負責人你是管理這個團隊的?
在你做項目過程中遇到些什么問題,是怎么樣解決的?
Jquery中的幾種選擇器:
Javascript如何進行數字和字符串之間的轉換?
數字類型轉換成String類型用 對象=對象.toString()方法,字符串轉換成數字類型則是對象=Number(對象);
第五篇:JAVA程序員求職信
JAVA程序員求職信范文
尊敬的領導:
您好!十分感謝您在百忙之中能翻閱我的自薦信。與公司是一種選擇,與我則是一種機會。在上千份大同小異的求職信中,我期望你手中的這份能給您帶來驚喜!
我叫張XX,是xx技術學院09級的一名??粕妥x于計算機技術與應用專業(yè)。主修課程:計算機組成原理,數據結構,java網絡編程,c++編程基礎,單片機基礎,路由/交換機配置,jsp編程基礎,計算機網絡,sql server數據庫設計,xml編程實現,編譯原理。
大學四年來,我學習刻苦,成績優(yōu)異,曾多次獲得獎學金。在師友的嚴格教益和個人努力下,我具備了扎實的基礎知識。在軟件方面,系統(tǒng)掌握了C語言,數據結構,Power Builder,數據庫原理,匯編語言,軟件工程等,并對面向對象的DELPHI和VC 等Windows編程有一定了解。課外我還自學了VB,VF編程及網頁制作。現已能獨立編寫專業(yè)的數據庫管理系統(tǒng)。在硬件方面,通過參與單片機設計,組裝收音機,網絡工程的規(guī)劃與管理及組建等實踐活動,我掌握了計算機的工作原理及計算機網絡原理技術。
面對當今激烈的人才競爭,我很清楚自己知識有限,但我更清楚我有著不甘落后的精神和不斷學習,不斷提高的愿望。樂于進取,不怕挫折是我的人生信條,給我一次機會,讓我去實踐,去闖,去干,因為能力要在實踐中培養(yǎng),也終究要在實踐中體現。我信心十足,相信我所具備的專業(yè)技能,積累的知識,加上有良好的人際關系,會幫助我掀開生活中的新一頁。