虽然写完了上一篇笔记,马上就开始接着写了这篇,然而标题写好了以后,却迟迟没有动笔写正文。所有的语言学习,都离不开语法的学习,包括汉语和英语。然而语法的学习是最枯燥的,主谓宾定状补,疑问句反问句倒装句......所以我考虑了一段时间,决定不专门写JAVA的基本语法,只按照我设想的学习进度来对期间使用到的语法部分进行说明,如果在下一阶段出现了新的语法问题,就进行附加说明,然后在最后进行一次语法总结。
那么到目前为止,我们写完了第一个JAVA程序后,有哪些语法问题呢?回顾一下我们的第一个java程序
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
如果你是自己手写工一个字母一个字母的输入的完成的这个工作,那么有可能你在javac HelloWorld.java这个操作的时候可能就吃了些苦头。你可能会发现系统不停提示这里有错误那里有错误,而错误提示又把你看的一头雾水,你只能一个字母一个字母检查,一个符号一个符号检查,甚至最后你干脆直接复制了这段代码到你的文本中——这样至少比你直接放弃JAVA好得多(这个想法忽然让我想起网上各种Oracle-从入门到删库,JAVA-从入门到入土的段子)。如果你没有丝毫错误就手工完全正确的完成了这个代码,也不必开心,这么简单的代码,不出错也是很正常的。但是以后代码复杂起来,想不错也难啊。
现在让我们看看已经有的这些东西包含哪些语法,或者说需要注意的:
大小写敏感:这个在上一篇里面已经体现了,我们把HelloWorld换成了Helloworld,然后就编译错误了,说明在java的世界里,大写和小写是不一样的
公共类名应该和源文件名一致:我们程序的源文件名叫HelloWorld.java,与程序里的类名是完全一致的,当我们把程序里的类名修改后,编译时系统提示我们类Helloworld是公共的,应该在名为Helloworld.java的文件被声明,这说明,公共类名应该和文件名一致,无论你是把类名字改成和文件名字一致,还是把文件名字改成和类名字一致,总之公共类名就应该和JAVA文件名字相同
命名规范:从我们的程序里面大家可能已经看出来了,对于类名,我们通常是采取每个单词的首字母大写,如HelloWorld;对于方法名,则首字母小写,后面的单词首字母大写(我们的例子中,现在还没有其他的方法,只有一个main方法。如果有一个方法需要命名,那么按照这样的方式进行命名,比如有个方法用于获取年龄,那这个方法可能叫getAge,第一个单词首字母小写,第二个单词首字母大写);对于变量名,也是首字母小写,后面单词的首字母大写(我们现在的例子还没有定义变量,比如我们定义一个员工类,有基本工资和绩效工资,那么基本工资命名应该是baseSalary,第一个单词首字母小写,第二个单词首字母大写)请注意,命名规范是约定俗成的,并不是JAVA语法强制的,这样做是为了代码的可读性,比如我们可以将类名改成a,将源文件改成a.java,一样可以成功执行。命名规范并不是java语法要求,只是java语法建议。
主方法:在我们的程序中,我们的类里面只有一个方法public static void main(String[] args){...}这是java程序的主方法,是所有程序执行的入口,当我们使用java HelloWorld命令来执行程序时,虚拟机从这个方法开始执行。所有的java程序,想要能正常执行就必须有一个这样的方法,而且只能由一个这样的方法,写法是完全固定的。比如我们去掉main方法后面的String[] args,再编译的话是不会有问题的,然而如果执行这个类,就会提示没有main方法:
那么如果我们把两个方法都写进去呢?
可以看到编译和执行都是正常的,那说明类里面是可以存在同样的方法名的,但是主方法只能有一个,就是严格按照public static void main(String[] args)命名的方法,才是主方法
标识符:java的标识符,就是类名、变量名、方法名的具体名字,比如例子中的类名HelloWorld、主方法名main以及上面举例提到的getAge和baseSalary。上面我们已经提到,标识符是大小写敏感的.另外,标识符只能使用大小写字母(A-Z、a-z)、美元符号($)、下划线(_)开头,其他如数字、百分号、加号减号等不能作为标识符的开头,比如age、$price、_value1 、__v__alue等均是合法标识符,但是 111aaa、%buySomething是非法标识符,不能使用 .另外,不能使用java关键字作为标识符,如我们例子中已经出现过的public、class、void均是java关键字,以下是java关键字和关键字说明,java关键字不多,也无需硬记,以后我们会慢慢使用到他们。另外,标识符是多个单词组成的时候必须连着写,不能拆开写,比如我们写我的第一个Java类,标识符可以是MyFirstJavaClass,绝对不能写成 My First Java Class!
关键字 | 描述 |
---|---|
abstract | 抽象方法,抽象类的修饰符 |
assert | 断言条件是否满足 |
boolean | 布尔数据类型 |
break | 跳出循环或者label代码段 |
byte | 8-bit 有符号数据类型 |
case | switch语句的一个条件 |
catch | 和try搭配扑捉异常信息 |
char | 16-bit Unicode字符数据类型 |
class | 定义类 |
const | 未使用 |
continue | 不执行循环体剩余部分 |
default | switch语句中的默认分支 |
do | 循环语句,循环体至少会执行一次 |
double | 64-bit双精度浮点数 |
else | if条件不成立时执行的分支 |
enum | 枚举类型 |
extends | 表示一个类是另一个类的子类 |
final | 表示一个值在初始化之后就不能再改变了 表示方法不能被重写,或者一个类不能有子类 |
finally | 为了完成执行的代码而设计的,主要是为了程序的健壮性和完整性,无论有没有异常发生都执行代码。 |
float | 32-bit单精度浮点数 |
for | for循环语句 |
goto | 未使用 |
if | 条件语句 |
implements | 表示一个类实现了接口 |
import | 导入类 |
instanceof | 测试一个对象是否是某个类的实例 |
int | 32位整型数 |
interface | 接口,一种抽象的类型,仅有方法和常量的定义 |
long | 64位整型数 |
native | 表示方法用非java代码实现 |
new | 分配新的类实例 |
package | 一系列相关类组成一个包 |
private | 表示私有字段,或者方法等,只能从类内部访问 |
protected | 表示字段只能通过类或者其子类访问 子类或者在同一个包内的其他类 |
public | 表示共有属性或者方法 |
return | 方法返回值 |
short | 16位数字 |
static | 表示在类级别定义,所有实例共享的 |
strictfp | 浮点数比较使用严格的规则 |
super | 表示基类 |
switch | 选择语句 |
synchronized | 表示同一时间只能由一个线程访问的代码块 |
this | 表示调用当前实例 或者调用另一个构造函数 |
throw | 抛出异常 |
throws | 定义方法可能抛出的异常 |
transient | 修饰不要序列化的字段 |
try | 表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码 |
void | 标记方法不返回任何值 |
volatile | 标记字段可能会被多个线程同时访问,而不做同步 |
while | while循环 |
修饰符 | 写法 |
---|---|
public | public class HelloWorld |
protected | protected class HelloWorld |
default | class HelloWorld |
private | private class HelloWorld |
但是如果我们运行时候会报错,因为这个类没有main方法。我们说过,main方法是java程序的入口,没有这个入口虚拟机不知道要从哪里开始执行,就会报错
类的范围从类的名称开始,以一对大括号将类的内容包含在内,正规的类命名方式应该 修饰符 class 类名{}
方法:方法用于声明类的行为。比如我们例子中的main方法,从上面我们已经知道,一个类是可以存在名字相同的方法的,但是如果两个方法完全一样可行吗?从直觉我们就知道是不可行的,因为我们无法区分这两个方法。好在系统也确实无法区分两个完全一样的方法,所以会在编译的时候阻止我们的行为,所以方法有什么东西是可以对它本身进行区分呢?
方法的命名方式是 修饰符 返回类型 方法名 (参数1,参数2,....){}
我们从main方法中,public static void main(String[] args){},其中public 是修饰符,static是修饰符(非访问控制符,这个以后再介绍),void是返回类型,main是方法名,String[] args是参数。
返回类型是一个方法必不可少的部分,因为我们说了方法是声明类的行为,那么这个行为会获得一个什么结果呢?就从这个返回类型来表现,比如我们要声明两个数字相加的方法,那么我们肯定希望能返回他们相加之后的和,就必须用到返回类型。而当我们只是希望做一个动作,对这个动作会带来的结果不关心的话,就使用void关键字,表示不需要返回任何结果。比如我们的main方法,你在控制台打印Hello World!就好了,不要给我返回什么。
同样的,我们看到方法也是以一对大括号把方法的具体操作包含在内,这个是方法的作用范围,方法的执行从第一个{ 开始,到最后一个}结束
变量:java中变量分为局部变量、类变量和成员变量。声明一个变量必须声明变量的类型,这个类型和方法中的返回类型是同一个东西。由于我们现在的例子中没有变量,变量这部分内容会在后面进行说明。
语句:我们的例子中,main方法执行了一个操作 System.out.println("Hello World!"); 这一个操作就是一个java语句,这个语句的作用我们也已经知道了,就是输出Hello World! 这句话。请注意,java的语句一定是以分号结束的,如果我们不写这个分号,那虚拟机就不知道怎么结束,就会报错。另外,所有的表示范围的{}、()表示语句结束的分号;都是
我们已经知道用System.out.println("XXXXXX");来输出一段话,那我们尝试执行一下以下代码看看:
public class MyFirstJavaClass{
public static void main(String[] args){
System.out.println("First");
System.out.println(1);
System.out.println("1");
System.out.println(1>2);
System.out.println(123-23);
System.out.println('a');
System.out.println("a");
}
}
果然语法这个东西是最枯燥的,不管看的人如何,我写起来都觉得好无聊,没有什么信心能吸引人仔细看。下面我们会介绍java的基本数据类型和运算,以及简单的人机交互,虽然也有一些枯燥的东西,但是有了写代码的机会,就不是什么问题了。