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 的代码逻辑。

今天就解释到这里。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,789评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,486评论 1 114
  • 想起昨天我煮糊了一锅粥,等我马不停蹄地冲到厨房的时候,已经无力回天。 我看着水迹斑斑的炤台,仰天大笑。哈哈...
    最渺小的我_阅读 287评论 0 0