Java 初学者问题集

最近一个朋友从文科改行学计算机,为了能找到一份起薪比较高的工作。学习计算机的第一门课,就是 面向对象编程,Java. 他的思路是文科生的思路,过去的二十几年里也从来没有接触过计算机,编程。很多我们觉得理所当然的东西,他都无法理解。

他问了我很多稀奇古怪的问题,有些我甚至不知道该如何回答,就好像,两点之间直线最短,一般,难以解释的公理。

但仔细想了想,任何人,在接触一个新新世界时,他们的思维轨道,概念认识,都是完全未设置的。所以,很多我们觉得理所当然的事,他们无法理解。也因为无法理解,让他们对这个领域敬而远之。把编程这么一个简单有趣又能赚大钱的领域,当做了一件很复杂的事。就好像高中时候的物理。明明那么自然的物理公理,那么简单的题目,但是有多少人是多么的害怕物理。归其根本,还是因为,他们的思维轨道并没有被设置好。

这篇文章将从许多“傻逼”的问题入手,讲讲这个计算机世界。讲到哪里算哪里。也欢迎初学者在这里提问。作为一个同样刚刚转行一年的小菜,或许我能理解你们的不理解。

  1. 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();

    ....
}
  1. 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范围更大些。

我们有了这些基本类型,才能真正从底层,从细节,去描述我们的类,我们的逻辑。

  1. 在一个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指向的对象,发生了变化。所以,对象,同样可以是变量。

  1. scanner keyboard = new scanner(system.in), amount = keyboard.nextInt() 是干嘛用的?
    当我们需要用户输入时,我们就得用 scanner.
    system.in 是输入流。我们构造scanner这个对象,需要制定输入流。所以我们把咱们系统的输入流作为参数,传入给scanner来构造对象。
    之后,这个对象就会来捕捉你系统的输入。
    当代码执行到这行时,
amount = keyboard.nextInt();

会自动停下,等待你的输入。
你在键盘上输入一个数字,按下回车。scanner会认为你这次输入结束。然后把你输入的这个数字传进给程序里,以作下一步打算。
应用情景有太多了。比如你打客服的时候,经常会给你许多选择。比如,按1是干嘛干嘛,按2是干嘛干嘛。
这个时候程序会停在那里,等待你的输入。
当你输入1并按下确认键时,程序默认你的这次输入结束。拿到你输入的数字1,然后跳转到处理 option 1 的代码逻辑。

今天就解释到这里。

推荐阅读更多精彩内容

  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    江湖宇阅读 1,287评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,908评论 17 134
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 3,704评论 1 115
  • 想起昨天我煮糊了一锅粥,等我马不停蹄地冲到厨房的时候,已经无力回天。 我看着水迹斑斑的炤台,仰天大笑。哈哈...
    最渺小的我_阅读 133评论 0 0
  • 没来上海之前,心里有种莫名的排斥感,但总想来看看…… 来这里快两年了,发现自己竟渐渐爱上这座城,它似乎有种魔力...
    summer凌霄阅读 425评论 2 3