2.数据类型和字符
2.1标识符Identifier
• 作用 • 常量、变量、方法、类和包等的名称
• 命名规则 • 必须以字母、_下划线、美元符$开头。
• 其它部分可以是字母、下划线“ _”、美元符“$”和数字的任意组合
• 大小写敏感,长度无限制。
• 不可以是Java的关键字。
• 注意 • Java不采用通常语言使用的ASCII字符集
• Java采用unicode这样的标准的国际字符集。因此,这里的字母的含义: 英文、汉字等等。(不建议大家使用汉字来定义标识符!)
/**
* 测试标识符的用法
* @author lh
*
*/
public class TestIdentifer {
public static void main(String[] args) {
int a123=1;
//int 1adas=b;数字不能开头
int $a=2;
int _d=1;
//int #a=1;
int 年龄=10;//可以使用汉字但是一般不建议
// int class =2;
}
}
2.2Java基本数据类型
• Java是一种强类型语言
• 常量是有数据类型的
• 变量都必须声明其数据类型
2.3常量和变量
• 常量变量定义
• 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变, 有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量。
• 变量举例:
• 在2D游戏程序中,需要代表人物的位置,则需要2个变量,一个是x坐标,一个是y坐标,在程序 运行过程中,这两个变量的值会发生改变
• 常量举例
• 代表常数,便于程序的修改(例如:圆周率的值)
• 增强程序的可读性(例如:常量UP、DOWN、LEFT和RIGHT分辨代表上下左右,其数值分别是1、 2、3和4)
• 在实际的程序中,可以根据数据在程序运行中是否发生改变,来选择应该是使用变量代 表还是常量代表。
/**
* 测试常量
* @author lh
*
*/
public class TestConstant {
public static void main(String[] args){
int age=18;
final String name="pipi";
final double PI=3.14;
//PI=3.15;编译错误,不能在被赋值
double r=4;
double area =PI*r*r;
double circle =2*PI*r;
System.out.println("area="+area);
System.out.println("circle="+circle);
}
}
• Java是一种强类型语言,每个变量都必须声明其类型。
• Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
• 变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储单元,
声明格式为:
• type varName [=value] [{,varName[=value]}] ;
• 注意事项:
• 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
• 变量名必须是合法的标识符。
/**
* 测试变量
* @author lh
*
*/
public class TestVariable {
int a; //成员变量,从属于对象,成员变量会自动被初始化
static int size; //静态变量,从属于类
public static void mian(String[] args) {
{
int age;//局部变量,从属于方法
age=1;
}
int salary=13;//局部变量,从属于方法
int ago=2;
System.out.println(ago);
int i;
//int j=i+1;//编译出错,变量未被初始化
}
}
2.4变量声明
• 变量声明举例:
• double salary ;
• boolean done;
• long earthPopulation ;
• int age ;
• 可以在一行中声明多个变量:
• int i ,j; // both are integers • 不提倡这种风格,逐一声明每一个变量可以提高程序可读性。
• 可以将变量的声明和初始化放在同一行中,例如:
• int age = 18;
• float e = 2.718281828f;
2.5整型数据类型
• 整型常量
• 十进制整数,如:99, -500, 0
• 八进制整数,要求以 0 开头,如:015
• 十六进制数,要求 0x 或 0X 开头,如:0x15
• 整型变量
• 整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ‘(建议使用大写,小写容易误 认为数字1),如:
• long a = 55555555; //不出错,在Int表示的范围内(21亿内)。
• long b = 55555555555;//不加l出错,已经超过int表示的范围。
import java.math.*;
/**
* 测试基本数据类型
* @author lh
*
*/
public class TestPrimitiveDtaType {
public static void main(String[]args) {
//测试整型变量
int a = 15;
int b = 015; //以0开头
int c =0x15; //以0x开头
int d =0b1101;//以0b开头
System.out.println(b);
System.out.println(c);
System.out.println(d);
byte ago = 30;
short salary = 30000;
int population = 200000000; //整型常量默认值时int类型
long globalPopulation = 7400000000L; //后面加L表示这是一个类型的常量
//测试浮点型变量
float r=3.14f;
double y=6.28;
double u=628E-2;
System.out.println(u);
float q=0.1f;
double w=1.0/10;
System.out.println(q==w);//浮点型型不准确不要用于比较
float d1=4343434342323f;
float d2=d1+1;
if(d1==d2){
System.out.println("d1==d2");
}
else {
System.out.println("d1!=d2");
}
//使用精确运算 BigDeciaml
BigDecimal bd = BigDecimal.valueOf(1.0);
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
System.out.println(bd);
System.out.println(1.0-0.1-0.1-0.1-0.1-0.1);
BigDecimal bd2 = BigDecimal.valueOf(0.1);
BigDecimal bd3 = BigDecimal.valueOf(1.0/10.0);
System.out.println(bd3);
//测试字符类型
char j = 'T';
char h = '汕';
char k = '\u0061';
System.out.print(c);
//转义字符
System.out.print(""+'a'+'b');
System.out.print(""+'a'+'\t'+'b');
System.out.print(" "+'a'+'\''+'b');
String l ="abc";
//测试字符类型
boolean man=true;
if(man) { //不推荐man==true
System.out.println('\n'+"男性");
}
}
}
2.6浮点型数据类型
• 浮点类型常量
• 十进制数形式,例如:
• 3.14 314.0 0.314
• 科学记数法形式,如
• 314e2 314E2 314E-2
• double f = 314e2; //314*10^2–>31400.0
• double f2 = 314e-2; //314*10^(-2)–>3.14
• 浮点型变量
• float类型:单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。(4个字节)
• double类型:双精度类型 精度是float类型的两倍,绝大部分应用程序都采用double类型。(8个字节)
• 注意
• 浮点常量默认为double。要变为float,需在后面增加F/f. 如: 3.14F
• 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用 BigDecimal类。
2.7字符数据类型(2个字节)
• **单引号用来表示字符常量。**例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串。
• char 类型用来表示在Unicode编码表中的字符。
• Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;ASCII码占1个字节,可 允许 有128个字符(最高位是0),是Unicode编码表中前128个字符。
• Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义, char c2 = ‘\n’; //代表换行符
• char类型在内存中存储的是该字符的Unicode编码值,所以char类型可以当做int类型来处理
/**
* 测试类型转换
* @author lh
*
*/
public class TestTypeConvert {
public static void main(String[] args) {
//自动类型转换
int a = 1234;
long b = a;
double d = b;
//a = b;
//long e =3.32F;
float f = 234324L;
//特例
byte b2 = 123;
//强制类型转换
double x =3.14;
int nx = (int)x;
char c = 'a';
int e = c + 1;
System.out.println(nx);
System.out.println(e);
System.out.println(c);
System.out.println((char)e);
}
}
/**
* 测试转换常见的问题
* @author lh
*
*/
public class TestConvertError {
public static void main(String[] args) {
int money = 1000000000;
int year = 20;
int total = money*year;//返回的是total是负值超i除了int的范围
long total1 = money*year;
//返回值仍然是负值,默认是Int值在转换为long但是已经发生了数据丢失
long total2 = money*((long)year);
System.out.println("total="+total);
System.out.println("total1="+total1);
System.out.println("total2="+total2);
//命名问题
int l = 2;//分不清是l还是1;
long a = 234L;//建议用L
System.out.println(l+1);
}
}
2.8布尔数据类型(一位,不是一个字节)
• boolean类型有两个值,true和false
• boolean 类型用来判断逻辑条件,一般用于程序流程控制
• 实践: • 请不要这样写:if ( is == true && done == false ) ,只有新手才那么写。 对于任何程序员 if ( whether && !done ) 都不难理解吧。所以去掉所有的==fasle 和 ==true。
2.9final 常量
• 使用final修饰的变量,只能被初始化一次,变成了常量。
• final常量是有名称的
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); }
}
2.10命名规则(规范)
• 所有变量、方法、类名:见名知意
• 变量、方法名: • 首字母小写和驼峰原则
• run(), runRun(), age ageNew monthSalary
• 常量:
• 大写字母和下划线:MAX_VALUE
• 类名:
• 首字母大写和驼峰原则: Man, GoodMan
2.11运算符
• Java 语言支持如下运算符:
• 算术运算符: +,-,*,/,%,++,-• 赋值运算符 = *
• 扩展赋值运算符:+=,-=,*=,/= • 关系运算符: >,<,>=,<=,==,!=
• 逻辑运算符: &&,||,!
• 位运算符: &,|,^,~ , >>,<<,>>> (了解!!!)
• 条件运算符 ?:
• 相关概念辨析
• + 运算符 操作符 Operator
• 5+6 表达式 expression
• 5 6 操作数 Operand
• int m =5+6; 语句 Sentence
算术运算符
• 注意:
• 1:/ 除 6/4=1 6/4.0=1.5
• 2: %取模(求余) 6%4=2
• 3:+ 6+‘a’=103 6+“a“=6ª
• 4:++ a=2;b=++a+9; a=2;b=a+++9; • +:字符串相加,只要有一个操作数是字符串,自动变为字符串相连
• 二元运算符类型提升:
• 整数运算:
• 如果两个操作数有一个为Long, 则结果也为long
• 没有long时,结果为int。即使操作数全为shot,byte,结果也是int.
• 浮点运算:
• 如果两个操作数有一个为double, 则结果为double.
• 只有两个操作数都是float, 则结果才为float.
• 一元运算符(++, --):
• int a = 3;
• int b = a++; //执行完后,b=3。先给b赋值,再自增。
• int c = ++a; //执行完后,c=5。先自增,再给b赋值
/**
* 测试算数运算符
* @author lh
*
*/
public class TestOperator01 {
public static void main(String[] args) {
byte a = 1;
int b = 2;
long b2 = 3;
//byte c =a + b;
//int c2 = b2 + b;
float f1 = 3.14F;
float d = b + b2;
//float d2 = f1 + 6.2;
System.out.print(-9%5+"\n");
//测试自增自减
int e = 3;
int f = e++;
System.out.print("e="+e+"\n"+"f="+f+"\n");
e = 3;
f = ++e;
System.out.print("e="+e+"\n"+"f="+f);
//测试赋值和赋值扩展运算符
int m = 3;
int n = 2;
System.out.print("m="+m+"\nn="+n);
m=3;
n=4;
m*=n+3;
System.out.print("m="+m+"\nn="+n);
}
}
赋值运算符
• 基本赋值运算符
• 扩展赋值运算符
• 算术运算符和赋值运算符结合
关系运算符
• 关系运算符用来进行比较运算
• 关系运算的结果是布尔值:true/false
• 注意
• 区分==和=
• 不等于是!=不是<>
/**
*测试关系运算符
* @author lh
*
*/
public class TestOperator02 {
public static void main(String[] args) {
int a =3;
System.out.println(a==3);
System.out.println(a!=3);
System.out.println(a<4);
char b = 'a';
char b2 = 'c';
System.out.println((int)b);
System.out.println(0+b);
System.out.println(0+b2);
System.out.println(b<b2);
}
}
逻辑运算符
• 逻辑运算符与布尔操作数一起使用,组成逻辑表达式
• 逻辑表达式的结果是布尔值
• &和&&的区别
• “&”:无论任何情况,“&”两边的表达式都 会参与计算。
• “&&”: 当“&&”的左边为false,则将不会计 算其右边的表达式。即左false则false
• “|”和“||”的区别与“&”和“&&”的区别类似。
/**
* 逻辑运算符
*
* @author lh
*
*/
public class TestOperator03 {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = false;
System.out.println(b1&b2);
System.out.println(b1||b2);
System.out.println(!b1);
System.out.println(b1^b2);
//短路
//int c = 3/0;
boolean b3 = 1>2&&2<(3/0);
System.out.println(b3);
}
}
位运算符(了解)
• 位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。
• 如果操作的对象是char、byte、short,位移动作发生前其值会自动晋升为int,运算结果 也为int
/**
* 位运算符
* @author lh
*
*/
public class TestOperator04 {
public static void main(String[] args) {
int a = 3;
int b = 4;
System.out.println(a&b);
System.out.println(a|b);
System.out.println(a^b);
System.out.println(~a);
//移位
int c = 3<<2;
System.out.println(c);
System.out.println(12>>1);
}
}
字符串运算符
/**
* 字符串运算符
* @author lh
*
*/
public class TestOperator05 {
public static void main(String[] args) {
String a = "3";
int b = 4;
int c = 5;
char d = 'a';
System.out.println(a+b+c);
System.out.println(b+c+a);
System.out.println(d+4); // 97+4
}
}
条件运算符 (三元运算符)
• 语法格式 • x ? y : z
• 唯一的三目运算符
• 执行过程 • 其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个三目运算的结果为表达式 y 的 值,否则整个运算结果为表达式 z 的值。
• 经常用来代替简单的if-else判断!
/**
* 条件运算符(三元运算符)
* @author lh
*
*/
public class TestOperator06 {
public static void main(String[] args) {
int score = 80;
int x = -100;
String type = score<60?"不及格":"及格";
System.out.println(type);
if(score<60) {
System.out.println("不及格");
}else {
System.out.println("及格");
}
System.out.println(x>0?1:(x==0?0:-1));
}
}
运算符的优先级
• 不需要去刻意的记优先级关系 • 赋值<三目<逻辑<关系<算术<单目
• 理解运算符的结合性
2.12 基本数据类型之间的转换
• 在赋值运算或算术运算时,要求数据类型相同,否则要进行类型转换
• 转换方式:
• 自动转换
• 强制转换
• 除boolean类型外,所有的基本数据类型因为各自的精度不同,赋值时都要考虑这个问题
• 除boolean类型外,所有的基本数据类型包括:整型,浮点型,字符型。
• 算术运算时的转换
• 整型,浮点型,字符型数据可以混合运算。
• 运算中相邻两个操作数先转化为同一类型,转换从低级到高级,然后进行运算;运算的结果再 和下一个操作数据进行运算,规则相同
• 3+‘A’+45L
• 5+3.6+ ‘A’+3.14f
• 赋值运算时的转换
• 自动类型转换(左>右)
• 类型转换的方向
• 低------------------------------------------->高
• byte —> short,char—>int —>long—>float —>double
• 强制类型转换(左<右)
• 当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个 完全不同的值。
• 总结
• =右侧:所有变量先转换为字节数最多的数据类型,再计算
• =两侧:左侧宽度>右侧宽度 自动转换
• 左侧宽度<右侧宽度 强制转换
• 特例
• 可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,只要不超 出其表述范围
• short b = 12; //合法
化为同一类型,转换从低级到高级,然后进行运算;运算的结果再 和下一个操作数据进行运算,规则相同
• 3+‘A’+45L
• 5+3.6+ ‘A’+3.14f
[外链图片转存中…(img-6E54UtGH-1578655264734)]
• 赋值运算时的转换
• 自动类型转换(左>右)
• 类型转换的方向
• 低------------------------------------------->高
• byte —> short,char—>int —>long—>float —>double
• 强制类型转换(左<右)
• 当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个 完全不同的值。
• 总结
• =右侧:所有变量先转换为字节数最多的数据类型,再计算
• =两侧:左侧宽度>右侧宽度 自动转换
• 左侧宽度<右侧宽度 强制转换
• 特例
• 可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,只要不超 出其表述范围
• short b = 12; //合法
• short b = 1234567; //非法