类型和运算

1.常量和变量

1.字面量/常量

字面量就是直接给出的一个值,可以是整数,小数等等,字面量也叫做直接量

注意点Java中的变量必须赋初值才可以使用,初始化操作在内存中为变量开辟了内存空间!

2.变量

1)变量的分类

变量根据位置不同,分为成员变量和局部变量,

1.成员变量/字段:直接定义在类的{}中的变量(方法外),

2.局部变量:定义在方法内的变量,除了成员变量都是局部变量

2)变量的表现形式

变量的表现形式有三种:方法的形参,方法内变量,代码块变量

3)变量的作用域:

1.成员变量:在所定义的类中起作用

2.局部变量:从定义的位置到所在代码块的}之间

2.数据类型

1.基本类型

Java中的数据类型共有两大类:基本类型引用类型

基本类型分为数值类型、boolean类型和字符类型

其中数值类型又分为:整数类型、小数类型

其中整数类型包括:byteshortintlong

其中小数类型包括:floatdouble类型

 

 

注意点:

(1)byte b = 10, 10byte类型表示的范围内,编译器将10转换为byte类型

(2)整数类型常用的表示方法有2进制,8进制和16进制

 二进制使用0B0b开头,例如:int a = 0B00001000

 八进制使用0开头,例如:int b = 012

 十六进制使用0X0x开头,例如:0X001A

(3)整型字面量默认类型是int类型

(4)小数常量默认是double类型

(5)定义float类型变量时小数常量末尾要加上F/f

(6)无论是float还是double都不能表示精确的小数,因此对于金钱类型的数据使用BigDecimal,他表示任意精度

char类型的使用方式有三种:常用的是符号表示和进制来表示。

符号表示:char a =  ‘A’;

十进制表示:char a = 65;

十六进制表示:char a = ‘u\0041’;

(7)定义long类型数据末尾要以L或结尾例如:long l = 120L;

 

2.引用类型

除了基本数类型,其他所有类型都是引用数据类型,包括类,接口,数组。

String类是最常用的引用类型,任何数据类型和字符串类型拼接都是字符串类型。

3.溢出

当要表示的数据超出了数据类型所能表示的范围,例如:int intMax = 2147483648;就会出现数据溢出的问题。

原因分析:

//定义一个int类型的变量,值为int类型表示的最大值
int intMax = 2147483647;
//intMax+1后再复制给intMax
intMax = intMax + 1;
System.out.println(intMax);
/* 0B01111111_11111111_11111111_11111111
+  0B00000000_00000000_00000000_00000001
————————————————————————————————————————
   0B10000000_00000000_00000000_00000000
   转换为十进制为-2147483648
		*/


在数据计算过程中很容易出现数据溢出,数据溢出会导致数据出错,但是在编译的时候,编译器只会检查语法是否正确,而不会检查结果是否正确。

注意点:比较两个数大小不能用相减的方式,因为有溢出的可能,所以使用比较运算符>,<

4.类型转换

数据类型转换分为两种:

1.自动类型转换又称为隐式类型转换

2.强制类型转换又称之为强制类型转换(可能会损失精度损失或溢出)

注意点:

1byte,short,,char一般不参与转换,转换时需要看类型可以表示的范围

2)强制类型转换需要在转换的数值前加上要转换的类型例如:int a = (int)10.1;

3)数据运算时,表达式中如果包含多种数据数据类型,那么数据类型会自动提升,byte,short,char会自动提升为int类型,整个表达式的类型将会提升到表达式中类型最高的类型

(4)String和任意类型使用+链接都会变成String类型

 

3.运算符

运算符分为五种:算数运算符,赋值运算符,三目运算符,比较运算符、逻辑运算符和位运算符。

1.算数运算符

算数运算符:

 

算数运算符是用来处理四则运算的符号。

注意点:

1System.out.println(9888/ 1000 * 1000);//9000
(2)+加号在处理不同数据类型的运算中得到的值是不同的,

如果是数值和字符相加则得到的是数值类型如果是两个字符类型相加得到的也是数值类型

 

String a = 'A';
System.out.println(a + 1);
System.out.println(a + a);

(3)/除号,当两个整数相除得到的结果仍然是整数,小数部分会被忽略。如果当一个正整数除以0.0时或当一个正小数除以0时会引发算术异常。Infinity正无穷大,负数则会得到-Infinaity负无穷大。所有的正无穷大都是相等的,负无穷大也是相等的。0.0/0.0则会得到NaN(Not a Number)

(4)取余%,模数的符号忽略不糊,结果的符号取决被模数

(5)++单纯的对数值操作时是没有区别的:a++++a都会使a自增1,但是如果是在表达式中,那么表达式里a++是先使用a的值进行运算,然后a自增一,如果是++a那么会使用a自增1后的值进行运算。--也是。

(6)++--只能操作变量,如果是常量则编译会报错


 

2.赋值运算符

 

注意点:

(1)+=中间不能有空格,a += 1不单纯的等价于a = a + 1,而是带有类型转换的

例如:

/*
	+=赋值符号:中间不能有空格
	自带隐式类型转换
	int a = 5;
	a += 5;等价于 a = (int)(a + 5);
*/
	int a = 10;
	a += 5;
	System.out.println(a);//15


 

3.比较运算符

 

比较运算符用于比较两个变量或常量之间的关系,比较运算符的结果为boolean类型,其操作格式为:boolean result = 表达式A 比较运算符 表达式B

4.三目运算符

用法:数据类型 变量名称 =  boolean表达式 ? 结果1 : 结果2;

若表达式为真,则返回结果1否则返回2

5.逻辑运算符

 

1.逻辑运算符有以下几种:逻辑与&,逻辑或}.逻辑非!,异或^,短路与&&,短路或||

2.逻辑与&,同真为真,一假即假

3.逻辑或|,同假为假,一真即真

4.逻辑非!,取反,非真为假,非假即真

3.异或^, 相同为假,不同为真

4.短路与&&,同时为真才能进行下面的运算,左边的布尔表达式如果为假,则右边表达式不在进行计算,此现象称为短路效应.

5.短路与||,只要一个条件表达式为真就会进行下面的运算,左边的布尔表达式如果为真,则右边表达式不在进行计算

//逻辑与&
System.out.println(true & true);//true
System.out.println(false & true);//false
System.out.println(true & false);//false
System.out.println(false & false);//false
		
System.out.println("-----华丽的分割线1------");

//逻辑或|
System.out.println(true | true);//true
System.out.println(false | true);//true
System.out.println(true | false);//true
System.out.println(false | false);//false

System.out.println("-----华丽的分割线2------");

//逻辑非!
System.out.println(!true);//false
System.out.println(!false);//true

System.out.println("-----华丽的分割线3------");

//异或^
System.out.println(true ^ true);//false
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true
System.out.println(false ^ false);//false

System.out.println("-----华丽的分割线4------");
		
//短路与
System.out.println(true && false);//false
System.out.println(true && true);//true
System.out.println(false && true);//false
System.out.println(false && false);//false

System.out.println("-----------------------");

//短路证明
//System.out.println(true && (1 / 0 == 0));//异常
System.out.println(false && (1 / 0 == 0)); //false

System.out.println("-----华丽的分割线5------");
		
//短路或||
System.out.println(true || false);//true
System.out.println(true || true);//true
System.out.println(false || true);//true
System.out.println(false || false);//false

//短路证明
System.out.println(true || (1 / 0 == 0));//true
//System.out.println(false || (1 / 0 == 0)); //异常

6.位运算符

位运算符与逻辑运算符符号相同但表达的含义不同,位运算符两边都是常量或变量,而逻辑运算符两边都是布尔表达式。


1.按位与:同真为真,

2.按位或:同假为假,

3.异或:相同为真,不同为假

 

 

//按位与&
System.out.println(5 & 3);//1
/*
	十进制5转二进制:00000101
	十进制3转二进制:00000011
	----------------------------
	与结果           00000001 转十进制得1
*/

//按位或|
System.out.println(5 | 3);//7
/*
	十进制5转二进制:00000101
	十进制3转二进制:00000011
	----------------------------
	或结果           00000111 十进制7
*/

//异或^
System.out.println(5 ^ 3);//6
/*
	十进制5转二进制:00000101
	十进制3转二进制:00000011
	----------------------------
	异或结果         00000110 十进制6
*/



4.取反:计算出常量对应的二进制的补码 按位取反后,0->1,1->0,再求取反的值的补码,再转换为二进制即为原值的取反.

 

		//正数取反~
		System.out.println(~5);//-6
		/*
			十进制5转int类型的二进制的为
			原码	00000000_00000000_00000000_000000101
			取反	11111111_11111111_11111111_111111010 

			反码	10000000_00000000_00000000_000000101
			补码	10000000_00000000_00000000_000000110 十进制-6
		*/
		
		//负数取反~
		System.out.println(~-5);//4
		/*
			十进制-5转int类型的二进制的为
			原码	10000000_00000000_00000000_000000101
			反码	11111111_11111111_11111111_111111010
			补码	11111111_11111111_11111111_111111011
			取反	00000000_00000000_00000000_000000100 十进制4
		*/

7.移位运算

1.左移<<,将操作数的二进制左移指定为数,左移之后的空位用0补齐

 

		//正数左移<<
		System.out.println(3 << 2);//12
		/*
					0000_0011
			左移两为0000_0011_00 十进制为12
		*/
		//负数左移
		System.out.println(-3 << 2);//-12
		/*
			-3补码	1111_1101
			左移两为1111_1101_00 
			反码    1000_0010_11
			补码	1000_0011_10
		*/

2.右移>>,将操作数的二进制右移指定为数,右移之后的空位如果是正数用0补齐,如果是负数用1补齐,求反码补码,操作,再求反码补码

 

		//正数右移>>
		System.out.println(8 >> 2);//2
		/*
					0000_1000
			右移两为0000_0010 十进制为2
		*/
		//负数右移
		System.out.println(-8 >> 2);//-2
		/*
			-8补码	1111_1000
			右移两位111111_10
			反码    100000_01
			补码	100000_10
		*/

3.无符号右移>>>,将操作数的二进制右移指定为数,右移之后的空位用0补齐

 

		//正数无符号右移>>>
		System.out.println(5 >>> 2);//1
		/*
					00000000_00000000_00000000_00000101
			右移两位00000000_00000000_00000000_00000001 十进制1
		*/
		//负数无符号右移>>>
		System.out.println(-5 >>> 2);//1073741822
		/*
			-5 二进制补码 11111111_11111111_11111111_11111011
			右移两位      00111111_11111111_11111111_11111110 十进制1073741822	  	
		*/

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值