"Hello, World!"的程序编写
- 建立".java"类型文件
首先在指定的目录下新建一个".txt"类型的文本文档,通过重命名的方式将文件类型更改为".java"类型,文件名即为程序名。
例如,将建立好的文件命名为"HelloWorld.java"。 - 代码的写入、编译和运行
右键点击"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) 代码的拼写有错误,如漏掉字母、大小写错误等等;
(2) 分号的书写要是英文环境下的分号,且不能漏写;
(3) 尽量不要删除含有包名的代码,否则容易出现"找不到或无法加载主类"的错误。
关键字和标示符
- 关键字及其特点
关键字即是程序中有特殊含义的、被保留的、不能随意使用的一些字符。它有以下2个特点:
(1) 完全小写的字母;
(2) 一般会有特殊颜色。(普通记事本中的代码没有颜色) - 标识符(标志符)
它是指在程序中,自己定义的内容。例如类的名字、方法和变量的名字等等。
以下有两类命名要求需要在以后的编程中注意:
- 硬性要求
(1) 标识符只能包含:26个英文字母(包括大小写)、0-9这十个数字、"$" 和 “_”;
(2) 标识符不能以数字开头;
(3) 标识符不能是关键字。 - 软性建议
(1) 类命名:首字母大写,之后每个单词首字母大写;
(2) 变量和方法命名:首字母小写,之后每个单词首字母大写。
数据类型
Java中的数据类型分为基本数据类型和引用数据类型两类。基本数据类型又分为整型、浮点型和boolean型;引用数据类型分为类类型、接口类型和数组类型。然后还有一个特殊类型就是空类型(null)。
基本数据类型大致又可分为"四类八种":
(1) 整数型:byte short int long
(2) 浮点型:float double
(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
控制流
数组
后续更新中
- C语言中取余操作(%)只能作用与整型数据。 ↩︎