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. 搭建LNMP环境部署Wordpress博客

    !!!首先要做的就是关闭系统的防火墙以及selinux: #systemctl stop firewalld #systemctl disable firewalld #sed -ri 's/^(SE ...

  2. DOCKER学习_014:Docker存储补充

    在前面已经学习了Docker的存储,https://www.cnblogs.com/zyxnhr/p/11830238.html,现在对前面的内容的一个补充,具体请参考https://www.cnbl ...

  3. IDEA 怎么统计项目代码行数

    引言 IDEA 统计项目代码行数,主要是使用 Statistic 插件来统计 第一步 点击 File->Settings,如下图所示: 第二步 点击 install 安装 Statistic 插 ...

  4. python3 ftplib模块连接FTP

    from ftplib import FTP_TLS import os import re class MyFtp(FTP_TLS): """继承FTP类"& ...

  5. 关于lua闭包导致引用无法释放内存泄露

    最近项目存在严重的内存泄漏问题,每次切level 会增加20M无法释放的内存,翻遍了项目用了多个工具,查询资料等 发现项目中两种存在内存泄露的情况 1.lua闭包的不当使用,对比包的引用要及时 释放. ...

  6. celery Django 简单示例

    一.目录结构 二.创建worker文件夹 __init__.py # -*- coding:utf-8 -*-import osfrom celery import Celery, platforms ...

  7. openresty 学习笔记六:使用session库

    openresty 学习笔记六:使用session库 lua-resty-session 是一个面向 OpenResty 的安全和灵活的 session 库,它实现了 Secure Cookie Pr ...

  8. noip模拟5[string·matrix·big·所驼门王的宝藏]

    怎么说呢这一场考得还算可以呢 拿了120pts,主要是最后一个题灵光开窍,想起来是tarjan,然后勉勉强强拿了40pts,本来是可以拿满分的,害 没事考完了就要反思 这场考试我心态超好,从第一个题开 ...

  9. Jittor 的Op, Var算子

    Jittor 的Op, Var算子 要使用jittor训练模型,需要了解两个主要概念: Var:Jittor的基本数据类型 Operations:Jittor的算子与numpy类似 首先,开始使用Va ...

  10. 手把手教你彻底理解MySQL的explain关键字

    数据库是程序员必备的一项基本技能,基本每次面试必问.对于刚出校门的程序员,你只要学会如何使用就行了,但越往后工作越发现,仅仅会写sql语句是万万不行的.写出的sql,如果性能不好,达不到要求,可能会阻 ...