前言:

因为我不算教师,而且理论知识储备也不够详尽,我能做的就是整合ucb的cs61b神课和廖学锋老师的java课程来做一些梳理,计算机是一门工科语言,最需要的就是不断的练习,在联系中理解这些内存机制,数据结构。我希望宝宝可以尽力做一些作业,因为这些作业是国外的大学教授,成千上万的助教花心思布置的作业,目的是让你领会理解,学习是一件辛苦的事情,希望我们一起努力进步。

1. Why Study Algorithms or Data Structures?

原因是想做一些有意思的,漂亮的东西。

链接: https://youtu.be/BIjj3Qcmbf4

https://www.youtube.com/watch?v=pp1NWRDl0pI

有关流体渲染的一些建模,更多的就不放了,我们快点进入正题

2. 从hello world开始
1
2
3
4
5
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

和processing,以及python比较,java语言是更啰嗦繁琐的,但是我们从这个小程序可以看到一些java的语法知识

  • 这个hello world程序声明了一个class类,而且是public class类。在java中任何代码都必须被包裹在类里。
  • 实际运行的method被称为main,声明为public static void main(string[] args). java都会有一个主函数来负责运行
  • 我们使用{}来表示这段代码的开始和结束
  • 每个语句结尾的时候用分号。
2.1 more about hello world

类名是HelloWorld, case sentstive, 也就是说如果helloworld那就是不同程序,是会识别大小写的。而java里的public, class都是一些固定写法,必须用小写。

类名按照习惯必须大写。

方法除了方法名,还有参数,参数名是args,public,static。这里就是代表这是一个公开的方法,而void是函数的返回值,代表一个空值。常用的返回值还有Int, string等等。

2.2 java运行以及javac

最普遍运行java的方式就算通过java编译器,javac,然后再用解释器interpreter, 比如java。

比如运行helloworld.java,我们可以用两行命令来运行刚才的hello world程序

1
2
3
$ javac HelloWorld.java
$ java HelloWorld
Hello World!
compilationflow

$是命令行的输入提示符,编写语言的过程中不可避免的会涉及到一些命令行操作

这里编译器是把源码编译成二进制的代码,为了能够执行在电脑上。

2.3 变量和循环
1
2
3
4
5
6
7
8
9
public class HelloNumbers {
public static void main(String[] args) {
int x = 0;
while (x < 10) {
System.out.print(x + " ");
x = x + 1;
}
}
}
1
2
3
$ javac HelloNumbers.java
$ java HelloNumbers
$ 0 1 2 3 4 5 6 7 8 9
  • 函数在使用之前必须声明,而且必须给予变量类型。

  • 我们的循环函数得写在{}之中,控制循环条件是写在{}之外的

  • System.out.print和System.out.println都是输出,但是区别是println会输出新的一行,而System.out.print输出完后会在原本行停留。

  • 这里加空格的目的是输出的时候不会挤在一起。

2.4 static typing

静态变量,对于java关键的特性有一个就是静态变量检测,比如说

1
2
3
4
5
6
7
8
9
10
public class HelloNumbers {
public static void main(String[] args) {
int x = 0;
while (x < 10) {
System.out.print(x + " ");
x = x + 1;
}
x = "horse";
}
}
1
2
3
4
5
$ javac HelloNumbers.java
HelloNumbers.java:9: error: incompatible types: String cannot be converted to int
x = "horse";
^
1 error

如果我们尝试运行这段代码,会报错。报错的原因是string不能转换为int格式。

这个编译器在运行前就报错了,因为检测到了类型变换的错误。当然python不会有这种问题,即使在程序运行的时候也可以改变函数类型,但是java是强类型语言,因此会报错。

如果你真的深入学习,你会觉得这种强制规范类型的代码更规范

  • 对于编程人员来说更容易查bug

  • 因为会在运行前就查错,所以不太容易使程序崩溃,特别是应用程等等

  • 每一个变量,参数,函数都需要声明,也更易理解明白看一些代码,明白每个函数是做什么事情的。

2.5 关于一个有意思的小例子
1
2
String h = 5 + "horse";
int h = 5 + "horse";

因为java是强类型的声明,因此如果是string类型的5+”horse”,java会首先认为这是string类型,因此会自动把5转换为“5”,那么输出就是5horse,并不会报错。

但如果是int类型呢,因为”horse”字符串无法转化为int,因此会报错。

在Python中因为变量不需要声明类型,因此5 + “horse”会让编译器困惑,到底是int呢还是string呢?因此会报错。

从这个例子你就可以理解强类型变量的含义

2.6 定义函数
1
2
3
4
5
6
def larger(x, y):
if x > y:
return x
return y

print(larger(8, 10))

在python和processing中,函数可以随意被定义