Java程序设计(2021春)——第一章续笔记与思考

Java程序设计(2021春)——第一章续笔记与思考


Java数据类型

基本数据类型

基本数据类型
整数类型 byte short int long
浮点类型 float double
字符类型 char
布尔类型 boolean
类型 说明 长度 最小值 最大值
byte 带符号微整数 8位 -128 127
short 带符号短整数 16位 -215 215-1
int 带符号整数 32位 -231 231-1
long 带符号长整数 64位 -263 263-1
float 单精度浮点数(6~7位有效数字) 32位 -2-149 (2-2-23)·2127
double 双精度浮点数(15位有效数字) 64位 -2-1074 (2-2-52)·21023

引用类型

引用类型 对象

基本数据类型——整数类型的细节

Tip:

  1. 基本数据类型所有的数据都不是对象,这也是Java唯一的非面向对象的设计。保留这种设计的原因是考虑到程序的运行效率:基本数据类型运算速度会快一些,而对象会慢一些。

  2. 封装对象的蓝图(类)都基于基本数据类型和引用类型来完成。

  3. byte用来描述字节;short使用频度最低;int使用较为广泛,默认为int

  4. double常用,运算起来比float快,而且精度更高一些。

  5. char本质上是int的一个子集,可以表示一个字符,用单引号引起来。

  6. boolean不可能变成其他七种基本数据类型,其他七种数据类型也不能转为boolean

  7. byte b1 = 100;//此处100为int类型,但是没有超过byte最大值,所以可以自动转化
    byte b2 = -100;//没有超过byte最小值,同上
    byte b3 = 128;//会报错,,超过byte最大值,类型不匹配
    byte b4 = -129;//会报错,超过byte最小值,类型不匹配
    /*short,int,long同理*/
    
  8. long l1 = 2147483647;//正常
    long l2 = 2147483648;//报错,原因是2147483648是int型,超过了int的表示范围,在其后加后缀l或L都可解决这个问题,但是推荐用L因为l像1
    long l3 = 2147483648L;
    
  9. Java是一种类C语言,一般情况下默认十进制,表示八进制在八进制数字之前加0,如010代表八进制中10,即十进制中的8,负号可以放在0之前如-010;表示十六进制在十六进制数字之前加0x,如0x10,即十进制中16,同理,可以将负号加在0x之前;表示二进制在二进制数字之前加ob,如0b1010``-0b1111(二进制表示是Java 7之后的特性)。

  10. Java 7之后还支持用_加在数字之间做分隔符,便于阅读,如123_456_789,需要注意的是分隔符不能放在数字开头和结尾,编译的时候分隔符会被抛弃掉,字节码不会出现分隔符。

基本数据类型——浮点类型的细节

Tip

  1. float f1 = 0.8;//会报错,原因是在Java中默认小数是double类型,不允许将double类型赋给float类型。这一点类似于整数默认是int类型。可以通过在小数后面加上大写或小写的f来声明这个小数是float类型。
    float f2 = 0.8f;//合法,声明了0.8是float。
    
  2. f1 = 1.36E+5f;//表示1.36·10^5
    f1 = 1.36E-5f;//表示1.36`10^(-5)
    f1 = .5f;//合法,缺省表示0.5
    
  3. double d1 = 0.8;//默认小数是double类型,所以没有问题
    double d2 = 0.8D;//Java中也规定了double类型的后缀d或D,但是没有必要
    
  4. d1 = 1.3628E102;//double中的科学计数法表示
    d1 = 1.3628E-102;
    
  5. d1 = 0x12.2P2;//十六进制的科学计数法,表示十六进制的12.2*2的2次方,P后面的数字表示2的n次方;不是用科学计数法表示十六进制浮点数是不被Java支持的
    
  6. d1 = 92_873_293.38_978;//浮点数同样支持下划线分割符,应用原则和整数中无异
    

基本数据类型——字符类型的细节

Tip

  1. 字符类型变量一定是单引号引用的单个字符。

    char c1 = 'a';
    
  2. 字符串不属于基本数据类型,属于引用类型的对象

  3. 除了把字符赋给字符型变量,也可以把0-65535的int型变量赋给字符型变量。

    char c2 = 65;//这句话的含义是到Unicode中寻找编号为65 的字符赋给a。
    
  4. Unicode前128个编码对应ASCII字符集,Unicode前256个字符对应ISO-拉丁-1字符集,中文日文阿拉伯文韩文等也有对应编码。

  5. 转义符是\,常用的有如下所示

    c1 = '\n';//换行
    c1 = '\r';//回车
    c1 = '\b';//退格
    c1 = '\t';//水平制表
    c1 = '\f';//换页
    c1 = '\'';//表示单引号'
    c1 = '\"';//表示双引号"
    c1 = '\\';//表示\本身
    c1 = '\101';//3位8进制数字表示0~377范围内的(十进制0~255) 的256个字符,即ISO码,即可以将表示某字符的编码转为8进制来表示。
    c1 = '\u4e01';//使用4位16进制数字表示\u0000~\uffff范围的字符,即可以用十进制转十六进制表示对应字符,表示范围更大,更常用。
    

基本数据类型——布尔类型

Tip:

  1. 重要:Java与C不同,在Java中布尔类型boolean与整数兼容,即,不可以将整数赋给boolean型变量。即,Java中,boolean仅可以取truefalse两种值。学过C再学Java的同学需要注意这一点(比如笔者我自己)。

基本数据类型转换

  1. 七种数据类型可以相互转换,分别是整数类型、浮点类型、字符类型,布尔类型不可以和其他其中数据类型相互转换。

  2. Java中数据类型转换分为自动转换(隐式转换)和强制转换(显式转换)两种。自动转换由较小的数据类型向较大的数据类型转换,强制转换相反。一般来说,自动转换较为安全。

  3. 自动转换特点:目标类型范围大于原始数据类型,可能不失真,也可能损失精度。

  4. 强制转换特点:目标类型范围小于原始数据类型,可能会出现宽度和精度的损失。

Java强制类型转换精度损失与表达式中的数据类型转换

数据类型转换除了可以发生在赋值运算当中,还可以发生在复杂表达式当中。

类型在表达式中的自动提升(操作数的类型不一致)

遵循以下规则

  1. 表达式中出现了double类型的操作数,其他所有非double类型的数都会先转化为double类型的数,再进行运算,结果是double类型的数。
  2. 否则,如果表达式中存在float类型的操作数,其他所有非float类型的操作数都转为float类型的数,再进行运算,结果是float类型的数。
  3. 否则,如果表达式中存在long类型操作数,其他所有操作数先提升为long类型,再进行计算,结果是long类型。
  4. 否则,所有其他操作数先转为int类型,再进行计算,结果是int类型。

以下是针对以上规则的几个实例

/*声明若干变量*/
byte b = 50;
short s = 2048;
char c = 'a';
int i = 20000;
long l = 1000000L;
float f = 8.28f;
double d = 5.232;
/*验证表达式类型,读者可以将代码copy到IDE中观察warning等提示信息*/		
double dd = b * i + (f - d);//出现了double类型,结果为double类型
float ff = f/i+s-c;//没有double类型操作数,但是有float类型操作数,会自动提升为float类型再进行运算,最终结果应该是float类型
long ll = (s+c)*i/l;//没有double和float,但有long类型,所以提升为long
int ii = i * c / (s + b);//没有double,float,long,自动转为int

/*一个“特殊”的例子*/	
b = b * 2;//报错,b*2是int类型,原因是表达式中没有出现double,float,long
b = (byte)(b * 2);//不报错,对结果进行了强制类型转换

Java数组

Java数组介绍、声明与使用

数组基本性质

  1. 数组是使用统一名称引用的一组具有相同类型的数据
  2. Java中的数组属于引用类型(对象)
  3. 可以生命任意数据类型的数组,如若干int值构成的int类型的数组或由若干字符串构成的String类型的数组。
  4. 每个构成数组对象的数据值都被称为数组的元素,可以通过索引来访问数组中的某个元素,索引取值一定在0数组长度-1的范围内(作为类C语言,Java的下标也从0开始)。

数组的一些细节

int[] a1 = new int[5];//声明了int类型的数组类型的a1,new int[5]会实际化出int数组类型的对象,这个对象中可以容纳五个int的值
int a2[] = new int[5];//这种声明数组的语法和上面的完全相同,但第一种方法可读性要更优一些,int[]直白地指出这是一个数组
System.out.println(Arrays.toString(a1));//Arrays是Java提供的一种数组工具类,其中由一个工作方法toString,可以将a1数组输出到控制台,打印[0, 0, 0, 0, 0]
		/*在开辟数组对象的内存空间以后,Java会为每一个数组元素进行初始值的自动设置
		 * byte,short,int,long类型的数组元素会被统一设置为0
		 * float,double类型的数组元素会被统一设置为0.0
		 * char类型的数组元素会被统一设置为'\u0000'(即空字符)
		 * boolean类型的数组元素会被统一设置为false
		 * 所有引用类型的元素会被统一设置为null,即空*/

一维数组的初始化与length属性

  1. int[] a = new int[5];//new操作符:要开辟新的对象区域。int[] a在栈空间中开辟区域存放a变量,new int[5]在堆空间中开辟区域,大小为5个int,同时初始值为0,同时首地址会通过=操作赋给a变量。笔者认为这很类似C中的指针,可与类比学习。
    
  2. /*在Java中数组是对象,对象通常由一些属性和方法。其中,length是一个重要属性。*/
    System.out.println(a1.length);//会打印a1的长度
    
  3. 在Java中,数组的长度可以为0,称作空数组或零数组,仅在特定场合有所应用。

  4. 在Java中数组的长度不可以为负数,虽然在语法上可以通过,但是在运行中会报错。

  5. 在Java中,数组的长度理论上限为int的最大值,但是分配给虚拟机的空间不会太大, 所以所开数组大小达不到理论上限。

数组索引的原理与引用

一维数组

int[] a1 = {10,20,30,40,50};
System.out.println(a1[0]);//访问了数组的第一个元素
System.out.println(a1[1]);//以下依次访问数组的第2个到第5个元素
System.out.println(a1[2]);
System.out.println(a1[3]);
System.out.println(a1[4]);
		
System.out.println(a1[5]);//试图访问数组的第6个元素,但是越界了,运行会报错,同理,试图访问负索引元素也会运行报错
a1[2] = 300;//通过索引不仅可以访问某格元素的值,也可以修改某个元素的值

  1. 只要返回值是int类型,都可以用来作为数组的索引。

二维数组

int[][] arr = new int [3][4];//二维数组的声明,需要两个索引配合访问,等号左侧在栈空间中开辟空间,等号右侧在堆空间中开辟三个一维数组,每个一维数组大小为4个int,需要另外一个容量为3的数组分别引用三个int类型一维数组对象的首地址,把容量为3的数组的首地址传递给arr,则arr可以访问数组中的每一个元素
//二维数组本质是一维数组组成的的数组,即二维数组是由若干个一维数组作为元素组成的数组
int[][] arr1 = {{0,0,0,0},{0,0,100,0},{0,0,0,0}};//可以如是声明并且初始化
//在Java中支持不规则的二维数组,即组成二维数组的一维数组不等长,Java支持这样的特性但是在真正的开发工作中应用很少
//在Java中支持三维四维等更高维数组,但是在实际开发工作中很少用到

Java变量

  1. Java是强类型语言,所有变量都需要先声明再引用。

  2. 在同一个变量的作用域中,同一个变量不可以被多次声明。

  3. Java支持一条语句声明多个同类型变量,但是推荐一条语句中只声明一个变量,这样在代码较为复杂时可读性更强。

  4. 声明在方法中和其他比较小的语句块中的变量称作局部变量,与之相对应的是声明在中的实例变量(会在面向对象部分讲解)

  5. 局部变量在第一次使用之前需要被初始化。

  6. 基本数据类型变量存储在一个叫虚拟机栈的特殊区域。虚拟机栈容量比较小,但是访问速度比较快,与引用类型的对象的组织不一样,将在后续章节介绍。

    int a;//此操作会在虚拟机栈中开辟一个区域,该区域被a引用,用来存储a的值。
    
  7. Java的变量作用域在声明变量的代码块之内,在该代码块之外变量则不能被访问。若一个代码块运行结束,则代码块声明的所有变量均会被销毁,变量的生命周期随之结束。

  8. {}为代码块。

  9. 内部代码块可以访问外部代码块声明的变量。

  10. 常量不能被改变,加final做前缀后,其他声明法则和普通变量相同。

命令行参数

public class Main{
	public static void main(String[] args) {
		System.out.println(Arrays.toString(args));
	}
}
/*main方法中args即为命令行参数,可以通过命令行或者eclipse中右键->run as->arguments传递命令行参数*/
posted @ 2021-07-06 16:53  被水淹没的一条鱼  阅读(134)  评论(0编辑  收藏  举报