Java文件命名和main函数

在上一章的教程中,我们创建了一个Main.java文件,然后我们使用以下的代码打印出”Hello World”:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

那我们来简单了解一下以上的代码:其中Main是类的名字(要注意,Java是会区别对待大小写的,所以Main和main是有区别的),文件名也必须是Main.java,因为Java中的文件和类的名字必须一致。

紧接着类的定义之后,我们有一个main函数。在任何的Java程序中,我们都会看到此函数,在main函数中的代码都会被执行 。(我会在之后的章节讲解函数,现在只要知道如何使用函数就好了)

public static void main(String[] args)

在main函数中,我们使用println函数打印出字符串“Hello World!”。

从这段代码我们学到重要的Java语法特征便是:每个Java程序都必须要有一个类,类的名字必须和文件名字一致。如果想要运行此程序,程序中必须要有一个main函数,运行程序时,main函数中的代码就会被执行。

注释

在进入正式的语法教学之前,我想聊聊注释。注释是编辑代码中不可或缺的一部分,表面上,注释只是对我们的代码起到解释说明的作用。可是当我们的代码写了很多之后,好的注释则能帮助我们了解代码的功能和目的。不写注释的话,很容易造成我们完全忘记某个代码块的意义。所以我们需要注释来帮助我们更好地理解和维护代码。

在Java中有两种方法编辑注释,一种是单行注释,就是使用 // 开头,紧接着注释:

System.out.println("Hello World!.") // 打印出'Hello World!'

另一种是多行注释以 /** 开头,每一行的开头都以 * 开头,并最终以*/ 结尾:

/**
 * 这是类的作用就是打印出 Hello World
 */
public class Main ...

变量

程序的作用简单来说就是通过输入一些数据,计算这些数据后,输出新的数据。所以储存数据是一个程序至关重要的功能。在Java中,变量就是一个指向储存数据的引用。每当我们创建变量的时候,我们都会让此变量指向一个数值,而下次我们需需要那个数值的时候,我们直接访问变量名就好了。

以下是创建变量的语法,一开始是数据的类型,然后是变量的名字,紧跟着是数值,最后必须以分号( ; )结尾:

type variable = value;

那我们来看一个具体的例子:

String name = "Enoch";
System.out.println(name);

在上面的代码中,我创建了一个变量叫做name,然后创建另一个字符串叫做”Enoch”,并将此字符串分配给name。当我们想要打印出此字符串的时候,只需要将name变量传给println函数即可。

这里要注意的是,变量的名字不能是Java中已被占用的关键词,比如class, public等等,以下是Java中关键词的一些链接:

Java中变量的命名方式也有讲究,最好是以小写字母为开头,不能以数字作为开头,也不能包含特殊字符 (&, $, _),如果一个名字中包含多个单词,那么第一个单词后的其他单词需要将首字母大写,以下的变量命名都是合理的:

idNumber
newVar1
student25
studentIdNumber

简单来说,变量是一个名字,我们让这个名字指向一个一组数据,那么这个名字中便隐含了数据在电脑中的真实物理地址,每当我们需要数据的时候,通过解析变量名指向的地址我们就能找到那组数据。

内置数据类型

除了字符串,Java中有8种基本内置数据类型,这些数据类型的大小和作用各不相同:

数据类型数据大小具体描述
byte1 byte-128到127之间的整数
short2 bytes-32,768到32,767之间的整数
int4 bytes整数(-2,147,483,648 ~ 2,147,483,647)
long8 bytes长整数(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
float4 bytes浮点数(小数后6到7位)
double8 bytes浮点数(小数后15位)
boolean1 bittrue 或 false(正或否)
char2 bytes单个字符或字母(ASCII数值)

在以下的代码中,我们就创建了两个数字,并将他们相加,然后将结果打印出来:

int num1 = 100, num2 = 200;
int sum = num1 + num2;
System.out.println(sum) // 300 

以下是不同类型数据的赋值方法:

int intNum = 10;
float floatNum = 5.99;
boolean bool = true;
char letter = 'A';

常量是一旦被赋值后就不能改变的变量,在创建常量的时候必须要在数据类型前加上 final 关键词:

final int myNum = 15;

这个时候如果你再赋值其他的数据给myNum,编译器就会报错:

myNum = 20 // Error

类型转换

类型转换的意思就是你把一个数值转换成另一个数据类型。在Java中,你有两种转换方式:自动类型转换和强制类型转换。

自动类型转换:转换前的数据的位数(数据大小)要低于转换后的数据类型,比如 int 数据类型的位数是4 bytes,就可以转换为位数是位数是8 bytes的long数据类型。

byte -> short -> char -> int -> long -> float -> double

以下的代码就是把低位数char转换成高位数int的演示:

char c1 = 'z';
int i1 = c1; // char自动转换成int

与自动类型转换相反的便是强制类型转换,将位数大的数据类型转换成位数小的数据类型。

double -> float -> long -> int -> char -> short -> byte

在实际的编码中,我们需要在转换的数据类型前添加括号:

double doubleNum = 9.9;
int intNum = (int)doubleNum; // 9

操作符

计算机最基础的用途之一就是执行数学运算,在Java中,必然也提供了丰富的运算法。我们可以把运算符分类以下几个类型:

  • 算数运算符:用于数学表达中,比如加减乘除
  • 关系运算符:用于比较大小或相等性
  • 位运算符:作用于所有的二进制位上
  • 逻辑运算法:用于进行布尔运算(真或真,真和假)
  • 赋值运算法:用于给变量进行重新赋值
  • 其他运算法:条件运算法(?:),instanceof运算符

算数运算符

操作符描述例子
+加法:相加操作符两侧的值x + y
减法:操作符左侧的数减去右侧的数x – y
*乘法:相乘操作符两侧的值x * y
/除法:操作符左侧的数除以右侧的数x / y
%取余:操作符左侧的数除以右侧的数得到的余数x % y
++自增:操作数的值增加1x++
自减:操作数的值减少1x–
算数运算符表

下面的代码简单演示了基本的逻辑运算:

int a = 5;
int b = 10;
int c = 15;
int d = a + b; // 15
int e = c % a; // 0
a++; // 6

关系运算符

操作符描述例子
==检查如果两个操作数的值是否相等,如果相等条件为真x == y
!=检查如果两个操作数的值是否相等,如果值不相等则条件为真x != y
> 检查左操作数是否大于右操作数,如果是条件为真x > y
<检查左操作数是否小于右操作数,如果是条件为真x < y
>=检查左操作数的值是否大于或等于右操作数的值x >= y
<=检查左操作数的值是否小于或等于右操作数的值x <= y
关系运算符表

下面是简单的运算符演示:

int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a <= b); // true

位运算符

操作符描述例子
&如果操作符左右两侧相对应数都在是1,则结果为1,否则为0x & y
|如果相对应位都是0,则结果为0,否则为1x | y
^如果相对应位置相同,则结果为0,否则为1x ^ y
~按位取反运算符:翻转操作数的每一位,既0变为1,1变为0~x
<<按位左移运算符:左操作数按位左移右操作符指定的位数x << 2
>>按位右移运算符:左操作数按位右移右操作符制定的位数x >> 2
>>>按位右移补零运算符:左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充x >>> 2
位运算符表

逻辑运算符

操作符描述例子
&&逻辑与运算符:当且仅当两个操作数都为真,条件才为真x && y
||逻辑或操作符:如果两个操作数其中任何一个为真,条件为真x || y
逻辑非运算符:用来反转操作数的逻辑状态。如果条件为true,则非运算符后得到false!x
逻辑运算符

赋值操作符

操作符描述例子
=将右操作数的值赋值与左操作数x = y
+=加和赋值操作符:将左操作数和右操作数相加,并赋值与左操作数x += y等于x = x + y
-=减和赋值操作符:将左操作书和右操作数相减,并将结果赋值与左操作数x -= y
*=乘和赋值操作符,将左操作数和右操作数相乘赋值给左操作数x *= y
/=除和赋值操作符,将左操作数和右操作数相除赋值给做操作数x /= y
<<=左移位赋值操作符x <<= 2等于x = x << 2
>>=右移位赋值操作符x >>= 2
&=按位与赋值操作符x &= 2
^=按位异或赋值操作符x ^= 2
|=按位或赋值操作符x |= 2
赋值运算符

接下来我们来聊聊两个特殊的运算符,一个是条件运算符(?:),另一个是 instanceof 运算符,这两个涉及到的内容在后面的章节会深入探讨,这里我们只需要简单了解即可:

条件运算符(三元运算符)会根据布尔表达式的判断,来决定将哪个值赋给变量:

variable x = (expression) ? value1 if true: value2 if false

以下是代码实例,以下的代码根据score变量的数值,来赋值reward变量。如果score大于或等于80,那么reward就是100,不然就是50

int score = 80;
int reward = (store >= 80) ? 100 : 50;

instanceof 能够对实例进行判断,检查该实例是否是一个特定的类型(类或接口),这方面的内容我们后面的章节会深入

Main a = new Main();
boolean isMain = a instanceof Main;
System.out.println(isMain); // true

数组

数组是一种特殊的数据类型,它可以用来存储多个相同数据类型的数值,从而达到使用一个变量操作多个数值的作用。声明一个数组类型变量要使用方括号([ ]),数组中的数据则需要使用尖括号括起来:

int[] numbers = {10 20, 30, 40};

要拿到特定的数值,则可以使用数值的索引号,索引号从0开始,直到n – 1(n是数组的长度)。索引号必须放在变量之后,并放在方括号中:

String[] names = {"Alice", "David", "Enoch", "Alex"};
System.out.println(names[0]); // Alice
System.out.println(names[3]); // Alex

上面的代码的作用就是打印出第一个值和最后一个值。如果要改变数组中的值,则需要通过索引号另外赋值:

names[0] = "Daniel" // 将Alice换成Daniel

一个数组也有其内置的变量,就是length,通过length可以拿到数组的长度:

String[] cars = {"BMW", "Ford", "Porsche", "Ferrari"};
System.out.prinln(cars.length); // 4

数组的升级版便是多维数组,多维数组是一个包含一个或多个数组的数组,一个二维数组就是一个矩阵,可以用以下的方式定义:

int[][] numMatrix = { {1, 2, 3, 4}, {5, 6, 7, 8}};

要拿到多维数组的值则需要使用多个方括号:

int num = numMatrix[0][3]; // 4
numMatrix[1][2] = 3; // 将7变为3

数组是个重要的数据类型,在循环的章节我们会继续讲到如何使用for循环语句遍历数组。

字符串和数学

字符串String和数学Math是两个java内置的类,也是最常用的类,我们接下来就来聊聊如果使用它们。

如果想创建一个字符串,我们只需要在变量名的前面加上 String 即可:

String message = "Hello World";

而每个类都有自己的函数(function),在String中,有很多常用内置的函数供我们使用:

  • length – 长度
  • toUpperCase – 转换为大写
  • indexOf(x) – 找到特定字符串的位置
System.out.println(message.length()); // 11
System.out.println(message.toUpperCase()); // HELLO WORLD
System.out.println(message.indexOf("World")); // 6

Math类则提供了很多帮助我们执行数学任务的函数:

  • max(x, y) – 判断较大的值
  • abs(x) – 得到绝对值
  • sqrt(x) – 平方根
  • random() – 得到一个随机的在0和1之间的浮点数(不包括1)
System.out.println(Math.max(2, 20)); // 20
System.out.println(Math.abs(-25)); // 25
System.out.println(Math.sqrt(25)); // 5.0
System.out.println(Math.random()); // 0.52434....

String和Math的函数还有很多,可以参考以下的官方文档:

课后练习

创建一个Calculator类,在main函数中创建两个变量,并分别赋予不同的整数,最后使用Math的内置函数打印出较大的那一个。