JAVA
关键字
Java关键字是Java语言保留供内部使用的,如 class 用于定义类。 关键字也可以称为
保留字,它们的意思是一样的。是被系统征用的特殊单词(标识符),而且是被广大程
序员所认知的。
关键字 : Java关键字是Java语言保留供内部使用的特殊单词,已经在使用 public公共的 class
关键字会变色
关键字全部小写
保留字 : 是Java语言保留供内部使用的特殊单词,但是现在还没有被使用,所以叫做保留 goto const
注意: 关键字和保留字都不能被使用
关键字列表:
goto和const作为保留字存在。
类似于Notepad++这样的高级记事本会对关键字有特殊颜色标记
注意 :不能使用关键字作为变量名或方法名**
public class Demo03{
public static void main(String[] args){
int public = 123;
System.out.println(123);
}
}
标识符
就是给类,接口,方法,变量等起名字的字符序列。用来查找、定位、标明、唯一确认内容。
表示类名的标识符用大写字母开始。如: Man , GoodMan
表示方法和变量的标识符用小写字母开始,后面的描述性词以大写开始。 eat() , eatFood()
ava 标识符有如下命名规则:
- 标识符必须以字母、下划线_ 、美元符开头。
- 标识符其它部分可以是字母、下划线“_”、美元符“ ”和数字的任意组合。
- Java 标识符大小写敏感,且长度无限制。
- 不可以是Java的关键字
JAVA不采用通常语言使用的ASCII字符集,而是采用unicode这样的标准的国际字符集。因此,这里的字母的含义:英文、汉字等等。(不建议大家使用汉字来定义标识符!)
- 合法的标识符
int a = 3;
int _123 = 3;
int $12aa = 3;
int 变量1 = 55;
- 不合法的标识符
int 1a = 3; //不能用数字开头
int a# = 3; //不能包含#这样的特殊字符
int int = 3; //不能使用关键字
变量(variable)
我们通过变量来操纵存储空间中的数据,变量就是指代这个存储空间!空间位置是确定的,但是里面放置什么值不确定!
**Java是一种强类型语言,**每个变量都必须声明其类型。
-
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
-
变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储单元,声明格式
为: type varName [=value] ; -
注意事项:
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
- 变量名必须是合法的标识符。
- 变量声明是一条完整的语句,因此每一个声明都必须以分号结束。
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
-
变量声明举例
double salary ;
boolean done;
long earthPopulation ;
int age ;
- 可以在一行中声明多个变量
int i ,j; // both are integer
不提倡这种风格,逐一声明每一个变量可以提高程序可读性
- 可以将变量的声明和初始化放在同一行中,例如
int age = 18;
float e = 2.718281828f;
-
变量可划分为
-
局部变量(lacal variable) :方法或语句块内部定义的变量。生命周期是从声明位置开始到 } 为止。
在使用前必须先声明和初始化(赋初值)
public void incorrectLocalV() {
int i;
i=10;
int j = i+5 ; // 编译出错,变量i还未被初始化
}
-
实例变量(成员变量 member variable):方法外部、类的内部定义的变量。从属于对象,生命周期伴随对象始终
如果不自行初始化,他会自动初始化成该类型的默认初始值(数值型变量初始化成0或0.0,字符型变量的初始化值是16位的0,布尔型默认是false)
-
静态变量(类变量 static variable):使用static定义。 从属于类,生命周期伴随类始终,从
类加载到卸载。 (注:讲完内存分析后我们再深入!先放一放这个概念!) 如果不自行初始化,他会自动初始化成该类型的默认初始值(数值型变量初始化成0或0.0,字符型变量的初始化值是16位的0,布尔型默认是false)
常量(Constant)
常量:初始化(initialize)后不能再改变值!
public class Constants {
public static void main(String[] args) {
final double PI = 3.14;
// PI = 3.15; //error
double r = 4;
double area = PI * r * r;
double circle = 2 * PI * r;
System.out.println("area = " + area);
System.out.println("circle = " + circle);
}
}
命名规则(规范)
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则 : monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则: Man, GoodMan 基本数据类型(primitive data type)
- 方法名:首字母小写和驼峰原则: run(), runRun(
基本数据类型(primitive data type)
- Java是一种强类型语言,每个变量都必须声明其类型。
- Java的数据类型分为两大类:基本类型(primitive type)和引用类型(reference type)
- Java中定义了3类8种基本数据类型
- 逻辑型-boolean
- 文本型- char
- 数值型- byte, short, int, long, float, double
- 逻辑型-boolean
注:引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!
. 整型变量
整型用于表示没有小数部分的数值,它允许是负数。
整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。于此相反,C和C++程序需要针对不同的处理器选择最有效的整形
Java 语言整型常数的三种表示形式:
- 十进制整数,如:99, -500, 0。
- 八进制整数,要求以 0 开头,如:015。
- 十六进制数,要求 0x 或 0X 开头,如:0x15 。
Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:
long a = 55555555; //不出错,在Int表示的范围内(21亿内)。
long b = 55555555555;//不加l出错,已经超过int表示的范围
报错:
The literal 55555555555 of type int is out of range
Java中没有无符号类型
浮点型
-float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很
难满足需求。
- double表示这种类型的数值精度是float类型的两倍,又被称作双精度,绝大部分应用程序都采
double类型。
Java 浮点类型常量有两种表示形式
十进制数形式,例如:
3.14 314.0 0.314
科学记数法形式,如
314e2 314E2 314E-2
float 类型的数值有一个后缀 F|f ,没有后缀 F|f 的浮点数值默认为 double 类型。也可以在浮点数值
后添加后缀 D|d , 以明确其为double类型:
浮点类型float, double的数据不适合在不容许舍入误差的金融计算领域。 如果需要进行不产生舍
入误差的精确数字计算,需要使用BigDecimal类。
主要理由:由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存
在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于。
二进制浮点数不能精确的表示0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的
用二进制浮点数表示。最好完全避免使用浮点数比较:
double f = 314e2; //31410^2-->31400.0
double f2 = 314e-2; //31410^(-2)-->3.14
float f = 0.1f;
double d = 1.0/10;
System.out.println( f d); //false
float d1 = 423432423f;
float d2 = d1+1;
if(d1 d2){
System.out.println("d1==d2");
}else{
System.out.println("d1!=d2");
}
大数值:
Java.math下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理
任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任
意精度的浮点运算。
浮点数使用总结:
- 默认是double
- 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入
误差的精确数字计算,需要使用BigDecimal类。
避免比较中使用浮点数
字符型(2个字节
- 单引号用来表示字符常量。例如 ‘A’ 是一个字符,它与 “A” 是不同的, “A” 表示含有一个字符的
字符串。 - char 类型用来表示在 Unicode 编码表中的字符。
- Unicode 编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536 个字符;ASCII码占1个字节,可允许有128个字符,是Unicode编码表中前128个字符。
char eChar = 'a';
char cChar ='中';
- Unicode具有从0到65535之间的编码,他们通常用从 ’\u0000’ 到 ’\uFFFF’ 之间的十六进制值来表
示(前缀为u表示Unicode)
char c = '\u0061';
- Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义
char c2 = '\n'; //代表换行符 •
注:以后我们学的String类,其实是字符序列(char sequence)
boolean类型(一位,不是一个字节):
- boolean类型有两个值,true和false,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不
同。 - boolean 类型用来判断逻辑条件,一般用于程序流程控制 。
boolean flag ;
flag = ………;
if(flag) {
// true分支
} else {
// false分支
}
实践:Less is More!!请不要这样写:if ( is == true && done == false ) ,只有
新手才那么写。 对于任何程序员 if ( whether && !done ) 都不难理解吧。所以去
掉所有的==fasle 和 ==true
类型转换
自动类型转换
- 自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。在图中,黑色的实线表示无数据丢失的自动类型转换,而红色的虚线表示在转换时可能会精度的损失。
- 特例: 可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围
short b = 12; //合法
short b = 1234567; //非法
强制类型转换
- 强制类型转换(Cast): 强制类型转换,又被称为造型,用于显式的转换一个数值的类型. 在有可
能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。 - 强制类型转换的语法格式: (type)var ,运算符“()”中的type表示将值var想要转换成的目标数据类
型。
double x = 3.14;
int nx = (int)x; //值为3
char c = 'a';
int d = c+1;
System.out.println(d);
System.out.println((char)d);
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。
int x = 300;
byte bx = (byte)x; //值为44
不能在布尔类型和任何数值类型之间做强制类型转换
基本类型转化时常见错误和问题
操作比较大的数时,要留意是否溢出,尤其是整数操作时。
int money = 1000000000; //10亿
int years = 20;
int total = money*years; //返回的是负数
long total1 = money*years; //返回的仍然是负数。默认是int,因此结果会转成int值,再转成
long。但是已经发生了数据丢失
long total2 = money*((long)years); //先将一个因子变成long,整个表达式发生提升。全部用
long来计算。
L和l 的问题
不要命名名字为 l 的变量
long 类型使用大写 L 不要用小写。
int l = 2;
long a = 23451l;
System.out.println(l+1);
随机生成
Math 类提供了一个名叫 random 的方法, 可以随机生成 [0,1) 之间的任意double类型的数据
double i = Math.random();
double j = Math.random();
- 通过扩大和平移可以生成任意区间的数据
- 通过强转可将小数取整
public class Ran{
public static void main(String[] arges){
//[6,11)
System.out.println((int)(Math.random()*(11-6)+6));
System.out.println((int)(Math.random()*(11-6)+6));
System.out.println((int)(Math.random()*(11-6)+6));
System.out.println((int)(Math.random()*(11-6)+6));
System.out.println((int)(Math.random()*(11-6)+6));
System.out.println((int)(Math.random()*(11-6)+6));
}
}
public static void main(String[] arges){
//[6,11)
System.out.println((int)(Math.random()(11-6)+6));
System.out.println((int)(Math.random()(11-6)+6));
System.out.println((int)(Math.random()(11-6)+6));
System.out.println((int)(Math.random()(11-6)+6));
System.out.println((int)(Math.random()(11-6)+6));
System.out.println((int)(Math.random()(11-6)+6));
}
}