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. Linux_WEB访问控制示例(使用IPADDR类型)

    前言: WEB服务使用访问控制,可以控制IP.主机名.以及某个网段的IP去访问我们的WEB服务,从而加减少流量的访问 一.使用IP控制访问 1.在/var/www/html下创建一个可访问的测试页面 ...

  2. Hutool :一个小而全的 Java 工具类库

    Hutool 简介 Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的 ...

  3. STM32F7系列时钟相关问题:HSE模式配置(旁路模式、非旁路模式

    从时钟源的角度,分为两类外部时钟(E)和内部时钟(I).从时钟速率的角度,分为两类高速时钟(HS)和低速时钟(LS).而把它们组合起来就有四种时钟:HSE.HIS.LSE.LSI.至于为什么会有这么复 ...

  4. 三大主流开源硬件对比:Arduino vs Raspberry Pi vs BeagleBone

    http://www.elecfans.com/emb/361236_3.html 下文摘自上面的链接 软硬件整合是今年一再被提及的话题,如今我们也可以看到不少硬件创业的成功案例,比如Jawbone ...

  5. 机器学习PAL数据预处理

    机器学习PAL数据预处理 本文介绍如何对原始数据进行数据预处理,得到模型训练集和模型预测集. 前提条件 完成数据准备,详情请参见准备数据. 操作步骤 登录PAI控制台. 在左侧导航栏,选择模型开发和训 ...

  6. [NOIP1998 提高组] 拼数

    题目描述 设有 n 个正整数​ a1-an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数. 输入格式 第一行有一个整数,表示数字个数 n. 第二行有 n 个整数,表示给出的 n 个整数 a_ ...

  7. JS设置GridView中的RadioButton只能选中一个

    //JS&JQuery $(document).ready(function () { //点击跳转链接返回浏览器历史的上一个页面 $("#btnBack").click( ...

  8. JUC 并发编程--02,生产者和消费者 synchronized的写法 , juc的写法. Condition的用法

    synchronized的写法 class PCdemo{ public static void main(String[] args) { //多个线程操作同一资源 Data data = new ...

  9. JSP三大指令是什么?

    JSP页面中的指令JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言等.语法规则:<%@ 指令名 属性=值 属性=值 ... %>指令可以有很多个属性,它们以键值对的形 ...

  10. MySQL笔记01(黑马)

    一.数据库基本介绍 目标:了解数据库的功能和常见数据库分类.数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1.数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库: ...