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传递命令行参数*/

Java程序设计(2021春)——第一章续笔记与思考的更多相关文章

  1. 《Java基础教程》第一章学习笔记

    Java 是什么呀! 计算机语言总的来说分成机器语言,汇编语言,高级语言.其中Java一种高级计算机语言,它是一种可以编写跨平台应用软件,完全面向对象的程序设计语言. Java划分为三个技术平台,Ja ...

  2. Java程序设计(2021春)——第五章输入输出笔记与思考

    Java程序设计(2021春)--第五章输入输出笔记与思考 本章概览: 异常处理简介 程序运行时,环境.操作等可能出现各种错误.故障,我们希望程序具有容错能力,给出错误信息.面向对象的程序设计里有异常 ...

  3. 20145213《Java程序设计》第八周学习笔记

    20145213<Java程序设计>第八周学习笔记 教材学习内容总结 "桃花春欲尽,谷雨夜来收"谷雨节气的到来意味着寒潮天气的基本结束,气温回升加快.刚出冬的我对于这种 ...

  4. 《Java程序设计》第四章-认识对象

    20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...

  5. 《Java程序设计》第三章-基础语法

    20145221<Java程序设计>第三章-基础语法 总结 教材学习内容总结 类型.变量与运算符 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Typ ...

  6. Spring实战第一章学习笔记

    Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...

  7. 学堂在线《Java程序设计(2021春)》系列笔记——前言

    写在前面 目录 写在前面 这个系列是什么 为什么要做这篇博客 我是谁(其实不重要) 其他 这个系列是什么 这是关于学堂在线<Java程序设计(2021春)>(清华大学-郑莉教授)的个人同步 ...

  8. Java语言程序设计(基础篇)第一章

    第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...

  9. Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述

    第1章 Java程序设计概述1.1 Java程序设计平台 具有令人赏心悦目的语法和易于理解的语言,与其他许多优秀语言一样,Java满足这些要求. 可移植性 垃圾收集 提供大型的库  如果想要有奇特的绘 ...

随机推荐

  1. 855 gpu强 730 3倍

    骁龙730G的GPU规模只有骁龙835的GPU规模的一半,Adreno 618是128 ALUs,而Adreno 540是256 ALUs. 根据GFXBench的数据,对GPU负载比较大的曼哈顿3. ...

  2. 微信引流的方式 PC控制手机的方式

    http://www.yunjing100.cn/ 云鲸一百 小萝卜 http://www.xiaoluobei.com/

  3. INFJ名言

    财富是由什么构成的? 按世俗的观点,就是占有金钱和财宝. 但如果我们用除金钱之外的其他方式来衡量财富, 那么许多在物质上匮乏的人在精神上却是富有的, 许多在物质上富有的人在精神上却是匮乏的. The ...

  4. 10.19 dig:域名查询工具

    dig命令 是常用的域名查询工具,可以用于测试域名系统的工作是否正常.  dig命令的参数选项及说明 @<DNS服务器地址>    指定进行城名解析的域名服务器.当不希望使用本机默认的DN ...

  5. xshell中登录服务器图形化界面

    安装全套的xmanager程序 打开xshell工具程序 点击新建 输入ip等必要信息 点击隧道,英文版为tunnel 勾选红色的选项1和2 填写一些用户名和密码信息(图就略了O(∩_∩)O) 敲入指 ...

  6. Structured Streaming编程 Programming Guide

    Structured Streaming编程 Programming Guide Overview Quick Example Programming Model Basic Concepts Han ...

  7. VAE变分自编码器实现

    变分自编码器(VAE)组合了神经网络和贝叶斯推理这两种最好的方法,是最酷的神经网络,已经成为无监督学习的流行方法之一. 变分自编码器是一个扭曲的自编码器.同自编码器的传统编码器和解码器网络一起,具有附 ...

  8. GPU上如何优化卷积

    GPU上如何优化卷积 本文将演示如何在TVM中编写高性能卷积实现.我们以平方大小的输入张量和滤波器为例,假设卷积的输入是大批量的.在本例中,使用不同的布局来存储数据,以实现更好的数据局部性.缓冲区布局 ...

  9. 基于ARM Cortex-M的SoC存储体系结构和实战

    基于ARM Cortex-M的SoC存储体系结构和实战 System on Chip Architecture Tutorial Memory Architecture for ARM Cortex- ...

  10. OSPF-OSPF通用报头

    验证理论 1.OSPF信息类型,每个信息类型的作用,每个信息类型中每个字段存在的价值 第一节--通用报头 实验拓扑: 初始配置: 将接口配置地址,抓包开始后配置上OSPF 1.OSPF通用报头 OSP ...