1、Hello World
下面是一个简单的 Java 应用程序,它会在程序控制台中打印一句话 “Hello World”:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }
这代码看起来非常简单,但对于初学者来说,还是非常值得花一些时间研究的。
首先,Java 是区分大小写的,如果出现大小写拼写错误(如:main 写成 Main)程序将无法运行。
下面,我们就逐行分析一下每行代码的意思。
1.1 类
public class HelloWorld {
在 Java 中这种是形式的写法叫做一个类,class 后面的 HelloWorld 就是类的名字。而开头的 public class 两个词一个是修饰符、一个是关键字(这两个后面介绍)。
那什么是类?在 Java 中它代表一类物体。
哦!还是太抽象,没关系后面在面向对象的时候还会详细说明,在这里只要知道这种形式的写法就是一个类,它的名字叫做 HelloWorld 就行。
就像下面这个类,它的名字就叫做 J3,并且这个类的文件名是必须保存为 J3.java。
public class J3 { }
类名后面是紧跟着一对大括号,大括号里面就是类的内容,那内容中可以放些什么呢!
- 变量
- 方法
1.2 方法
public static void main(String[] args) {
像这种写法,Java 中就叫做方法,public 是方法的访问修饰符,static 是关键字,void 表示方法的返回值是个空(没有返回值),而 main 则表示这个方法的名字,括号里面就是这个方法的参数。
那什么是方法?一种功能,描述类的功能,一段程序的载体。
Java 中的方法必须放在类中,也就是一个方法必须属于某个类,它不能独立存在。
1.3 main 方法
在 Java 应用中,所有的程序都会在主类中找到一个统一入口 main 方法,找到就运行反之则报错(报错信息就是找不到 main 方法)。
main 方法是所有 Java 程序执行的起点,如果我们执行下面代码则会出现如下报错:
public class HelloWorld { public static void j3(String[] args) { System.out.println("Hello World"); } }
上面简单的分析了一个可以执行的 Java 程序应该包括什么,对于很多名词都没有去分析,这个我是打算留在后面的,通过 HelloWorld 程序我们应该具备如下要点:
Java 区分大消息
认识 Java 类大致形式及方法
方法要写在类中
Java 程序入口是 main 方法
2、Java 中的注释
注释可以理解一种说明,可类比操作手册,它的作用可以有利于人们理解程序的意思。也和大多数程序语言一样,Java 中的注释不会出现在可执行程序中。
Java 中,常用的注释方法有三种:
单行注释: // 备注释的文字
多行注释: /* 要注释的文字 */
文档注释: /** 要注释的文字 */
看如下代码,便于理解:
/** * @author J3-西行 * @package cn.baiqi.myjava.helloworld * @createTime 2022/1/11 - 11:49 * @description 一路西行、与君共勉 */ public class HelloWorld { // 这是单行注释 public static void main(String[] args) { /* 这是多行注释 关注 J3 、带你精通各种语言的 Hello World */ System.out.println("Hello World"); } }
3、标识符和关键字
Java 语言和其他编程语言一样,使用标识符作为变量、对象的名字,也提供了系列的关键字用以实现特别的功能。
3.1 分隔符
在了解标识符和关键字之前,先了解一下分隔符。
Java 语言中分号(;)、花括号({})、方括号([])、圆括号(())、空格、圆点(.)都具有特殊的分隔作用,因此被统称为分隔符。
1、分号
Java 中每个语句的结尾都必须使用分号作为结尾。
Java 允许一行书写多个语句,每个语句之间以分号隔开即可;一行语句也可以跨多行,只要在最后结束的地方使用功能分号结束即可。
下面语句都是合法 Java 语句。
String blog = "J3-西行"; String motto = "不必遗憾。若是美好," + "叫做精彩。若是糟糕,叫做经历。"; int age = 18; int height = 180;
虽然 Java 语法允许一行书写多个语句,但从程序可读性角度来看,应该避免在一行书写多个语句。
2、花括号
花括号的作用是定义一个代码块,一个代码块指的是 “{” 和 “}” 所包含的一段代码,代码块在逻辑上是一个整体。
在 Java 中类、方法的定义部分都必须放在一个代码块中。除此之外,条件语句中的条件执行体和循环语句中的循环体通常也放在代码块中。
花括号一般都是成对出现的,有一个 “{” 则必然后一个 “}”,反之也是一样。
3、方括号
这个主要用于数组访问元素,它通常紧跟变量名,而方括号里指定希望访问的数组元素的索引。
例如:
String[] names = new String[5]; names[0] = "J3-西行";
4、圆括号
圆括号是一个功能非常丰富的分隔符:定义方法是必须使用圆括号来包含所有的形参声明,调用方法时也必须使用圆括号来传入实参;不仅如此,圆括号还可以将表达式中某个部分扩成一个整体,保证这个部分优先计算;除此之外,圆括号还可以作为强制类型转换运算符。
5、空格
Java 中使用空格分隔一条语句的不同部分。
Java 语言是一门格式非常自由的语言,只要语句不符合你期望的格式,可以用空格进行任意的调整,但不要使用空格吧一个变量隔开,这将会导致程序报错。
Java 语言中的空格包含空格符(Space)、制表符(Tab)、和回车(Enter)等。
6、圆点
圆点(.)通常用作类 / 对象和它的成员(包括 Field、方法和内部类)之间的分隔符,表面调用某个类或某个实例的制定成员。
3.2 标识符
标识符:用于给程序中变量、类、方法命名的符号。
Java 语言的标识符必须是以字母、下划线(_)、美元符($)开头,后面可以跟任何数目的字母、数字、下划线 和美元符。
标识符中的字母不局限26个英文字母,还可以包含中文字符、日文字符等。
标识符中不可以包含空格,不能使用 Java 关键字和保留字,长度没有限制。
在使用标识符时,要注意如下规则:
- 标识符可以由字母、数字、下划线和美元符组成,其中数字不能开头。
- 标识符不能是 Java 关键字和保留字,但可以包含关键字和保留字。
- 标识符不能包含空格。
- 标识符智能包含美元符,不能包含 @ 、# 等其他特殊字符。
3.3 关键字
Java 中有一些具有特殊用途的单词被称为关键字(keyword),当定义标识符时,不要让标识符和关键字相同,否则将引起错误。
如下程序,会报错:
// Integer 类型的标识符 int 和 Java 中的关键字同名,报错 Integer int = 1;
Java 的所有关键字都是小写,TRUE、FALSE 和 NULL 都不是关键字。
Java 一共包含 48 个关键字,如表。
enum 是从 Java5 新增的关键字,用于定义一个枚举。
其中,保留字(goto、const)的意思是,Java 现在还未使用这两个单词作为关键字,但可能未来的 Java 版本中使用两个单词作为关键字。
Java 还提供了 3 个特殊的直接量:true、false 和 null。
在定义标识符的时候同样不能使用两个保留字和三个直接量。
4、数据类型
经过前面的了解,应该知道 Java 是一种强类型语言,所有声明的变量都必须指明其类型。
Java 中数据类型分为:基本数据类型和引用数据类型两种。
基本数据类型包括数值型(byte、short、int、long、float、double)、字符型(char)、boolean。
引用数据类型包括类、接口和数组类型,还有一些特殊的 null 类型。其实引用类型就是对一个对象的引用,对象包括实例和数组两种,不过,引用类型变量也可以理解为指针,只是 Java 语言不再使用指针这个说法。
4.1 基本数据类型
Java 的基本数据类型分为两大类:boolean 类型和数值类型。
而数值类型又可以分为整数类型和浮点类型,整数类型中的字符类型也是可以被单独分为一类,所以通常把 Java 里的基本数据类型分为 4 类,如图。
字符串不是基本数据类型,字符串类型是一个类,也就是一个引用数据类型。
1、整数类型
通常所说的整型,指的是如下 4 种类型。
byte:一个 byte 在内存里占 1 个字节(1字节 = 8位),表示的的数值范围:-128(-2 ^ 7)~ 127(2 ^ 7 - 1)
short:一个 short 类型整数在内存中占 2 个字节,表示的数值范围:-32768(-2 ^ 15)~ 32767(2 ^ 15 - 1)
int:一个 int 类型整数在内存里占 4 个字节,表示的数值范围:-2147483648(-2 ^ 31)~ 2147483647(2 ^ 31 - 1)
long:一个 long 类型整数在内存中占 8 个字节,表示的数值范围:-9223372036854775808(-2 ^ 63)~ -9223372036854775807(2 ^ 63 - 1)
int 是最常用的整数类型,因此在通常情况下,一个 Java 整数常量默认就是 int 类型。另外,在如下情况是必须指出整数类型。
如果直接将一个较小的整数常量(在 byte 或 short 类型的表数范围内)赋给一个 byte 或 short 变量,系统会自动把这个整数常量当成 byte 或者 short 类型来处理。
如果使用一个巨大的整数常量(超出了 int 类型的数值范围)时,Java 不会自动把这个整数常量当成 long 类型来处理。如果希望系统把一个整数常量当成 long 类型来处理,应该在整数常量后面增加 l 或者 L 作为后缀(推荐 L 因为 l 容易和 1 搞混)。
下面代码验证上面两者情况。
// 这是正确的,在类型数值范围内,系统会自动把 10 当成 byte 类型处理 byte i = 10; /* 这是错误的,系统不会把 99999999999 当成 long,因为整数常量,系统默认类型是 int 而 99999999999 又超过 int 类型数值范围,所以报错 */ long bigValue1 = 99999999999; // 这是对的,在整数常量后面表明 L 表示是 long 类型数据 long bigValue2 = 99999999999L;
2、字符类型
字符类型通常用于表示单个的字符,字符常量必须使用单引号(’)括起来。
Java 语言使用 16 位的 Unicode 字符集作为编码方式,而 Unicode 是支持世界上所有书面语言的字符,包括中文字符,因此 Java 程序支持各种语言的字符。
字符类型常量有如下 3 中表示形式。
- 直接通过单个字符来指定字符型常量,例如:‘A’、‘9’ 和 ‘0’ 等。
- 通过转义字符表示特殊字符型常量,例如:’\n’、’\t’ 等。
- 直接使用 Unicode 值来表示字符型常量,格式是 ‘\uXXXX’,其中 XXXX 代表一个 十六进制的整数。
Java 语言中常用的转义字符如表 3.2 所示、
转义字符 | 说明 | Unicode 表示方式 |
\b | 退格符 | \u0008 |
\n | 换行符 | \u000a |
\r | 回车符 | \u000d |
\t | 制表符 | \u0009 |
\’’ | 双引号 | \u0022 |
\’ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
字符类型常量也可以采用十六进制编码方式表示,范围是 ‘\u0000’ ~ ‘\uFFFF’ ,一共可以表示 65535 个字符,其中前 256 个(’\u0000’ ~ ‘\u00FF’ )字符和 ASCII 马中的字符完全重合。
不仅如此,char 类型的值也可以直接作为整数类型的值来使用,但他是一个 16 位 的无符号整数,即全部是正数,表示范围是 0 ~ 65535。如果把该范围内的一个 int 正数赋值给 char 类型变量,系统会自动把这个 int 类型当成 char 类型来处理。
下面简单示范字符类型变量用法。
public class CharTest { public static void main(String[] args) { // 直接指定单个字符作为字符类型常量 char jChar = 'j'; // 使用转义字符作为字符类型常量 char enterChar = '\r'; // 使用 Unicode 编码值来制定字符类型常量 char ch = '\u6666'; System.out.println(ch); // 定义中文字符类型常量 char name = '西'; // 将 char 类型变为 int 类型使用 int nameInt = name; System.out.println(nameInt); // 直接把 0 ~ 65535 范围内的一个 int 类型赋给 char 变量 char c = 60034; System.out.println(c); } }
3、浮点类型
Java 中浮点类型有两种:float 和 double。
double 类型代表双精度浮点数,float 类型代表单精度浮点数。一个 double 类型的数值占 8 个字节、64位,一个 float 类型的数值占 4 个字节、32 位。
Java 中浮点类型默认是 double 类型,如果希望 Java 吧一个浮点类型值当成 float 类型处理,应该在这个浮点类型后紧跟着 f 或者 F。例如,5.12 代表一个 double 类型的常量,占 64 位的内存空间;5.12f 或者 5.12F 才表示一个 float 类型的常量,占 32 位的内存空间。
下面简单示范浮点类型变量用法。
public class FloatTest { public static void main(String[] args) { // 超过 float 的精度会丢失 float f = 5.121111111111f; // 输出:5.121111 System.out.println(f); // 双精度不会,输出:5.121111111111 double d = 5.121111111111; System.out.println(d); } }
4、布尔类型
布尔型只有一个 boolean 类型,用于表示逻辑上的 “真” 或 “假”。
boolean 类型的数值只能是 true 或 false,不能用 0 或非 0 来代表。其他基本数据类型的值也不能转换成 boolean 类型。
// 定义 true boolean a = true; if (a) { System.out.println("广东最靓的仔 J3"); } // 定义 false boolean b = false; if (b) { System.out.println(" J3 不帅"); }
5、类型转换
Java 程序中,不同的基本类型值经常需要进行相互转换。Java 语言所提供的 7 种数值类型之间可以相互转换,转换方式有两种:自动类型转换和强制类型转换。
5.1 自动类型转换
如果系统支持吧某种基本类型的值直接赋给另一种基本类型的变量,这种方式被称为自动类型转换。
当吧一个数值范围小的数值或变量直接赋给另一个数值范围大的变量时,系统可以进行自动类型转换。
自动转换关系如图。
图中,箭头左边的类型可以自动转换为右边类型,下面看案例。
public class AutoConversion { public static void main(String[] args) { // 定义最小数值类型 byte b = 1; System.out.println(b); // 依次赋值给大数值类型,进行自动转换 short s = b; System.out.println(s); int i = s; System.out.println(i); char c = 'A'; System.out.println(c); int ic = c; System.out.println(ic); long l = i; System.out.println(l); float f = l; System.out.println(f); double d = f; System.out.println(d); } }
5.2 强制类型转换
如果希望吧,上图中箭头右边的类型转换为左边的类型,则必须进行强制类型转换,转换语法格式是:(targetType)value,强制类型转换的运算符是括号(())。
在将大数值范围类型数据强制转换为小数值范围类型时,则会导致数据丢失。
下面看看强制类型转换代码。
public class ForciblyConversion { public static void main(String[] args) { int i = 520; // 强制转换,数据溢出 byte b = (byte) i; System.out.println(b); double d = 1.314; // 强制转换,丢失数据 int dInt = (int) d; System.out.println(dInt); } }
在上面代码中,把一个大数据赋值给小数据类型则会直接导致数据溢出;把一个浮点型数据赋给一直整型数据则会直接截断小数部分。