3.1 一个简单的Java应用程序
- java大小写敏感
public
关键字为访问修饰符,用于控制程序的其他部分对于这段代码的访问级别- 关键词
class
表示java程序中的全部内容都包含在类中。只需要把类作为一个加载程序逻辑的容器,程序逻辑定义了应用程序的行为。java应用程序中的全部内容都必须放置在类中。 - 关键词
class
后面紧跟类名,java类名要求以大写字母开头的名字,驼峰式命名,FirstSample,原则上不允许出现下划线 - java源代码的文件名必须与公有类的名字相同,并且用.java作为后缀名。因此该源代码存储的文件名为FirstSample.java
- 每个java应用程序都必须要有一个
main
方法,一般main
方法的访问修饰符都是public
public class FirstSample {
public static void main(String[] args){
System.out.println("javaLearn hello"); // 输出换行
System.out.print("hello"); // 输出不换行
System.out.print("hello");
}
}
java调用的通用方法如下,点号用于调用方法。
object.method(parameters)
如示例即为System.out对象调用其println和print方法
3.2 注释
- 单行注释
//
- 多行注释,不可嵌套
/*
*/
- 长篇注释,可用于自动生成文档,一般作为java源代码的头部注释
/**
*/
3.3 java的8种基本数据类型
java是强类型语言,必须为每一个变量声明一种类型,java有8种基本数据类型
在java中,所有数值类型所占据的字节数与平台无关
1. 整型(4种),用于表示没有小数部分的数值,允许负数。
int
(4字节)short
(2字节)long
(8字节)
长整型数值有一个后缀L,如40000000000L
十六进制数值有一个前缀0x,如0xCAFE
八进制数值有一个前缀0,如010对应十进制的8,(容易混淆最好不用八进制)byte
(1字节)
2. 浮点类型(2种),用于表示有小数部分的数值。
float
(4字节)单精度浮点数double
(8字节)双精度浮点数
float类型的数值有一个后缀F,如3.402F
没有后缀F的浮点数值默认为double类型,也可以添加后缀D
特殊浮点数:Double.POSITIVE_INFINITY
表示正无穷大;Double.NEGATIVE_INFINITY
表示负无穷大;Double.NaN
表示NaN,即不是一个数字;Double.isNaN(3.14)
,用于判断3.14是否为数字
3. 字符类型char
,表示Unicode编码的字符单元
char类型用于表示单个字符,通常用来表示字符常量。
char类型常量用单引号表示,如:'A’是编码为65所对应的字符常量。与双引号的"A"不同,"A"是一个包含字符A的字符串。
除了可以采用转义序列符\u表示Unicode代码单元的编码,还有一些用于表示特殊字符的转义序列符。
在Java中,char类型用UTF-16编码描述一个代码单元。
我们强烈建议不要在程序中使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示
4. 布尔类型boolean
,用于表示真值,true/false
,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换(c语言中非0位true,0为false)。
3.4 变量
- java的变量名必须是一个以字母开头的由字母或数字构成的序列。
- 不能将变量名命名为Java保留字。
- 尽量不要在一行中声明多个变量,逐一声明每个变量可以提高程序可读性。
3.4.1 变量初始化
- 声明一个变量之后,必须用赋值语句对变量进行显式初始化,否则无法使用。也可以变量的声明和初始化放在一行里。
int vacationDays;
vacationDays = 12;
int vacationDays = 12;
- 在Java中,变量的声明尽可能地靠近变量第一次使用的地方,这是一种良好的程序编写风格
3.4.2 常量
- 使用关键字
final
声明常量,且只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用大写。
public class FirstSample {
public static void main(String[] args){
final double CM_PER_INCH = 2.54;
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters: "+
paperWidth * CM_PER_INCH + " by " + paperHeight *CM_PER_INCH);
}
}
Paper size in centimeters: 21.59 by 27.94
- 在Java中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字
static final
设置一个类常量。 - 需要注意,类常量的定义位于main方法的外部。因此,在同一个类的其他方法中也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量,即
public static final
public class FirstSample {
public static void main(String[] args){
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters: "+
paperWidth * CM_PER_INCH + " by " + paperHeight *CM_PER_INCH);
}
public static final double CM_PER_INCH = 2.54;
}
3.5 运算符
- 在Java中,使用算术运算符
+、-、*、/
表示加、减、乘、除运算。 - 当参与
/
运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。 - 整数的求余操作(有时称为取模)用
%
表示。例如,15/2等于7,15%2等于1,15.0/2等于7.5。 - 需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。
- 可以在赋值语句中采用一种简化的格式书写二元算术运算符。
例如,x += 4;
等价于x = x + 4;
(通常,将运算符放在赋值号的左侧,如*= 或 %=。)
3.5.1 自增与自减运算符
++m 先加1后计算
m++ 先计算后加1
3.5.2 关系运算符与boolean运算符
- 检测相等
==
- 检测不相等
!=
- 逻辑与
&&
- 逻辑或
||
- 逻辑非
!
&&
和||
是按照“短路”方式求值的。如果第一个操作数已经能够确定表达式的值,第二个操作数就不再计算。 - Java支持三元操作符
?:
condition ? expression1 : expression2
3.5.3 位运算符
在处理整型数值时,可以直接对组成整型数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位。
& // and
| // or
^ // xor
~ // not
<< // 左移
>> // 右移,用符号位填充高位,算术移位
>>> // 右移,用0填充高位,逻辑移位
3.5.4 数学函数与常量
import static java.lang.Math.*; // 通过静态导入Math类,就不必再方法名和常量名前面添加前缀"Math"
public class FirstSample {
public static void main(String[] args){
// 常用数学计算类:Math类
System.out.println(Math.sqrt(4)); // 2.0 4的平方根
System.out.println(Math.pow(2, 5)); // 32.0 2的5次方
System.out.println(Math.exp(1)); // 2.718281828459045 指数函数
System.out.println(Math.log(10)); // 2.302585092994046 以e为底的log
System.out.println(Math.log10(10)); // 1.0 以10为底log
System.out.println(PI); // π 3.141592653589793
System.out.println(E); // 自然常量e 2.718281828459045
System.out.println(Math.round(9.99)); // 对9.99进行四舍五入,输出10
System.out.println(Math.sqrt(PI)); // 不使用静态导入 1.7724538509055159
System.out.println(sqrt(PI)); // 使用静态导入 1.7724538509055159
}
}
Math.round(x)
返回最接近x的整数,返回的结果为long类型,若有两个返回接近的整数,则取最大的那个.
int[] test = {
Math.round(2.4f), // 2
Math.round(2.5f), // 3, 2和3取大的3
Math.round(2.6f), // 3
Math.round(-2.4f), // -2
Math.round(-2.5f), // -2, -2和-3取大的-2
Math.round(-2.6f) // -3
};
for(int i = 0; i< test.length; i++)
{
System.out.print(test[i]+",");
}
3.5.5 数值类型之间的转换
数值类型之间的合法转换中,标红的三个转换(int --> float)(long --> float) (long --> double), 可能会有精度损失。
int j = 123456789;
float f = j;
System.out.println("j=" + j + " f=" + f);
输出结果如下,丢失了精度(小数点后第七位)
j=123456789 f=1.23456792E8
当使用上面两个数值进行二元操作时(例如n + f,n是整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算。
• 如果两个操作数中有一个是double类型的,另一个操作数就会转换为double类型。
• 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型。
• 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
• 否则,两个操作数都将被转换为int类型。
3.5.6 强制类型转换
强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。
// 强制类型转换 (目标类型)
double x= 3.856;
int nx = (int) x;
System.out.println("x=" + x + ",nx=" +nx); // x=3.856,nx=3
// 四舍五入求最接近的整数,用Math.round(),返回类型为long
long ny = Math.round(x);
System.out.println("x=" + x + ",ny=" +ny); // x=3.856,ny=4
// 需要int则使用显式的强制类型转换将long转换为int
int nz = (int)Math.round(x);
System.out.println("x=" + x + ",nz=" +nz); // x=3.856,nz=4
如果想对浮点数进行舍入运算,以便得到最接近的整数(在很多情况下,希望使用这种操作方式),那就需要使用Math.round方法。
Math.round() 方法返回值为long类型,如图所示如果定义变量ny为int,则会提示错误,需要在Math.round()之后进行强制类型转换。
3.5.7 括号与运算符级别
// 3.5.7 括号与运算符级别
int aa=1,bb=1,cc=1;
System.out.println("aa=" + aa + ",bb=" +bb + ",cc=" + cc); // aa=1,bb=1,cc=1
aa += bb += cc; // +=是右结合运算符,等同于 aa += (bb += cc)
System.out.println("aa=" + aa + ",bb=" +bb + ",cc=" + cc); // aa=3,bb=2,cc=1
关系运算符的 instanceof
操作符用于判断一个引用类型所引用的对象是否是一个类的实例。操作符左边的操作元是一个引用类型,右边的操作元是一个类名或者接口,形式如下:
obj instanceof ClassName
或者 obj instanceof InterfaceName
关系运算符产生的结果都是布尔型的值,一般情况下,在逻辑与控制中会经常使用关系运算符,用于选择控制的分支,实现逻辑要求。
(????)关系运算符中的"==
“和”!=
"既可以操作基本数据类型,也可以操作引用数据类型。操作引用数据类型时,比较的是引用的内存地址。所以在比较非基本数据类型时,应该使用equals
方法。
3.5.8 枚举类型
有时候,变量的取值只在一个有限的集合内。例如:销售的服装或比萨饼只有小、中、大、超大这四种尺寸。这种情况下,可以自定义枚举类型。枚举包括有限个命名的值。枚举一般用大写表示;