Java基础教程(3)-Java变量和数组

简介: 【4月更文挑战第3天】Java编程中,变量是基本存储单元,由标识符、类型和可选初始值构成,具有特定作用域。变量分为基本类型和引用类型,声明时需先定义类型,如`int num = 10;`。变量可重新赋值,类型转换分为自动(兼容类型)和强制(不兼容类型)。常量用`final`标识,如`public final int NUM = 20;`,常量值不可更改。关键词如`native`, `new`, `null`, `package`等有特殊含义。

变量:

变量是Java程序的一个基本存储单元。变量由一个标识符,类型及一个可选初始值的组合定义。此外,所有的变量都有一个作用域,定义变量的可见性,生存期。

定义一个变量

定义一个整型变量num:

int num = 10;
num是标识符号,也叫变量名称,int是变量类型, 10是初始值可选

变量分为两种:基本类型的变量和引用类型的变量。

在Java中,所有的变量必须先声明再使用。基本的变量声明方法如下:

type identifier [ = value][,identifier [= value] ...] ;

type是Java的基本类型之一,或类及接口类型的名字。标识符(identifier)是变量的名字,指定一个等号和一个值来初始化变量。
请记住初始化表达式必须产生与指定的变量类型一样(或兼容)的变量。声明指定类型的多个变量时,使用逗号将各变量分开;

变量名必须是一个合法的字符,不能以数字开头,而且不能使用java的保留字;

变量类型转换

变量的一个重要特点是可以重新赋值。不仅可以重新赋值同类型的,还可以赋值不同类型的,在赋值不同类型时,需要进行类型转换;

如果这2种类型是兼容的,那么Java将自动地进行转换。例如,把int类型的值赋给long类型的变量,这种类型转换都是可以隐式实现的。
不兼容的类型之间的转换必须使用一个强制类型转换,完成两个不兼容的类型之间的显式变换。

  • 自动类型转换(automatic type conversion)
    需要满足以下两个条件
    • 这2种类型是兼容的。
    • 目的类型数的范围比来源类型的大

数字类型,包括整数(integer)和浮点(floating-point)类型都是彼此兼容的,但是,数字类型和字符类型(char)或布尔类型(bollean)是不兼容的。字符类型(char)和布尔类型(bollean)也是互相不兼容的;

  • 不兼容类型的强制转换

    所谓强制类型转换只不过是一种显式的类型变换。它的通用格式如下:
    (target-type)value
    其中,目标类型(target-type)指定了要将指定值转换成的类型。例如,将int型强制转换成byte型。如果整数的值超出了byte型的取值范围,它的值将会因为对byte型值域取模(整数除以byte得到的余数)而减少。

当把浮点值赋给整数类型时一种不同的类型转换发生了:截断(truncation)。你知道
整数没有小数部分。这样,当把浮点值赋给整数类型时,它的小数部分会被舍去。例如,
如果将值1.23赋给一个整数,其结果值只是1,0.23被丢弃了。当然,如果浮点值太大而不
能适合目标整数类型,那么它的值将会因为对目标类型值域取模而减少。

常量

有点变量只能被赋值一次,一旦被赋值之后就不能再次更改了;这种变量称为常量;

在Java中,使用关键字final标识常量;
例如:

public final int NUM = 20;

常量一般习惯为全部大写;通常定义在类中,可以在多个方法中使用;通常称为类常量;

关键字

在Java中,有一部分保留字是不能设置为类,变量或者方法的名称得;这部分称为Java保留字符;也叫Java关键字;

JAVA中的关键字有以下几种:

在这里插入图片描述
在这里插入图片描述

关键字 含义
native 由宿主系统实现的一个方法
new 分配一个新对象或数组
null 一个空引用
package 包含类的一个包

在这里插入图片描述

transient

是被 transient 修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null。

synchronized

synchronized 是 Java 提供的一个并发控制的关键字。主要有两种用法,分别是同步方法和同步代码块。也就是说,synchronized 既可以修饰方法也可以修饰代码块。被 synchronized 修饰的代码块及方法,在同一时间,只能被单个线程访问。

volatile

和 synchronized 不同,volatile 是一个变量修饰符,只能用来修饰变量。无
法修饰方法及代码块等。volatile 的用法比较简单,只需要在声明一个可能被多线程同时访问的变量时,使用volatile 修饰就可以了

static

static 表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态 static代码块
用 static 表示变量的级别,一个类中的静态变量,不属于类的对象或者实例。因
为静态变量与所有的对象实例共享,因此他们不具线程安全性。
与静态变量一样,静态方法是属于类而不是实例。一个静态方法只能使用静态变量和调用静态方法。通常静态方法通常用于想给其他的类使用而不需要创建实例。
Java 的静态块是一组指令在类装载的时候在内存中由 Java ClassLoader 执行。静态块常用于初始化类的静态变量。大多时候还用于在类装载时候创建静态资源。Java 不允许在静态块中使用非静态变量。一个类中可以有多个静态块;
Java 可以嵌套使用静态类,但是静态类不能用于嵌套的顶层。静态嵌套类的使用与其他顶层类一样,嵌套只是为了便于项目打包。

数组

数组是一种数据类型;是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。

定义一个数组类型的变量,使用数组类型“类型[]”,例如, int[] 。和单个基本类型变量不同,数组变量初始化必须使用;
也可以在定义数组时直接指定初始化的元素,这样就不必写出数组大小,而是由编译器自动推算数组大小。

Java的数组有几个特点:

数组所有元素初始化为默认值,整型都是 0 ,浮点型是 0.0 ,布尔型是 false ;
数组一旦创建后,大小就不可改变;

数组又可以分为一维数组和多维数组

一维数组:

一维数组(one-dimensional array)实质上是相同类型变量列表。要创建一个数组,你必须首先定义数组变量所需的类型。通用的一维数组的声明格式是:

type var-name[ ];

其中,type定义了数组的基本类型。基本类型决定了组成数组的每一个基本元素的数
据类型。这样,数组的基本类型决定了数组存储的数据类型。

运算符new被应用到一维数组时,它的一般形式如下:

array-var = new type[size];

其中,type指定被分配的数据类型,size指定数组中变量的个数,array-var 是被链接到
数组的数组变量。也就是,使用运算符new来分配数组,你必须指定数组元素的类型和数
组元素的个数。用运算符new分配数组后,数组中的元素将会被自动初始化为零。

多维数组:

在Java中,多维数组(multidimensional arrays)实际上是数组的数组。
定义多维数组变量要将每个维数放在它们各自的方括号中。
当你给多维数组分配内存时,你只需指定第一个(最左边)维数的内存即可。你可以
单独地给余下的维数分配内存。

另一种数组声明语法
声明数组还有第二种格式:

type[ ] var-name;

这里,方括号紧跟在类型标识符type的后面,而不是跟在数组变量名的后面。例如,
下面的两个定义是等价的:

int al[] = new int[3]; 
int[] a2 = new int[3];

这种数组声明格式主要是为了方便。

相关文章
|
6天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
14天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
10天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
14天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
14天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
14天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
22天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
Java 数据库 容器
|
8天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
4天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
21 9