第一章-0 Java语言概述

一、Java语言的诞生与发展

Java语言诞生于20世纪90年代初期

Java语言是目前最流行的编程语言

二、Java语言的特点易学。

  1. 简单易学。
  2. java
  3. 面向对象。是一种以对象为中心,以消息为驱动的面向对象的编程语言。支持:封装、继承和多态
  4. 平台无关性。分为源代码级(需要重新编译,如C/C++)和目标代码级(Java)。
  5. 分布式。数据分布是指数据可以分散在网络的不同主机上;操作分布指把一个计算分散在不同的主机上处理。
  6. 可靠性和安全性。不支持指针,这样避免了对内存的非法访问;自动单元回收功能防 内存丢失等动态内存分配导致的问题;Java解释器运行时实施检查,可发现数组和字符串访问的越界;提供了异常处理机制。
  7. 支持多线程。线程是比进程更小的可并发执行的单位。
  8. 支持网络编程。Java的小程序(Applet)是动态、安全、跨平台的网络应用程序。
  9. 编译和解释并存。由编译器将Java源程序编译成字节码文件,然后再由Java运行系统解释执行字节码文件(解释器将字节码再翻译成二进制码运行)。

三、Java技术简介

Java SE(Standard Edition):是Java平台的标准版。主要用于桌面应用软件的编程。

Java ME(Micro Edition):是Java平台的精简版。主要应用于嵌入式系统开发,如手机和PDA的编程。

Java EE(Enterprise Edition):是Java平台的企业版。主要应用于分布式的网络程序的开发,如电子商务网站和ERP系统。

当前开发者使用最多的是JDK 8

四、Java虚拟机

image-20210516130121239

字节码是Java虚拟机(JVM)的指令组。字节码最大的好处是可跨平台运行,即Java的字节码可以编写一次,到处运行。

任何一种可以运行Java字节码的软件均可看成是Java的“虚拟机”,可以把Java的字节码看成是JVM上所运行的机器码。

  • ​ 解释器是JVM的一部分。

JIT与JVM的三种执行模式:解释模式、编译模式、混合模式

Java JIT(just in time)Compiler即时编译器是目的在于提高java程序的性能,改变人们“java比C/C++慢很多” 这一印象。

说起来是编译器,但此编译器与通常说的javac那个编译器不同,它其实是将字节码编译为硬件可执行的机器码的

如图所示为混合模式

​ ◼ 1、源代码经javac编译成字节码,class文件

​ ◼ 2、程序字节码经过JIT环境变量进行判断,是否属于“热点代码” (多次调用的方法,或循环等)

​ ◼ 3、如是,走JIT编译为具体硬件处理器(如sparc、intel)机器码

​ ◼ 4、如否,则直接由解释器解释执行

​ ◼ 5、操作系统及类库调用

​ ◼ 6、最终反应到硬件上

JVM还有两种执行方式:解释执行和编译执行。

  • ​ 对于解释执行,不经过JIT直接由解释器解释执行所有字节码,执行效率不高。
  • ​ 而编译执行不加筛选的将全部代码进行编译机器码不论其执行频率是否有编译价值,在程序响应时间的限制下,编译器没法采用编译耗时较高的优化技术,所以,在纯编译执行模式下的Java程序执行效率跟C/C++也是具有较大差距的。

因此,新版本的JVM默认都是采用混合执行模式。

JIT并不一定总能提高程序的执行效率甚至适得其反,这很大一部分取决于开发人员所写程序的质量。

五、Java程序的种类和结构

Java应用程序(Application)

它可以在Java平台上独立运行,通常称之为Java应用程序。Java应用程序是独立完整的程序,在命 令行调用独立的解释器软件即可运行。

Java应用程序的主类必须有一个定义为 public static void main(String[] args) 的主方法,这个是 Java应用程序执行的入口点方法,同时也是Java应用程序的标志。

Java应用程序可划分为以下两种:命令行程序Command Line;GUI (Graphics User Interface)

Java小程序(Appplet)(Java 9开始已经废弃)

Applet是嵌入在HTML(超文本标记语言)文档中的Java程序,必须搭配浏览器来运行,因此称 为小程序,也有人称为网页向导。

Java Servlet

应用于Web服务器

Android Application

Java应用程序与Java小程序的区别

小程序和应用程序之间的技术差别在于运行环境

由于小程序和应用程序的执行环境不同,它们的最低要求也不同。在应用方面,WWW使小程序的发布十分便利,因此小程序更适合在Internet上使用;相反,非网络系统和内存较小的系统更适合使用Java应用程序。

Java小程序可以直接利用浏览器或AppletViewer 提供的图形用户界面,而Java应用程序则必须 另外书写专用代码来营建自己的图形界面。

小程序的主类(程序执行的入口点)必须是一个继承自系统类Applet的子类,且该类必须是 public类。

Java程序的结构

一个复杂的程序可以由一个或多个Java源程序文件构成,每个文件中可以有多个类的定义。

一般的Java源程序文件可以由下列三部分组成:

​ package语句(0句或1句);

​ import语句(0句或多句);

​ 类定义(1个或多个类定义)。

Java程序注意事项

Java是严格区分大小写的语言。

一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。应用程序的主类不一定要求是public类。主类是Java程序执行的入口点。

同一个Java程序中定义的若干类之间没有严格的逻辑关系要求,但它们通常是在一起协同工作的, 每一个类都可能需要使用其他类中定义的静态属性或方法。

Java应用程序是由一系列的类定义构成的

​ Java程序运行的过程,就是类的对象之间交互的过程。

第一章-1 Java语言开发环境

一、Java开发工具

下载JDK 8的安装包。

设置环境变量:先设置JAVA_HOME,然后设置PATH。

二、JDK参考文档下载与安装

进行JDK参考文档的下载

帮助文档的使用:在开发中要学会及时查帮助。

三、JDK的使用

编译和运行Java应用程序

javac App2_1.java (编译)

java App2_1 (运行)

java App2_1_1 (运行)

Java应用程序说明

Java应用程序命名规则:

  • ​ 源文件的扩展名必须是 .java
  • 如果源文件中有多个类,则最多只能有一个public类,如果有的话,那么源文件的名字必须与这个 public类的名字相同(文件名的大小写可以与public类名的大小写不同);
  • ​ 如果源文件没有public类,那么源文件的名字有用户任意命名。主类:main方法是程序入口

养成良好的编码风格:

​ 命名规则:驼峰命名、帕斯卡命名、匈牙利命名

​ 基本规则是“见文识义”

​ 注释

JShell

Java Shell, Java 9 新特性。是一个 REPL(Read-Eval-Print Loop,读取-求值-输出 循环)工具

​ 类似于python解释器或者BASIC解释器, 允许交互式执行Java代码。

JShell 可以帮助你快速的测试代码。你 可以测试单个语句、测试使用不同的参 数调用方法,也可以在一个 JShell 会 话中测试不熟悉的 APIs。

但是,JShell 并不是 IDE 的替代品。 当你开发应用时,可以粘贴代码到 JShell 并测试它,然后把测试通过的代 码粘贴到程序编辑器或者 IDE 中。

第一章-2 Java语言基础知识

一、Java语言与面向对象的程序设计

Java语言是一个面向对象的程序设计语言。

除了面向对象的特点外,Java语言还存在安全性、平台无关性、支持多线程、内存管理等许多方面具有卓越的优点。

1、面向对象的程序设计思想

计算机程序设计

  • ​ 对问题进行抽象
  • ​ 用计算机语言表述,利用机器求解

程序设计语言发展的历程

  • ​ 机器语言
  • ​ 汇编语言
  • ​ 高级语言
  • ​ 面向对象的语言

面向对象的思想

  • ​ 将客观事物看作具有状态和行为的对象,通过抽象找出同一类对象的共同形态和行为,构成 类。
  • ​ 类是客观世界的概念在计算机世界的反应。
  • ​ 对象是客观世界的实体在计算机世界的反应。
  • ​ 对象是类的实例。
  • ​ 类是对象的类型。类可以理解为比C语言Struct高级的数据类型。

例如:

构建一个汽车类,需要提取所有汽车对象 的共有的状态和行为。将状态用变量表示, 行为用方法表示。

面向对象技术给软件发展带来的益处

  • ​ 可重用性
  • ​ 可靠性

面向对象语言的基本特征

  • 抽象和封装

​ 抽象的结果形成类,在类中封装了数据以及对数据的操作;同时类对外提供接口并隐藏了实现细节。

  • 继承性

​ 可以对已有的类增加新的属性和功能,或者进行部分修改来建立新的类,实现代码的重用。

  • 多态性

​ 同一个消息被不同的对象接收后可以导致不同的行为。(同一个动作名字,不同的动作)

2.Java语言的特点

  • 面向对象
  • 平台无关性
    • 编译后的字节码对应于Java虚拟机,因此可在不同平台上运行
  • 多线程
    • Java是第一个在语言级提供内置多线程支持的高级语言
  • 安全性
    • Java不支持指针
    • Java的内部安全措施
  • 内存管理
    • Java对内存自动进行管理并进行垃圾回收
  • Java语言的优点
    • 易于学习
    • 代码效率高
    • 代码质量高
    • 开发程序快
    • 体系结构中立,纯Java程序不依赖于平台
    • 一处编写,各处运行
    • 软件易于发布
  • Java与C++的区别
    • Java中没有#include和#define等预处理功能,用import语句来包含其他类和包;
    • Java中没有structure,union及typedef;
    • Java中没有不属于类成员的函数,没有指针和多重继承,Java只支持单重继承
    • Java中禁用goto,但是保留goto关键字;
    • Java中没有操作符重载;
    • Java中没有全局变量,可以在类中定义公用、静态的数据成员实现相同功能;

3.Java类库

组成Java程序的最小单元是类,类封装了数据与处理数据的方法。

对于大多数常用的功能,有大量已经编译好、经过测试的类,这些类的集合就是Java类库

Java类库主要是随编译器一起提供,也有些类库是由独立软件开发商提供的。

二、Java5和Java6的新特色

Java5

​ 增强for循环;泛型自动装箱拆箱;枚举类型;可变长参数;静态import;注解

Java6

​ 脚本执行功能;更强的网络服务支持;Java DB;新增桌面API;处理注解;更强的监控和管理;支持对编译器的访问;对XML安全性的支持。

1.Java5的新特色

  • 增强for循环:遍历集合类中元素的更方便的方式
  • 泛型:参数化类型,即所操作的数据类型被指定 为一个参数
  • 自动装箱拆箱:基本数据类型与其对应类的对象 之间的自动类型转换
  • 枚举类型:适用于元素为特定值的有限集合
  • 可变长参数:带省略号的参数,其实质是数组
  • 静态import:import类的静态成员,从而在使用 时不需要在静态成员名前加上类名
  • 注解:可用于向程序分析工具提供信息

2.Java6的新特色

  • 脚本执行:在Java代码中可以执行脚本
  • Java DB:Java 自带的数据库
  • 新增桌面API:提供类java.awt.DeskTop,用于和系统本身的应用程序交互
  • 处理注解:提供处理注解功能,从而方便分析 Java程序

三、Java程序概述

1.Java开发环境

一次编写,各处执行

Java平台

Java APIs(应用程序接口)

​ 经过编译的,可在程序中使用的Java代码标准库。

Java JVM(虚拟机)

​ Java程序由Java虚拟机程序执行(解释执行)。

Java平台 Java2 SDK(Software Development Kit)

​ J2SE,J2EE,J2ME

J2SE——J2SDK的核心部分

  • ​ 开发工具
    • 编译器
    • 调试器
    • 文档制作工具
  • 运行环境
    • Java虚拟机
    • 组成Java2平台API的类
    • 帮助文档
  • 附加库
  • Java程序(Applications)的演示

Java开发工具包括

  • javac:Java编译器,用来将Java程序编译成Bytecode。
  • Java:Java解释器,执行已经转换成Bytecode的Java应用程序
  • Jdb:Java调试器,用来调试Java程序。
  • Javap:反编译,将类文件还原回方法和变量。
  • Javadoc:文档生成器,创建HTML文件。
  • Appletviwer:Applet解释器,用来解释已经转换成Bytecode的Java小应用程序。

2.Application举例

Application

  • 运行在客户端Java虚拟机上的Java程序
  • 可在客户端机器中读写
  • 可使用自己的主窗口、标题栏和菜单
  • 程序可大可小
  • 能够以命令行方式运行
  • 主类必须有一个主方法main(),作为程序运行的入 口。

4.Servlet举例

Servlet

  • 运行在服务器端,响应客户端请求,扩展了服务器的功能
  • 运行Servlet需要服务器的支持,需要在服务器中 进行部署
  • Servlet用到的包在J2EE的API中能找到
  • 所有的servlet都必须实现Servlet接口

5.JSP举例

  • JSP就是嵌入了Java代码的HTML
  • JSP和servlet同是服务器端的技术。实际上,JSP 文档在后台被自动转换成servlet
  • 使用JSP便于实现网页的动静分离
  • 相对于Servlet,JSP在服务器的部署简单

6.运行脚本举例

  • Java的脚本API提供一个独立于脚本语言,在 Java代码中使用脚本引擎的框架
  • 通过Java脚本API,可以用Java语言实现一定的功能,而将另外一些功能通过脚本来实现
  • 脚本的来源可以是Java程序中的String对象,也 可以来源于文件

脚本来源于String:

脚本来源于文件:

四、基本数据类型与表达式

1.变量与常量

变量

Type varName[=value] [,varName[=value]…]

▫ 一个由标识符命名的项

▫ 每个变量都有类型, 例如 int 类型或 Object类型, 变量还有作用域.

▫ 变量的值可以被改变

Java语言程序中可以随时定义变量,不必集中在执行语句之前。

变量的作用域:

​ 类成员变量的作用域为整个类

​ 方法局部变量的作用域为塌缩在的代码块

Java语言的复合语句与C语言复合语句不同的是:Java语言不允许在两个嵌套的复合语句内生成两个同名的变量。

Java10新特性

​ 根据局部变量的初始化值,编译器推断出变量类型。从而简化代码书写(语法糖)

​ 适用场合:

  1. ​ 局部变量初始化
  2. ​ for循环内部索引变量
  3. ​ 传统的for循环声明变量

不适用场合

  1. ​ 方法参数
  2. ​ 构造函数参数
  3. ​ 方法返回类型
  4. ​ 类成员变量类型

常量

变量声明前面加上final修饰

final Type varName[=value][,varName=value]…];

常量一旦初始化以后就不可改变。比如:

​ final int PRICE=30;

​ final double PI = 3.141592654;

标识符

标识符是一个名称,与内存中的某个位置(地址)相对应

标识符的第一个字符必须是下列字符之一:

​ 大写字母 (A-Z) ; 小写字母 (a-z) ; 下划线(_) ; 美元符号 ($)

标识符的第二个字符及后继字符必须是:

​ 上述列表中的任意字符 ; 数字字符 (0-9)

变量默认值

类的成员变量有默认值

这些变量的存储空间通过new在堆中分配。想象为new操作本身对分配的内存区域首先全部清零。

方法的局部变量没有默认值

这些变量的存储空间分配在栈中。随着方法的调用和返回而分配和释放,在这个过程中,无法频繁地进行清零操作,否则大大影响执行效率。

2.基本数据类型

image-20210516154554542

文字量(literal):24、true、’a’等出现在程序中叫做文字量。默认情况下:

​ 整数文字量类型为int, 后面加L或者l成为long型

​ 浮点文字量类型为double, 后面加F或者f成为float

\r、\n、\t等转义字符与c语言基本对应。字符型 采用unicode编码,转义方法为’\u0000’- ’\uFFFF’

整数运算

比较运算符(关系运算符)

​ 算数比较运算符 < , <= , > , >=

​ 算术相等比较运算符 == , !=

算术运算符

​ 一元运算符 + ,-

​ +, -, *, /, %

​ 自增/自减运算符 ++/–

​ 移位运算符 << , >> , >>>

​ 位运算符 ~ , & , |, ^

​ 条件运算符 ?:

​ 类型转换运算符

字符串连接运算符 +

“>>>”为逻辑右移,移位时最高位补0

​ ▫ -1>>31 结果为-1

​ ▫ -1>>>31 结果为1

移位运算的移位数,会根据变量字长做调整

  • 比如整数占用四个字节,长度为32, 所以整数移位的最大有效位数为31(5个二进制位)。大于31的数, 会对32取模然后移位

浮点数

  • float
    • 单精度浮点数
    • 32-bit
    • - m·2e ~ m·2e
      • m 是一个小于 2^24的正整数
      • e 是一个介于 -149和104之间(含)的整数
  • double
    • 双精度浮点数
    • 64-bit
    • - m·2e ~ m·2e
      • m 是一个小于 2^53的正整数
      • e 是一个介于 -1045和1000之间(含)的整数

浮点运算bijiaoyun

比较运算符(关系运算符)

​ 算数比较运算符 < , <= , > , >=

​ 算术相等比较运算符 == , !=

算术运算符

​ 一元运算符 + ,-

​ +, -, *, /, %

​ 自增/自减运算符 ++/–

​ 移位运算符 << , >> , >>>

​ 位运算符 ~ , & , |, ^

​ 条件运算符 ?:

​ 类型转换运算符

字符串连接运算符 +

对取模运算符“%”来说,其操作数可以为浮点数。

即a % b与a-((int)(a/b)*b)的语义相同,这表示a % b 的结果是除完后剩下的浮点数部分。如37.2%10=7.2 。(默认双精度)

值得注意的是Java语言对加运算符进行了扩展,使 它能够进行字符串的连接,如”abc”+”de”,得到字符 串”abcde” 。

布尔类型和布尔值

布尔类型表示一个逻辑量, 有两个取值: true和 false

布尔运算符

  • 关系运算符 == and !=

  • 逻辑“非”运算符 !

  • 逻辑运算符 &, ^ , 和 |

  • 条件“与” 和条件“或”运算符 && 和 ||

  • 条件运算符 ? :

  • 字符串连接运算符 +

简洁运算(&&、||)与非简洁运算(&、|)的区别在 于:

​ 非简洁运算在必须计算完左右两个表达式之后,才取结果值;

​ 而简洁运算可能只计算左边的表达式而不计算右边的表达式。

​ 即对于&&,只要 左边表达式为false,就不计算右边表达式,则整 个表达式为false;对于||,只要左边表达式为true ,就不计算右边表达式,则整个表达式为true。

String——字符串

  • String是一个
  • String类是JDK标准类集合中的一部分

注意String是常量,一旦创建就不能修改。

  • 意思是字符串里面的字符不能改,不是String变量不能重新赋值。
  • 比如:String a=”Hello”; a=”World”; 这个是可以的。但是String类的方法没有修改字符的。

JDK8以及之前可以通过反射修改字符;JDK11已经禁 止了。

文字量

直接出现在程序中并被编译器直接使用的值.

整数文字量

  • 十进制。15
  • 十六进制。0xff
  • 八进制。0377

浮点文字量

一个浮点文字量包括以下几个部分:整数部分,小数点,小数部分,指数 (e or E),类型后缀(f or F for float, d or D for double)

float类型文字量举例:

  • 1e 1f 2.f .3f 0f 3.1 4f 6.022137e+23f

double类型文字量举例:

  • 1e1 2. .3 0.0 3.1 4 1e-9d 1e137

布尔文字量

  • 布尔类型只有两个值,由文字量 true 和 false表示

字符文字量

  • 一个字符文字量表示为一个字符或者一个转义序列, 用单引号括起
    • 例如 ‘ a ’ ‘Z’ ‘@’
  • 格式字符
    • \b backspace BS
    • \t horizontal tab HT
    • \n linefeed LF
    • \f form feed FF
    • \r carriage return CR
    • \“ double quote”
    • \‘ single quote’
    • \\ backslash \

字符串文字量

  • 由零个或多个字符组成,以双引号括起

  • 每一个字符都可以用转义序列来表示

  • 例如: “” // 空字符串

    “"“ // 只包含 “ 的字符串

    “This is a string” // 有16个字符的字符串

    “This is a “ + “string” //字符串常量表达式,由两个字符串常量组成

3.表达式与运算符

表达式是由一系列变量、运算符、方法调用构成的,表达式可以计算出一个值来

程序中的很多工作是通过计算表达式的值来完成 的。

  • 有时需要的是表达式的副作用,例如赋值表达式将数值赋给变量
  • 更多时候起作用的是表达式的值,这个值可以用作方法的参数,或更大的表达式的操作数,或者 影响语句的执行顺序

算术运算符

  • ▫ 运算符 ++ 和 – 例如: i++; –j;
  • ▫ 一元运算符 + 和 –
  • ▫ 加法运算符 + 和 -
  • ▫ 乘法运算符 * , /, 和 %

赋值运算符

  • ▫ 简单赋值运算符 =

  • ▫ 复合赋值运算符 *= /= %= += -= <<= >>= >>>= &= ^= |=

    ​ E1 op= E2 等效于 E1 = (T)((E1) op (E2)), 其中T 是 E1 的类型

关系运算符

  • ▫ 关系表达式的类型永远是布尔类型(bool)

  • ▫ 算术比较运算符 <, <=, >, and >=

  • ▫ 类型比较运算符 instanceof 用于测试指定对象是否是指定类型(类或子类或接口)的实例

    例如: e instanceof Point //Point 是一个类

相等关系运算符

  • ▫ 数字相等运算符 == , !=
  • ▫ 布尔相等运算符 == , !=
  • ▫ 引用相等运算符 == , !=

逻辑运算符

  • ▫ “与”运算 && 如果两个操作数的值都为true运算结果为true; 否则,结果为false.
  • ▫ “或”运算 || 如果两个操作数的值都为false运算结果为false;否则,结果true
  • ▫ “非”运算符! 操作数的类型必须是布尔类型 , 如果操作数的结果为 false,则表达式的结果为 true , 如果操作数的结果为 true则表达式的结果为 false

条件运算符 (表达式1?表达式2:表达式3)

  • ▫ 首先计算表达式1
  • ▫ 如果表达式1的值为 true, 则选择表达式2的值
  • ▫ 如果表达式1的值为 false,则选择表达式3的值

4.类型转换

每个表达式都有类型

如果表达式的类型对于上下文不合适

  • 有时可能会导致编译错误
  • 有时语言会进行隐含类型转换

扩展转换

  • byte, char, short, int, long, float, double
  • 从一种整数类型到另一种整数类型,或者从 float到double的转换不损失任何信息
  • 从整数类型向float或double转换,会损失精度
  • 如:int n = 123456789; float f =n; 运行结果是:1.23456792E8

窄化转换

  • double, float, long, int, short, byte,char
  • 窄化转换可能会丢失信息

赋值转换

​ 将表达式类型转换为指定变量的类型

方法调用转换

​ 适用于方法或构造方法调用中的每一个参数

强制转换

​ 适用于方法或构造方法调用中的每一个参数

​ 例如 (float)5.0

字符串转换

​ 任何类型(包括null类型)都可以转换为字符串类型

​ 只当一个操作数是String类型时, 适用于+运算符的操作数

数字提升

​ 将算术运算符的操作数转换为共同类型

  • 一元数字提升
    • 如果一个操作数是byte,short,或char类型,一元数字提升通过扩展转换将它转换为int类型
  • 二元数字提升
    • 二元数字提升作用在特定操作符的操作数上 *, /, %, +, -, <, <=, >, >=, ==, !=, &, ^, | and?:
    • 在必要时使用扩展转换来转换操作数类型

标准输入输出简介

• 标准输入流 System.in

• 标准输出流 System.out

例如:System.out.println(“Hello world!”);

补充:引用(Reference)

Java语言没有指针,但是有“引用”。引用是一个地址,指向对象所在的位置。在这个位置,存储着对象的变量和方法的入口地址。

引用在很多方面类似于C/C++语言的指针, 但是又有很重要的区别:

  • 在Java中不能进行指针的运算,比如C语言中对指针的加减运算。
  • Java中的引用类型检查和控制更加严格,不向C/C++语言中,类型转换比较灵活。
  • 程序员可以使用引用访问对象,但是具体地址对程序员不可见
  • 在C++ 11中,引入了“智能指针”,与Java的引用 作用类似(shared_ptr、unique_ptr、weak_ptr)。
  • Java有下列几种引用变量:
    • Class,Annotation,Array,Enumeration,Interface
  • Java引用变量的默认初值是null
  • Java对象的创建使用new关键字,比如:
    • class Point {…..}
    • Point p = new Point();
  • Java中,p是一个引用变量,又叫做Point类的实例变量

五、数组的概念

数组由同一类型的一连串对象或者基本数据组成,并封装在同一个标识符(数组名称)下。

数组是对象

  • 动态初始化
  • 可以复制给Object类型的变量
  • 在数组中可以调用类Object的所有方法

数组元素

  • 数组中的变量被称作数组的元素

  • 元素没有名字,通过数组名字和非负整数下标值 引用数组元素

  • 每个数组都有一个由 public final 修饰的成员变量:length(>=0),即数组含有元素的个数

    • 注意:对比字符串长度是一个方法:

      String str = “Hello”;

      int len = str.length();

六、数组的创建和引用

1.数组的声明

声明

  • 声明数组时无需指定数组元素的个数,也不为数组元素分配内存空间
  • 不能直接使用,必须经过初始化分配内存后才能使用
  • Type[ ] arrayName;
    • 例如: int[] intArray; String[] stringArray;
  • Type arrayName[ ];
    • 例如: int intArray[]; String stringArray[];

用关键字new构成数组的创建表达式,可以指定数组的类型和数组元素的个数。元素个数可以是常量也可以是变量

基本类型数组的每个元素都是一个基本类型的变 量;引用类型数组的每个元素都是对象的的引用

2.数组的创建

arryName=new Type[componets number];

▫ 例如: int[] ai; ai=new int[10];

​ String[] s; s=new String[3];

▫ 或者可以将数组的声明和创建一并执行

​ int ai[]=new int[10];

▫ 可以在一条声明语句中创建多个数组

​ String[] s1=new String[3], s2=new String[8];

3.数组的初始化

声明数组名时,给出了数组的初始值,程序 便会利用数组初始值创建数组并对它的各个元 素进行初始化。

int a[]={22, 33, 44, 55};

创建数组的时,如果没有指定初始值,数组便被赋予默认值初始值

  • 基本类型数值数据,默认的初始值为0;
  • boolean类型数据,默认值为false;
  • 引用类型元素的默认值为null。

程序也可以在数组被构造之后改变数组元素值

4.数组的引用

通过下面的表达式引用数组的一个元素: arrayName[index]

数组下标必须是 int , short, byte, 或者 char

下标从零开始计数

元素的个数即为数组的长度,可以通过arryName.length引用

元素下标最大值为 length – 1,如果超过最大值, 将会产生数组越界异常(ArrayIndexOutOfBoundsException)

数组名是一个引用

public class Arrays 
{ public static void main(String[] args)
{ int[] a1 = { 1, 2, 3, 4, 5 };
int[] a2;
a2 = a1; //a2和a1指向同一个数组
for(int i = 0; i < a2.length; i++) a2[i]++;
for(int i = 0; i < a1.length; i++)
System.out.println( "a1[" + i + "] = " + a1[i]);
}}

字符串引用构成的数组:

String[] strArray;
strArray = new String[8];
strArray[0] = "Hello";

数组的复制:System类提供的方法

public static void arraycopy(Object source , int srcIndex , 
Object dest , int destIndex , int length )

public class ArrayCopyDemo {
public static void main(String[] args) {
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e',
'i', 'n', 'a', 't', 'e', 'd'};
char[] copyTo = new char[7];
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(new String(copyTo));
}
}

注意:如果数组元素为引用类型,则复制就是所谓的“浅复制”。也就是复制的数组元素和被复制的数组元素指向同一个对象(Shallow copy)。

5.多维数组

int[][] gradeTable;

gradeTable[ 0 ][ 1 ] 为42
gradeTable[ 3 ][ 4 ] 为93
gradeTable[ 6 ][ 2 ] 为78

二维数组的声明和构造

  • int[ ] [ ] myArray ;
    • myArray 可以存储一个指向2维整数数组的引用。 其初始值为null。
  • int [ ] [ ] myArray = new int[3] [5];
    • 建立一个数组对象,把引用存储到myArray。这个 数组所有元素的初始值为零。
  • int[ ] [ ] myArray = { {8,1,2,2,9}, {1,9,4,0,3}, {0,3,0,0,7} };
    • 建立一个数组并为每一个元素赋值。

二维数组的长度

class UnevenExample2{ 
public static void main( String[ ] arg ){
int[ ][ ] uneven =
{ { 1, 9, 4 },
{ 0, 2},
{ 0, 1, 2, 3, 4 } };
System.out.println("Length is: " + uneven.length );
}
}

运行结果:Length is : 3