这一周学习了如何进行Java环境配置,Java开发工具的安装,Java的关键字与标识符,常量与变量,数据类型,运算符,流程控制等基础知识,其中数据类型与运算符的相关概念和计算是重难点,现在对这两个部分做一个简单总结:
1.基本数据类型
整数型,浮点型,字符型,布尔类型
2.引用数据类型
在 Java中,除了基本数据类型以外的数据类型,都是引用数据类型,常用的引用数据类型包括类,数组,接口,String等.
在java中引用类型通常表示为一个对象的引用,通过该引用可以获取到对象的相关信息,以及调用相关方法. 声明引用类型变量时,系统只为该变量分配引用空间,并未创建一个具体的对象.
以类举例:
创建一个学生类,在这个类中包含一些变量(全局变量)和一些方法.这个定义的学生类就是引用数据类型
public class Student{
// 定义的一个字符串变量
String stuname="张三";
char sex= '男';
int age = 20;
// 定义一个方法
public void showInfo(){
System.out.println(stuname);
System.out.println(sex);
System.out.println(age);
}
}
如何使用这个学生类型(引用数据类型),方法如下:
public static void main(String [] args){
// 定义学生类型 ,引用数据类型需要创建 引用的对象
// 引用数据类型 变量名 = null
// 基本数据类型 变量名 = 初始值
// 对于类的创建
// 类名 对象名 = new 类名();
Student stu = new Student();
// 对象名.方法名();
stu.showInfo();
}
基本数据类型与引用数据类型的区别:
1、创建方式不同,基本数据类型直接通过定义变量的方式创建,而引用数据类型需要new一个对象
2、在JVM中的内存分配不同,基本数据类型的内存在栈内存中直接创建,而引用数据类型是在栈内存中定义引用的地址,实际的内存分布在堆内存中
3、引用数据类型可以调用它的方法,而基本数据类型没有方法
基本数据类型的内存分布图:
引用数据类型的内存分布图:
3.位运算符
移位运算符 | 说明 | 举例 |
---|---|---|
<< | 左移:将一个数转换成二进制之后,整体往左移动n位,扩大倍数 .一个数按位向左移动n位,结果等价于这个数乘以2的n次方 | 3<<2 <==> 3*2的2次方 |
>> | 右移:将一个数转成二进制后,整体往右移动n位,缩小倍数.一个数按位向右移动n位,结果等价于这个数除以2的n次方(除不尽单独考虑,取整) | 8>>2 <==> 8/2的2次方 |
>>> | 无符号的右移 ,不考虑符号位,将这个数按位整体往右移动n位 | 5>>>2,-5>>>2 |
^ | 按位异或,两个数的二进制位对应值不同则为1,否则为0 | 4^5 |
~ | 将一个数转成二进制后按位取反 | ~5 |
示例:
//Java的<< >> >>> 都是针对补码来进行的,因为Java只存储补码
//正整数的移位 << >> >>> 因为正数的原码,反码,补码相同,所以对于正整数直接处理其原码
//左移
System.out.println(3<<2); // 12
System.out.println(7<<3); // 7*8=56
// 正数的右移>>和无符号右移>>>结果一样
System.out.println(16>>2);// 4
System.out.println(18>>2);// 4
System.out.println(3>>2);
System.out.println(3>>>2);
// 负数的移位,负数的<<,>>时符号位不变即始终为1,且符号位不参与计算
// 负数的左移位<<还是为负数
System.out.println(-4<<2); // -4*2的2次方 =
/**
* -4的原码: 1 0000... 00000100
* * -4的反码: 1 1111... 11111011
* * -4的补码: 1 1111... 11111100
* * 开始移位 2
* 1 1111... 11110000
* 最后结果 = 取反+1
* 1 0000... 00001111 + 1
* :
* 1 0000... 00010000 =-16
*/
// 补码 = 反码+1
//负数是对于补码 进行移位
//System.out.println(-3<<3);//-24
System.out.println(-4>>1);//-4/2 =-2
//负数的右移
System.out.println(-3>>3)
// -3的原码: 1000......00000011
// 反码: 1111......11111100
// 补码: 1111......11111101
// 右移3位 :1111......11111111
// 取反: 1000......00000000
// 补码: 1000......00000001
// 转换成二进制为:-1
//负数的无符号右移
// -16无符号右移2位
System.out.println(-16>>>2); //1073741820
// -16 的补码算出来
/**
* 原码 10000.. 0010000
* 反码 11111.. 1101111
* 补码 11111.. 1110000
* 右移2位 00111.. 1111100 由于不考虑符号,移动后高位全部补0 变成正数
* 因为正数原码和补码一致 所以这个数即为所得,转为十进制是:
* 1073741820
*/
//按位异或^
System.out.println(4^5);
//4的二进制:100
//5的二进制:101
//4^5的二进制为:001,转为十进制为如1(两个相应的二进制位值不同则为1,否则为0)
System.out.println(5^9);//12
//按位取反
System.out.println(~5);
// 0000..00000101
// ~5 1111..11111010 取反后成了负数 继续还原
// 1000..00000101 + 1 取反+1
// 1000..00000110 =-6