"Hello, World!"的程序编写

  1. 建立".java"类型文件
     首先在指定的目录下新建一个".txt"类型的文本文档,通过重命名的方式将文件类型更改为".java"类型,文件名即为程序名。
     例如,将建立好的文件命名为"HelloWorld.java"。
  2. 代码的写入、编译和运行
     右键点击"HelloWorld.java"文件,点击"编写",并写入如下代码:
package code_java;

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

 代码第一行里出现的"code_java"是包名,也就是程序文件所在的文件的文件名。这一行代码很重要,关系到之后的编译过程的顺利进行。
 然后进行编译,在键盘上按下"Windows"+"R"键,然后在输入栏中输入"cmd"并按下回车键,出现的窗口即为指令窗口。然后若程序在E盘中,则在指令窗口中输入"E:"并按回车。接着便输入下列代码,便能进行编译了。

E:\>javac code_java\HelloWorld.java

 编译后,源程序所在的目录下会出现一个".class"类型的同名文件,例如"HelloWorld.class"文件。
 接着,在指令窗口输入如下代码,便能运行该程序并得到结果了。

E:\>java code_java.HelloWorld
Hello, World!

注意:上述两行指令中"HelloWorld"为文件名,"code_java"是E盘中的文件夹,程序文件就在该文件夹中。符号"反斜杠"和"点"是引用的意思,如果源程序所在目录较长,那么就需要多次引用。指令在输入的时候务必要注意准确性!

  1. 一些容易出现的错误
     (1) 代码的拼写有错误,如漏掉字母、大小写错误等等;
     (2) 分号的书写要是英文环境下的分号,且不能漏写;
     (3) 尽量不要删除含有包名的代码,否则容易出现"找不到或无法加载主类"的错误。

关键字和标示符

  1. 关键字及其特点
     关键字即是程序中有特殊含义的、被保留的、不能随意使用的一些字符。它有以下2个特点:
     (1) 完全小写的字母;
     (2) 一般会有特殊颜色。(普通记事本中的代码没有颜色)
  2. 标识符(标志符)
     它是指在程序中,自己定义的内容。例如的名字、方法和变量的名字等等。

以下有两类命名要求需要在以后的编程中注意:

  • 硬性要求
     (1) 标识符只能包含:26个英文字母(包括大小写)0-9这十个数字"$"“_”
     (2) 标识符不能以数字开头;
     (3) 标识符不能是关键字。
  • 软性建议
     (1) 命名:首字母大写,之后每个单词首字母大写;
     (2) 变量方法命名:首字母小写,之后每个单词首字母大写。

数据类型

 Java中的数据类型分为基本数据类型引用数据类型两类。基本数据类型又分为整型浮点型boolean型;引用数据类型分为类类型接口类型数组类型。然后还有一个特殊类型就是空类型(null)
 基本数据类型大致又可分为"四类八种":
 (1) 整数型:byteshortintlong
 (2) 浮点型:floatdouble
 (3) 字符型:char
 (4) 布尔型:boolean

 Java中的整数类型通常默认为 int 、浮点类型默认为 double

注意:
1、字符串不是基本类型,而是引用类型;
2、浮点类型只是一个近似值,可能准确,但通常不准确;
3、数据的范围与字节数不一定相关,例如float型数据范围比long更大,但是前者是4字节、后者是8字节;
4、浮点数中默认类型是double型,若一定要使用float型,则需在数据后加上后缀 “F/f” ;整数型中long类型与之相似,需在数据后面加上后缀 “L/l” 。这里推荐使用大写字母作为后缀,方便辨识。

变量、操作符与表达式

1、变量

 变量也就是在程序运行时,内容可以发生改变的量。创建、赋值和使用基本类型的变量和C基本相同,这里就不过多赘述。
 引用类型变量通常保存在某个内存空间的引用(地址),其默认初始值为null。引用类型变量将在后续学习中再提到,这里先放一放。

2、操作符与表达式

 Java中的操作符与C基本相同,区别主要体现在:Java的类型检查比C更为严格,操作符的操作对象会受到更多限制;Java中没有指针操作,却增加了引用类型测试操作符instanceof、无符号右移操作符">>>"、字符串连接操作符"+"等。
 (1) 算术操作符(+、-、*、/、%):都可以作用于整型或浮点型的操作数1
 当两个操作数类型不同时,会出现自动类型转换:若两个操作数中有一个为double类型,则将另一个操作数转化为double类型;否则,若两个操作数中有一个为float类型,则将另一个转化为float类型;否则,若两个操作数中有一个为long类型,则将另一个转化为long类型;否则,两个操作数均转化为int类型。
(double > float > long > int > 其他)

public class BinaryConversion{
	public static void main (String[] args) {
		int i = 0;
		float f = 2.0F;
		double d = 3.0;
		System.out.println(i * f == d);
		//int * float -> float, 然后float == double -> double
	}
}
//输出结果
false

“+” 还可以用来连接两个String类型的字符串。

public class Plus{
	public static void main (String[] args){
		String str1 = "Hello";
		String str2 = "World";
		System.out.println(str1 + str2);

		String str3 = "Java";
		String str4 = "SE";
		System.out.println(str3 + str4 + 1 + 4);
		//String + String + int + int -> String + int + int -> String + int -> String
		System.out.println(str3 + str4 + (1 + 4));
		//String + String + int + int -> String + String + int -> String + int -> String
	}
}
//输出结果
HelloWorld
JavaSE14 //"+"的运算优先级为从左到右
JavaSE5 //"()"的运算优先级最高

 对于字符型(char)来说,在进行计算前会被转化为int型再计算。char和int之间的关系可见ASCII表。

public class Plus{
	public static void main (String[] args){
		char c = 'A';
		System.out.println(c + 1);
		//A对应的ASCII码为65
	}
}
//输出结果
66

 自增 (+ +) 自减 (- -) 运算符:使一个变量增加一个数字1或减小一个数字1。其使用方式如下:
 1、单独使用:不与其他操作混合,自己独立成为一个步骤;
 2、混合使用:与其他操作一起使用。例如与赋值混合、与打印混合等。
 在单独使用的时候,++num 与 num++ 没有区别。
 但在混合使用时,二者有很大区别:"++num" 则变量num立即加1,然后得到新的结果再参与其他操作;“num++” 则先对原来的变量num进行操作,完了以后再对其加1。

public class PPlus{
	public static void main(String[] args){
		int num1 = 10;
		System.out.println(num1);
		++num1;
		System.out.println(num1);
		num1++;
		System.out.println(num1);
		
		System.out.println("___________");

		int num2 = 20;
		System.out.println(++num2);
		System.out.println(num2++);
		System.out.println(num2);
	}
}
//输出结果
10
11
12
___________
21
21
22

 自减 (- -) 与自加类似,这里不再说明。

 (2) 关系操作符
 关系操作符用来比较两个操作数的大小、相等/不等关系。比较的结果是一个boolean值(true/false)。
 在Java中,无论是基本类型的操作数还是引用类型的操作数,均可使用"= =“和”! =“来比较是否相等。对于引用类型的操作数,”= =“和”! ="比较的是引用,而不是两个操作数所指向的对象的内容。该部分内容后续会进一步讲解。
 (3) 逻辑操作符(&& || !)对布尔型数进行逻辑运算,前两个是二元运算符,后一个是一元运算符。
 需要注意的是,与(& &)、或(| |)都具有短路效果,即在运算过程中,以先左后右的顺序依次计算两个操作数的布尔值,如果左侧操作数的布尔值能够完全决定整个逻辑表达式的布尔值,则不再计算右侧的操作数。例如:

public class ShortCircuit{
	public static void main(String[] args){
		int a = 10;
		System.out.println(2 > 3 && ++a < 100);
		System.out.println(a);
		System.out.println("_________");
		int b = 20;
		System.out.println(2 < 3 || ++b < 100);
		System.out.println(b);
	}
}

结果如下:

false
10
_________
true
20

 这里介绍一个三元运算符(变量 = 条件 ? 表达式A : 表达式B),判断条件是否成立,成立将表达式A的结果赋值给左侧变量,反之赋值右侧变量。
 注意,必须保证表达式A和表达式B结果的数据类型都符合左侧变量数据类型的要求。
(4) 赋值操作符
 数值操作符是二元运算符,当两个操作类型不一致时,编译器会进行自行转换。
收缩转换:将大范围类型的数据转换为小范围类型的数据,如将常量转换为byte、char、short类型的变量(这里的转换如果不损失精度则可以自动转换);
扩展转换:如下图箭头指示的转换则为扩展转换,它具有传递性,一般能够自动完成。顺着箭头的转换是合法赋值操作,若不是则需要进行强制类型转换。另外,赋值操作合法也有可能损失精度,当int、long转换为float和long、float转换为double时可能会损失精度,其他则不会。











byte

short

int

long

double

float

char


public class AccuracyLoss{
	public static void main(String[] args){
		int i = 123456789;
		long l = 9123456789000000000L;
		float f;
		double d;

		f = i;
		System.out.println(f);
		f = l;
		System.out.println(f);
		d = l;
		System.out.println(d);
		f = 1.23F;
		d = f;
		System.out.println(d);
	}
}

输出结果如下,每个赋值都有精度损失:

1.23456792E8
9.1234567E18
9.1234567889999995E18
1.2300000190734863

控制流

数组

后续更新中


  1. C语言中取余操作(%)只能作用与整型数据。 ↩︎