最近一个朋友从文科改行学计算机,为了能找到一份起薪比较高的工作。学习计算机的第一门课,就是 面向对象编程,Java. 他的思路是文科生的思路,过去的二十几年里也从来没有接触过计算机,编程。很多我们觉得理所当然的东西,他都无法理解。
他问了我很多稀奇古怪的问题,有些我甚至不知道该如何回答,就好像,两点之间直线最短,一般,难以解释的公理。
但仔细想了想,任何人,在接触一个新新世界时,他们的思维轨道,概念认识,都是完全未设置的。所以,很多我们觉得理所当然的事,他们无法理解。也因为无法理解,让他们对这个领域敬而远之。把编程这么一个简单有趣又能赚大钱的领域,当做了一件很复杂的事。就好像高中时候的物理。明明那么自然的物理公理,那么简单的题目,但是有多少人是多么的害怕物理。归其根本,还是因为,他们的思维轨道并没有被设置好。
这篇文章将从许多“傻逼”的问题入手,讲讲这个计算机世界。讲到哪里算哪里。也欢迎初学者在这里提问。作为一个同样刚刚转行一年的小菜,或许我能理解你们的不理解。
- public static void main 是啥意思?不是正常应该是 system.out.println() 或者 import 之类的吗?
唔。。。这个问题我很无语。提问者很明显没有好好看过参考书,稍微一不理解,就开始问了。这是个很不好的习惯。在程序领域,需要极强的学习能力。很多时候没人会给你解释,需要你自己在网上搜索答案,整理各个人的意见,归纳出答案。所以,我就不解答这个问题了。
唔。。。Just kidding.
这个问题,就是所谓的跨行业人群的稀奇古怪又不好意思问老师的问题吧?
在面向对象的世界里,类就好像是图纸,而对象,就是照着这个图纸打造出来的一辆车。一张图纸可以打造出无数辆车。这些车的实现细节完全相同,但是,他们确实不同的车。
假设你现在有辆车。车上有方向盘,油门,刹车,等等。他们都是精密的仪器。设计者花费了大量的心血设计了他们。那你要怎么用他们呢?
坐在车里面?似乎没有用到他们。
推着车走?似乎没有用到他们。
发动车?没错,你可以开始用到方向盘,油门,刹车了。
public static void main(String[] args) {…} 就是这么一个发动器。
只有通过这个发动器,接下来,你才能来使用设计好的方向盘,油门,刹车。
用更简单的语言来说, main() 是程序的入口。你在这个函数里,去定义你的逻辑,去做一切你想做的事。
比如,我有一个类
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() 里面,定义你想要的行为,或者,逻辑。
比如,我想让车先往前开,再左转,再右转,再倒车,最后停下。你就需要在 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();
// 让车向左转
corolla.turnLeft();
// 让车向右转
corolla.turnRight();
// 让车向后退
corolla.backward();
// 让车停下
corolla.brake();
}
}
简而言之,main()是一个程序的入口。在这个函数里,我们定义了自己想要这个程序干嘛,即,程序的行为。
而System.out.println(),就是行为之一,把一些东西打印出来。
然后,在程序世界里有很多行为,比如这里的输出,还有输入,还有读文件,写文件,各种计算,数据结构。这些都是行为。为了更好的区分他们,我们把它们分门别类写进一个个包。每个包,定义了一种类型的行为。
而 import, 就是在你的程序里,引用这些包的。比如你写好了一个类,轮胎。写好了一个类,方向盘。你会把他们放进两个package,
到时候需要构造车的时候,就把他们 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
面向对象最基本的就是类。但每个类,归根结底,都是由一个个基本的数据所定义的。比如车这个类,车长多少,车宽多少,马力多少,耗油量多少,等等。我们需要用数字去定义这些东西。
Java里面一共有好几种数据类型,具体多少种我记不得了。
比如,int, long, float, double 等等
int, long 都是用来描述整数的,但他们的区别是,他们描述的范围不同。
int 描述 [ – (2 ^ 32), (2 ^ 32) – 1 ], 超出这个范围的值,不可以被Int所描述。比如, 2^32, int 就无法描述这个值。
long 描述 [ – (2 ^ 64), (2 ^ 64) – 1 ],超出这个范围的值,不可以被 long 所描述。比如, 2^64, long 就无法描述这个值。
float 和 double 是用来描述小数的。和 int/long类似,float 范围小一些,double范围更大些。
我们有了这些基本类型,才能真正从底层,从细节,去描述我们的类,我们的逻辑。
- 在一个code里,怎么看什么是class 什么是object 什么是 variable?
类 永远是被 关键词 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();
// 让车向左转
corolla.turnLeft();
// 让车向右转
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指向的对象,发生了变化。所以,对象,同样可以是变量。
- scanner keyboard = new scanner(system.in), amount = keyboard.nextInt() 是干嘛用的?
当我们需要用户输入时,我们就得用 scanner.
system.in 是输入流。我们构造scanner这个对象,需要制定输入流。所以我们把咱们系统的输入流作为参数,传入给scanner来构造对象。
之后,这个对象就会来捕捉你系统的输入。
当代码执行到这行时,
amount = keyboard.nextInt();
会自动停下,等待你的输入。
你在键盘上输入一个数字,按下回车。scanner会认为你这次输入结束。然后把你输入的这个数字传进给程序里,以作下一步打算。
应用情景有太多了。比如你打客服的时候,经常会给你许多选择。比如,按1是干嘛干嘛,按2是干嘛干嘛。
这个时候程序会停在那里,等待你的输入。
当你输入1并按下确认键时,程序默认你的这次输入结束。拿到你输入的数字1,然后跳转到处理 option 1 的代码逻辑。
今天就解释到这里。