HELLO WORLD
public class Hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello!");
System.out.println("你好!");
}
}
Java程序是大小写敏感的。大写字母和小写字母被认为是不同的。
Java中的语句以分号作为语句结束符,标志语句结束。
这段程序声明了一个类。从狭义的角度说,声明和定义是不同的。声明只是说有这么个东西,而定义除了要说明有这么个东西外,还要定义出这个东西具体是什么。而从广义的角度讲,声明既包括说明性声明,也包括定义性声明。Java把定义性声明和说明性声明都从广义的角度统称为“声明”。
类声明由两部分组成:类的头部和类体。
方法的声明也由两部分组成:方法的头部和方法体。
main()方法是一个非常特殊的方法。Java规定:
第一,main()方法的头部的格式是固定格式,必须这样写,必须把它声明为公有的、静态的,且返回值为空。
这样说不严格,实际上可能会有一些变化,但最开始学的时候,你就把它当作固定格式就好,需要有变化的时候再说。
第二,一个Java程序可能包含了很多类,Java约定,这些个类中至少要有一个类包含这个main()方法。并且把包含main()方法的类称为这个程序的主类。
第三,Java程序的入口就是这个main()方法,也就是,程序的主流程从main方法的第一条语句开始执行,从前往后依次执行main()方法的方法体中的语句,等最后一条语句执行完了,遇到标志main()方法的方法体结束的大括号后,主流程执行结束。
同样要注意:这么说也不严格,但你就简单地这么理解,没问题。
Unicode 转义(Unicode Escapes)
• 像C/C++一样,Java语言也可以使用转义序列(Escape Sequences)表示字符。
转义序列是一个字符序列,当它用在字符字面量或字符串字面量的时候,它不代表它自己,而是被变换成另一个字符或字符序列,而那个字符或字符序列是难以表示或无法直接表示的。
• 转义字符是有用的
Java 语言中有些字符有特定意义(不能当作普通字符使用);或者有些字符不能显示,如果要把这些字符当作普通字符使用,则需要“转义”。
Java的Unicode转义的表示方法:用ASCII字符”\”和”u”开头,后接4位十六进制数,如图2.1所示。
图2.1 转义序列的格式
例如,\u005a表示字符Z
• Java编译器对Unicode转义字符的处理
在编译的时候,Java编译器先识别ASCII字符\u及其后面的4位十六进制数所表示的UTF-16码元,而其他字符保持原样,之后再做其他处理。
一个使用Unicode转义字符的例子。
/ Escape.java / package com.buptnu.demo; public class Escape { public static void main(String[] args) { System.out.println(“\u005a”); } }
运行结果:
行终止符
Java编译器会把程序中的字符分为两类
LineTerminator: the ASCII LF character, also known as “newline” the ASCII CR character, also known as “return” the ASCII CR character followed by the ASCII LF character InputCharacter: UnicodeInputCharacter but not CR or LF
Java编译器识别出行终止符,其他的都作为输入符号进行处理。
分隔符
• 分隔符用来区分源程序中的基本成分,可使编译器确认代码在何处分隔。
• 分隔符有注释、空白、和普通分隔符三种。
a) 注释
- 注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。
- 编译器忽略注释。
- 单行注释 //
- 多行注释 / /
- doc注释。注释以标记”/“开始,到标记”*/“结束,内容位于其中。
doc注释是Java特有的。这种注释主要是为支持JDK工具javadoc而采用的。javadoc能识别注释中用标记”@”识的一些特殊变量,并把doc注释加入它生成的HTML文件中。
b) 空白符
- 空白符的组成:包括ASCII空格、水平制表符(Tab)和行终结符。
- 空白符的作用:用于程序中各种基本成分之间的分隔。各基本成分之间可以有一个或多个空白符,其作用相同。
- 编译器对空白符的处理,只是把空白符作为基本符号和词的分隔标记。也就是,系统编译时,只用空白符之间的Java语言基本成分,忽略空白符。
c) 普通分隔符**
- 普通分隔符的组成:Java有4种普通分隔符:
(1){ }大括号,用来定义复合语句、方法体、类体及数组的初始化;
(2);分号,是语句结束的标志;
(3),逗号,分隔方法的参数和变量说明等。
(4):冒号,说明语句标号。
- 作用:用来区分程序中的各种基本成分。
- 编译器对普通分隔符的处理:普通分隔符在程序中有确定的含义,系统编译时,会用到它们的确定含义,所以编译时不能忽略。
标识符
• 标识符用于命名程序对象,例如类名、变量名、方法名等,用作它们的“标识”
• 标识符的命名规则(必须的)
- 标识符是由Java字母和数字组成的序列
- 标识符的首字母必须是Java字母
- 标识符没有长度限制
• 给标识符命名的编程约定(不是必须的)
- 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:
ThisIsAClassName
thisIsMethodOrFieldName
- 常量用大写字母
- 下划线虽然可以作为标识符的一员,但常用于常量名的分隔。
- Java 包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词也是如此。例如:
com.butpnu.deoms
关键字
• 关键字,也称保留字,是Java语言本身使用的标识符,它有其特定的语法含义。
• 所有的Java关键字都不能当作一般的标识符使用。
• 例如:class void int public 是关键字
而main不是关键字
Java的关键字(保留字)如下:
字面量(Literals)
• 顾名思义,字面量就是字面上是什么值它就是什么值。
• 字面量是程序中要用到的预先定义的量
- 例如,一个管理机场附近区域空中交通的程序,也许要多次引用一些关于机场的海拔高度的数据。当编写这样一个程序的时候,每次需要用这个数据时,我们都需要以数字的形式将其引入——例如645m。这样一个以一种显式形式出现的值就是字面量。
• Java中字面量的类型
- 整数字面量
- 浮点数字面量
- 布尔字面量
- 字符字面量
- 字符串字面量
- 字符字面量和字符串字面量的转义序列
- 空字面量(null)
- 普通分隔符
- 运算符(操作符)
= < > + - * / 等
Java源程序文件的结构
• package语句,//0个或1个,必须放在文件的开始,作用是把当前文件中定义的类和接口,放入指定的程序包中。如果没有用package语句指定把当前文件中的类和接口编译到哪个包中,则这些东西会放在无名包中。
• import语句,//0个或多个,必须放在所有类定义之前,作用是引入标准类或已有类。
• public classDefinition,//0个或1个,如果一个源程序文件中有一个公有类,则文件名必须与该类的类名完全相同;如果没有公有类,则源程序文件名不受限制。
• classDefinition,//0个或多个,非公有类定义的个数不受限制
• interfaceDefiniton,//0个或多个,接口定义的个数不受限制
• 注释语句,//0个或多个,注释可以放在程序的任何位置
Java的编译单元
Java 的一个源文件通常叫做一个“编译单元”(有时也叫做“翻译单元”)。
每个编译单元都必须有一个以.java 结尾的名字。在编译单元的内部,可以有一个公有(public)类,而且最多只有一个共有类。
编译单元的其他非共有类,用于主public 类的“支撑”。
编译一个.java 文件时,编译器会为此源文件中的每个类(和接口)单独生成一个.class文件,且每个.class文件的文件名就是该类的类名。
因此,当你编译少量的.java 文件里时有可能获得数量众多的.class 文件。
一个有效的Java程序就是一系列.class 文件,你可以把它们就那样单独放着,也可把它们封装和压缩到一个JAR 文件里(Java归档文件)。
Java 解释器运行程序是,负责对这些文件的寻找、装载和解释。
用Eclipse开发Java程序的时候,往往是在项目中创建一个类,一个类放到一个源程序文件,但那只是Eclipse它自己的习惯,不代表Java本身是那么约定的。
一个展示程序结构与编译单元的例子
/* InterfaceApp.java */
interface Shapes
{
public final static double PI = 3.14159;
public abstract double getArea();
public abstract double getPerimeter();
}
class Circle implements Shapes
{
private double radius;
Circle(double radius) { this.radius = radius; }
public double getArea() { return (PI * radius * radius); }
public double getPerimeter() { return (2 * PI * radius); }
}
class Rectangle implements Shapes
{
private double width;
private double height;
Rectangle (int width,int height) { this.width = width; this.height = height; }
public double getArea() { return (width * height); }
public double getPerimeter() { return (2 * width + 2 * height); }
}
class GCalculator
{
void print(Shapes obj)
{
System.out.println(obj.getArea());
System.out.println(obj.getPerimeter());
}
}
public class InterfaceApp
{
public static void main(String[] args)
{
Circle objC = new Circle(3);
Rectangle objR = new Rectangle(2, 3);
GCalculator cal = new GCalculator();
cal.print(objC);
cal.print(objR);
}
}