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:
基本数据类型所有的数据都不是对象,这也是Java唯一的非面向对象的设计。保留这种设计的原因是考虑到程序的运行效率:基本数据类型运算速度会快一些,而对象会慢一些。
封装对象的蓝图(类)都基于基本数据类型和引用类型来完成。
byte
用来描述字节;short
使用频度最低;int
使用较为广泛,默认为int
。double
常用,运算起来比float
快,而且精度更高一些。char
本质上是int
的一个子集,可以表示一个字符,用单引号引起来。boolean
不可能变成其他七种基本数据类型,其他七种数据类型也不能转为boolean
。byte b1 = 100;//此处100为int类型,但是没有超过byte最大值,所以可以自动转化
byte b2 = -100;//没有超过byte最小值,同上
byte b3 = 128;//会报错,,超过byte最大值,类型不匹配
byte b4 = -129;//会报错,超过byte最小值,类型不匹配
/*short,int,long同理*/
long l1 = 2147483647;//正常
long l2 = 2147483648;//报错,原因是2147483648是int型,超过了int的表示范围,在其后加后缀l或L都可解决这个问题,但是推荐用L因为l像1
long l3 = 2147483648L;
Java是一种类C语言,一般情况下默认十进制,表示八进制在八进制数字之前加
0
,如010
代表八进制中10
,即十进制中的8
,负号可以放在0之前如-010
;表示十六进制在十六进制数字之前加0x
,如0x10
,即十进制中16,同理,可以将负号加在0x
之前;表示二进制在二进制数字之前加ob
,如0b1010``-0b1111
(二进制表示是Java 7之后的特性)。Java 7之后还支持用
_
加在数字之间做分隔符,便于阅读,如123_456_789
,需要注意的是分隔符不能放在数字开头和结尾,编译的时候分隔符会被抛弃掉,字节码不会出现分隔符。
基本数据类型——浮点类型的细节
Tip
float f1 = 0.8;//会报错,原因是在Java中默认小数是double类型,不允许将double类型赋给float类型。这一点类似于整数默认是int类型。可以通过在小数后面加上大写或小写的f来声明这个小数是float类型。
float f2 = 0.8f;//合法,声明了0.8是float。
f1 = 1.36E+5f;//表示1.36·10^5
f1 = 1.36E-5f;//表示1.36`10^(-5)
f1 = .5f;//合法,缺省表示0.5
double d1 = 0.8;//默认小数是double类型,所以没有问题
double d2 = 0.8D;//Java中也规定了double类型的后缀d或D,但是没有必要
d1 = 1.3628E102;//double中的科学计数法表示
d1 = 1.3628E-102;
d1 = 0x12.2P2;//十六进制的科学计数法,表示十六进制的12.2*2的2次方,P后面的数字表示2的n次方;不是用科学计数法表示十六进制浮点数是不被Java支持的
d1 = 92_873_293.38_978;//浮点数同样支持下划线分割符,应用原则和整数中无异
基本数据类型——字符类型的细节
Tip
字符类型变量一定是单引号引用的单个字符。
char c1 = 'a';
字符串不属于基本数据类型,属于引用类型的对象。
除了把字符赋给字符型变量,也可以把0-65535的
int
型变量赋给字符型变量。char c2 = 65;//这句话的含义是到Unicode中寻找编号为65 的字符赋给a。
Unicode前128个编码对应ASCII字符集,Unicode前256个字符对应ISO-拉丁-1字符集,中文日文阿拉伯文韩文等也有对应编码。
转义符是
\
,常用的有如下所示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:
- 重要:Java与C不同,在Java中布尔类型
boolean
不与整数兼容,即,不可以将整数赋给boolean
型变量。即,Java中,boolean
仅可以取true
和false
两种值。学过C再学Java的同学需要注意这一点(比如笔者我自己)。
基本数据类型转换
七种数据类型可以相互转换,分别是整数类型、浮点类型、字符类型,布尔类型不可以和其他其中数据类型相互转换。
Java中数据类型转换分为自动转换(隐式转换)和强制转换(显式转换)两种。自动转换由较小的数据类型向较大的数据类型转换,强制转换相反。一般来说,自动转换较为安全。
自动转换特点:目标类型范围大于原始数据类型,可能不失真,也可能损失精度。
强制转换特点:目标类型范围小于原始数据类型,可能会出现宽度和精度的损失。
Java强制类型转换精度损失与表达式中的数据类型转换
数据类型转换除了可以发生在赋值运算当中,还可以发生在复杂表达式当中。
类型在表达式中的自动提升(操作数的类型不一致)
遵循以下规则
- 表达式中出现了
double
类型的操作数,其他所有非double
类型的数都会先转化为double
类型的数,再进行运算,结果是double
类型的数。 - 否则,如果表达式中存在
float
类型的操作数,其他所有非float
类型的操作数都转为float
类型的数,再进行运算,结果是float
类型的数。 - 否则,如果表达式中存在
long
类型操作数,其他所有操作数先提升为long
类型,再进行计算,结果是long
类型。 - 否则,所有其他操作数先转为
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数组介绍、声明与使用
数组基本性质
- 数组是使用统一名称引用的一组具有相同类型的数据
- Java中的数组属于引用类型(对象)
- 可以生命任意数据类型的数组,如若干
int
值构成的int
类型的数组或由若干字符串构成的String
类型的数组。 - 每个构成数组对象的数据值都被称为数组的元素,可以通过索引来访问数组中的某个元素,索引取值一定在
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属性
int[] a = new int[5];//new操作符:要开辟新的对象区域。int[] a在栈空间中开辟区域存放a变量,new int[5]在堆空间中开辟区域,大小为5个int,同时初始值为0,同时首地址会通过=操作赋给a变量。笔者认为这很类似C中的指针,可与类比学习。
/*在Java中数组是对象,对象通常由一些属性和方法。其中,length是一个重要属性。*/
System.out.println(a1.length);//会打印a1的长度
在Java中,数组的长度可以为0,称作空数组或零数组,仅在特定场合有所应用。
在Java中数组的长度不可以为负数,虽然在语法上可以通过,但是在运行中会报错。
在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;//通过索引不仅可以访问某格元素的值,也可以修改某个元素的值
- 只要返回值是
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变量
Java是强类型语言,所有变量都需要先声明再引用。
在同一个变量的作用域中,同一个变量不可以被多次声明。
Java支持一条语句声明多个同类型变量,但是推荐一条语句中只声明一个变量,这样在代码较为复杂时可读性更强。
声明在方法中和其他比较小的语句块中的变量称作局部变量,与之相对应的是声明在类中的实例变量(会在面向对象部分讲解)
局部变量在第一次使用之前需要被初始化。
基本数据类型变量存储在一个叫虚拟机栈的特殊区域。虚拟机栈容量比较小,但是访问速度比较快,与引用类型的对象的组织不一样,将在后续章节介绍。
int a;//此操作会在虚拟机栈中开辟一个区域,该区域被a引用,用来存储a的值。
Java的变量作用域在声明变量的代码块之内,在该代码块之外变量则不能被访问。若一个代码块运行结束,则代码块声明的所有变量均会被销毁,变量的生命周期随之结束。
{}为代码块。
内部代码块可以访问外部代码块声明的变量。
常量不能被改变,加
final
做前缀后,其他声明法则和普通变量相同。
命令行参数
public class Main{
public static void main(String[] args) {
System.out.println(Arrays.toString(args));
}
}
/*main方法中args即为命令行参数,可以通过命令行或者eclipse中右键->run as->arguments传递命令行参数*/
Java程序设计(2021春)——第一章续笔记与思考的更多相关文章
- 《Java基础教程》第一章学习笔记
Java 是什么呀! 计算机语言总的来说分成机器语言,汇编语言,高级语言.其中Java一种高级计算机语言,它是一种可以编写跨平台应用软件,完全面向对象的程序设计语言. Java划分为三个技术平台,Ja ...
- Java程序设计(2021春)——第五章输入输出笔记与思考
Java程序设计(2021春)--第五章输入输出笔记与思考 本章概览: 异常处理简介 程序运行时,环境.操作等可能出现各种错误.故障,我们希望程序具有容错能力,给出错误信息.面向对象的程序设计里有异常 ...
- 20145213《Java程序设计》第八周学习笔记
20145213<Java程序设计>第八周学习笔记 教材学习内容总结 "桃花春欲尽,谷雨夜来收"谷雨节气的到来意味着寒潮天气的基本结束,气温回升加快.刚出冬的我对于这种 ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- 《Java程序设计》第三章-基础语法
20145221<Java程序设计>第三章-基础语法 总结 教材学习内容总结 类型.变量与运算符 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Typ ...
- Spring实战第一章学习笔记
Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...
- 学堂在线《Java程序设计(2021春)》系列笔记——前言
写在前面 目录 写在前面 这个系列是什么 为什么要做这篇博客 我是谁(其实不重要) 其他 这个系列是什么 这是关于学堂在线<Java程序设计(2021春)>(清华大学-郑莉教授)的个人同步 ...
- Java语言程序设计(基础篇)第一章
第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...
- Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述
第1章 Java程序设计概述1.1 Java程序设计平台 具有令人赏心悦目的语法和易于理解的语言,与其他许多优秀语言一样,Java满足这些要求. 可移植性 垃圾收集 提供大型的库 如果想要有奇特的绘 ...
随机推荐
- Linux_WEB访问控制示例(使用IPADDR类型)
前言: WEB服务使用访问控制,可以控制IP.主机名.以及某个网段的IP去访问我们的WEB服务,从而加减少流量的访问 一.使用IP控制访问 1.在/var/www/html下创建一个可访问的测试页面 ...
- Hutool :一个小而全的 Java 工具类库
Hutool 简介 Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的 ...
- STM32F7系列时钟相关问题:HSE模式配置(旁路模式、非旁路模式
从时钟源的角度,分为两类外部时钟(E)和内部时钟(I).从时钟速率的角度,分为两类高速时钟(HS)和低速时钟(LS).而把它们组合起来就有四种时钟:HSE.HIS.LSE.LSI.至于为什么会有这么复 ...
- 三大主流开源硬件对比:Arduino vs Raspberry Pi vs BeagleBone
http://www.elecfans.com/emb/361236_3.html 下文摘自上面的链接 软硬件整合是今年一再被提及的话题,如今我们也可以看到不少硬件创业的成功案例,比如Jawbone ...
- 机器学习PAL数据预处理
机器学习PAL数据预处理 本文介绍如何对原始数据进行数据预处理,得到模型训练集和模型预测集. 前提条件 完成数据准备,详情请参见准备数据. 操作步骤 登录PAI控制台. 在左侧导航栏,选择模型开发和训 ...
- [NOIP1998 提高组] 拼数
题目描述 设有 n 个正整数 a1-an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数. 输入格式 第一行有一个整数,表示数字个数 n. 第二行有 n 个整数,表示给出的 n 个整数 a_ ...
- JS设置GridView中的RadioButton只能选中一个
//JS&JQuery $(document).ready(function () { //点击跳转链接返回浏览器历史的上一个页面 $("#btnBack").click( ...
- JUC 并发编程--02,生产者和消费者 synchronized的写法 , juc的写法. Condition的用法
synchronized的写法 class PCdemo{ public static void main(String[] args) { //多个线程操作同一资源 Data data = new ...
- JSP三大指令是什么?
JSP页面中的指令JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言等.语法规则:<%@ 指令名 属性=值 属性=值 ... %>指令可以有很多个属性,它们以键值对的形 ...
- MySQL笔记01(黑马)
一.数据库基本介绍 目标:了解数据库的功能和常见数据库分类.数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1.数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库: ...