2.数据类型和字符

2.数据类型和字符

2.1标识符Identifier

• 作用 • 常量、变量、方法、类和包等的名称

• 命名规则 • 必须以字母、_下划线、美元符$开头。

• 其它部分可以是字母、下划线“ _”、美元符“$”和数字的任意组合

大小写敏感,长度无限制。

不可以是Java的关键字

• 注意 • Java不采用通常语言使用的ASCII字符集

• Java采用unicode这样的标准的国际字符集。因此,这里的字母的含义: 英文、汉字等等。(不建议大家使用汉字来定义标识符!)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bj6IynY-1578655264718)(D:\Java笔记\2.数据类型和字符\image-20200110175229496.png)]

/**
 * 测试标识符的用法
 * @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是一种强类型语言

• 常量是有数据类型的 

​ • 变量都必须声明其数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBALAN3U-1578655264719)(D:\Java笔记\2.数据类型和字符\image-20200110175403781.png)]

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

• 整型变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zwK01Bk2-1578655264720)(D:\Java笔记\2.数据类型和字符\image-20200110180055283.png)])• 整型常量默认为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类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ifHhlxA-1578655264721)(D:\Java笔记\2.数据类型和字符\image-20200110180548233.png)]

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类型来处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77bEkC7K-1578655264722)(D:\Java笔记\2.数据类型和字符\image-20200110180942454.png)]

/**
 * 测试类型转换
 * @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; • +:字符串相加,只要有一个操作数是字符串,自动变为字符串相连

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZ3lXSHL-1578655264724)(D:\Java笔记\2.数据类型和字符\image-20200110181708937.png)]

• 二元运算符类型提升:

• 整数运算:

​ • 如果两个操作数有一个为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);
	}
}
赋值运算符

• 基本赋值运算符

• 扩展赋值运算符

• 算术运算符和赋值运算符结合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1y3Emvn-1578655264725)(D:\Java笔记\2.数据类型和字符\image-20200110181925842.png)]

关系运算符

• 关系运算符用来进行比较运算

• 关系运算的结果是布尔值:true/false

• 注意

​ • 区分==和=

​ • 不等于是!=不是<>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-is22ADmH-1578655264728)(D:\Java笔记\2.数据类型和字符\image-20200110182007647.png)]

/**
 *测试关系运算符
 * @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

• “|”和“||”的区别与“&”和“&&”的区别类似。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5C68F8t-1578655264729)(D:\Java笔记\2.数据类型和字符\image-20200110182115273.png)]

/**
 * 逻辑运算符
 * 
 * @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判断!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJQq7ahG-1578655264731)(D:\Java笔记\2.数据类型和字符\image-20200110182253393.png)]

/**
 * 条件运算符(三元运算符)
 * @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));
	}
}
运算符的优先级

• 不需要去刻意的记优先级关系 • 赋值<三目<逻辑<关系<算术<单目

• 理解运算符的结合性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zWro75t-1578655264733)(D:\Java笔记\2.数据类型和字符\image-20200110182323619.png)]

2.12 基本数据类型之间的转换

• 在赋值运算或算术运算时,要求数据类型相同,否则要进行类型转换

• 转换方式:

• 自动转换

​ • 强制转换

• 除boolean类型外,所有的基本数据类型因为各自的精度不同,赋值时都要考虑这个问题

• 除boolean类型外,所有的基本数据类型包括:整型,浮点型,字符型。

• 算术运算时的转换

​ • 整型,浮点型,字符型数据可以混合运算。

​ • 运算中相邻两个操作数先转化为同一类型,转换从低级到高级,然后进行运算;运算的结果再 和下一个操作数据进行运算,规则相同

​ • 3+‘A’+45L

​ • 5+3.6+ ‘A’+3.14f

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6E54UtGH-1578655264734)(D:\Java笔记\2.数据类型和字符\image-20200110182550289.png)]

• 赋值运算时的转换

​ • 自动类型转换(左>右)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-15l9SJyR-1578655264735)(D:\Java笔记\2.数据类型和字符\image-20200110182719024.png)]

• 类型转换的方向

• 低------------------------------------------->高

• byte —> short,char—>int —>long—>float —>double

• 强制类型转换(左<右)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a5fnxMAJ-1578655264737)(D:\Java笔记\2.数据类型和字符\image-20200110182905896.png)]

• 当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个 完全不同的值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTxj5Kg6-1578655264737)(D:\Java笔记\2.数据类型和字符\image-20200110182923794.png)]

• 总结

​ • =右侧:所有变量先转换为字节数最多的数据类型,再计算

​ • =两侧:左侧宽度>右侧宽度 自动转换

​ • 左侧宽度<右侧宽度 强制转换

• 特例

• 可以将整型常量直接赋值给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; //非法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值