最近一個朋友從文科改行學計算機,為了能找到一份起薪比較高的工作。學習計算機的第一門課,就是 面向?qū)ο缶幊?,Java. 他的思路是文科生的思路,過去的二十幾年里也從來沒有接觸過計算機,編程。很多我們覺得理所當然的東西,他都無法理解。
他問了我很多稀奇古怪的問題,有些我甚至不知道該如何回答,就好像,兩點之間直線最短,一般,難以解釋的公理。
但仔細想了想,任何人,在接觸一個新新世界時,他們的思維軌道,概念認識,都是完全未設(shè)置的。所以,很多我們覺得理所當然的事,他們無法理解。也因為無法理解,讓他們對這個領(lǐng)域敬而遠之。把編程這么一個簡單有趣又能賺大錢的領(lǐng)域,當做了一件很復雜的事。就好像高中時候的物理。明明那么自然的物理公理,那么簡單的題目,但是有多少人是多么的害怕物理。歸其根本,還是因為,他們的思維軌道并沒有被設(shè)置好。
這篇文章將從許多“傻逼”的問題入手,講講這個計算機世界。講到哪里算哪里。也歡迎初學者在這里提問。作為一個同樣剛剛轉(zhuǎn)行一年的小菜,或許我能理解你們的不理解。
- public static void main 是啥意思?不是正常應該是 system.out.println() 或者 import 之類的嗎?
唔。。。這個問題我很無語。提問者很明顯沒有好好看過參考書,稍微一不理解,就開始問了。這是個很不好的習慣。在程序領(lǐng)域,需要極強的學習能力。很多時候沒人會給你解釋,需要你自己在網(wǎng)上搜索答案,整理各個人的意見,歸納出答案。所以,我就不解答這個問題了。
唔。。。Just kidding.
這個問題,就是所謂的跨行業(yè)人群的稀奇古怪又不好意思問老師的問題吧?
在面向?qū)ο蟮氖澜缋?,類就好像是圖紙,而對象,就是照著這個圖紙打造出來的一輛車。一張圖紙可以打造出無數(shù)輛車。這些車的實現(xiàn)細節(jié)完全相同,但是,他們確實不同的車。
假設(shè)你現(xiàn)在有輛車。車上有方向盤,油門,剎車,等等。他們都是精密的儀器。設(shè)計者花費了大量的心血設(shè)計了他們。那你要怎么用他們呢?
坐在車里面?似乎沒有用到他們。
推著車走?似乎沒有用到他們。
發(fā)動車?沒錯,你可以開始用到方向盤,油門,剎車了。
public static void main(String[] args) {...} 就是這么一個發(fā)動器。
只有通過這個發(fā)動器,接下來,你才能來使用設(shè)計好的方向盤,油門,剎車。
用更簡單的語言來說, main() 是程序的入口。你在這個函數(shù)里,去定義你的邏輯,去做一切你想做的事。
比如,我有一個類
public class Car {
public void drive() {
System.out.println("Drive......")
}
public void brake() {
System.out.println("Brake......")
}
public void turnLeft() {
System.out.println("Turn left......")
}
public void turnRight() {
System.out.println("Turn Right......")
}
public void backward() {
System.out.println("Backward......")
}
}
我有這么個類。他是圖紙。計算機不知道你要用它來干嘛,你會有哪些行為。所以,你需要在 main() 里面,定義你想要的行為,或者,邏輯。
比如,我想讓車先往前開,再左轉(zhuǎn),再右轉(zhuǎn),再倒車,最后停下。你就需要在 main() 里面定義這個行為,或者說,邏輯。
public class Car {
public void drive() {...}
public void brake() {...}
public void turnLeft() {...}
public void turnRight() {...}
public void backward() {...}
public static void main(String[] args) {
Car corolla = new Car();
// 讓車向前開
corolla.drive();
// 讓車向左轉(zhuǎn)
corolla.turnLeft();
// 讓車向右轉(zhuǎn)
corolla.turnRight();
// 讓車向后退
corolla.backward();
// 讓車停下
corolla.brake();
}
}
簡而言之,main()是一個程序的入口。在這個函數(shù)里,我們定義了自己想要這個程序干嘛,即,程序的行為。
而System.out.println(),就是行為之一,把一些東西打印出來。
然后,在程序世界里有很多行為,比如這里的輸出,還有輸入,還有讀文件,寫文件,各種計算,數(shù)據(jù)結(jié)構(gòu)。這些都是行為。為了更好的區(qū)分他們,我們把它們分門別類寫進一個個包。每個包,定義了一種類型的行為。
而 import, 就是在你的程序里,引用這些包的。比如你寫好了一個類,輪胎。寫好了一個類,方向盤。你會把他們放進兩個package,
到時候需要構(gòu)造車的時候,就把他們 import 進來。方便便捷。
package tyre;
public class Tyre {...}
package wheel;
public class Wheel {...}
package car;
import tyre;
import wheel;
public class Car {
private Tyre mTyre = new Tyre();
private Wheel mWheel = new Wheel();
....
}
- int 什么什么 都是啥意思,為什么要 int
面向?qū)ο笞罨镜木褪穷?。但每個類,歸根結(jié)底,都是由一個個基本的數(shù)據(jù)所定義的。比如車這個類,車長多少,車寬多少,馬力多少,耗油量多少,等等。我們需要用數(shù)字去定義這些東西。
Java里面一共有好幾種數(shù)據(jù)類型,具體多少種我記不得了。
比如,int, long, float, double 等等
int, long 都是用來描述整數(shù)的,但他們的區(qū)別是,他們描述的范圍不同。
int 描述 [ - (2 ^ 32), (2 ^ 32) - 1 ], 超出這個范圍的值,不可以被Int所描述。比如, 2^32, int 就無法描述這個值。
long 描述 [ - (2 ^ 64), (2 ^ 64) - 1 ],超出這個范圍的值,不可以被 long 所描述。比如, 2^64, long 就無法描述這個值。
float 和 double 是用來描述小數(shù)的。和 int/long類似,float 范圍小一些,double范圍更大些。
我們有了這些基本類型,才能真正從底層,從細節(jié),去描述我們的類,我們的邏輯。
- 在一個code里,怎么看什么是class 什么是object 什么是 variable?
類 永遠是被 關(guān)鍵詞 class 修飾的。
比如之前的那段代碼:
public class Car {
public void drive() {...}
public void brake() {...}
public void turnLeft() {...}
public void turnRight() {...}
public void backward() {...}
public static void main(String[] args) {
Car corolla = new Car();
// 讓車向前開
corolla.drive();
// 讓車向左轉(zhuǎn)
corolla.turnLeft();
// 讓車向右轉(zhuǎn)
corolla.turnRight();
// 讓車向后退
corolla.backward();
// 讓車停下
corolla.brake();
}
}
Car 就是 類,被class 修飾。
然后我們用這個類,實例化了一個對象,object,叫做 corolla.
variable的定義更廣泛些。他表示任何可以改變的量。之前說過的 int,long,double,float 都可以用來描述變量。
int a = 10;
a = a + 10;
System.out.println(a); // 20
這里 a 從10變成了20. a 其實就是一個變量。
對象同樣可以是變量。
Car corolla = new Car();
corolla = new Car();
一開始 corolla指向一輛新車,接著我們又讓它指向另一輛新車。這個corolla指向的對象,發(fā)生了變化。所以,對象,同樣可以是變量。
- scanner keyboard = new scanner(system.in), amount = keyboard.nextInt() 是干嘛用的?
當我們需要用戶輸入時,我們就得用 scanner.
system.in 是輸入流。我們構(gòu)造scanner這個對象,需要制定輸入流。所以我們把咱們系統(tǒng)的輸入流作為參數(shù),傳入給scanner來構(gòu)造對象。
之后,這個對象就會來捕捉你系統(tǒng)的輸入。
當代碼執(zhí)行到這行時,
amount = keyboard.nextInt();
會自動停下,等待你的輸入。
你在鍵盤上輸入一個數(shù)字,按下回車。scanner會認為你這次輸入結(jié)束。然后把你輸入的這個數(shù)字傳進給程序里,以作下一步打算。
應用情景有太多了。比如你打客服的時候,經(jīng)常會給你許多選擇。比如,按1是干嘛干嘛,按2是干嘛干嘛。
這個時候程序會停在那里,等待你的輸入。
當你輸入1并按下確認鍵時,程序默認你的這次輸入結(jié)束。拿到你輸入的數(shù)字1,然后跳轉(zhuǎn)到處理 option 1 的代碼邏輯。
今天就解釋到這里。