Oracle Java 是广受欢迎的编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今,Java 仍是企业和开发人员的首选开发平台,全球有数百万开发人员运行超过 60 亿台 Java 虚拟机。
Java 的发展史
在 1991 年的时候,詹姆斯·高斯林在 Sun 公司的工程师小组想要设计这样一种主要用于像电视盒这样的消费类电子产品的小型计算机语言。这些电子产品有一个共同的特点:计算处理能力和内存都非常有限。所以要求:语言必须非常小且能够生成非常紧凑的代码,这样才能在这样的环境中执行。另外,由于不同的厂商选择不同的 CPU,因此,要求该语言不能和特定的体系结构绑在一起,要求语言本身是中立的,也就是跨平台的。
最初这个语言命名为“Green”,类似于绿色软件的意思。其原先的目的是为家用消费电子产品开发一个分布式代码系统,这样我们可以把 E-mail 发给电冰箱、电视机等家用电器,对它们进行控制, 和它们进行信息交流。
最开始准备采用 C++,但 C++太复杂,安全性差,最后基于 C++ 开发一种新的语言 Oak,Oak 是一种用于网络的精巧而安全的语言, Sun 公司此投标一个交互式电视项目,但结果被 SGI 打败。可怜的 Oak 几乎无家可归,恰巧这时 Mark Ardreesen 开发的 Mosaic 和 Netscape 启发了 Oak 项目组的成员。他们用一种全新的语言编写了一款浏览器,得到了 Sun 公司首席执行官 Scott McNealy 的支持。
最开始 Java 叫做 Oak,为什么叫 Oak 呢?因为最开始起名字是 Gosling 回首向窗外望去,看见一棵老橡树,于是建一个目录叫 Oak,这就是 Java 语言的前身。后来发现 Oak 已是 Sun 公司的另一个语言的注册商标,才改名为 Java,即爪哇,太平洋上一个盛产咖啡的岛屿的名字,也寓意能为世界各位带来一杯热咖啡。
Java 的特点
Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java 具有简单性、面向对象、分布式、健壮性、平台独立性、多线程、动态性等特性。
简单性
Java 看起来设计得很像 C++,但是为了使语言小和容易熟悉,设计者们把 C++ 语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。Java 剔除了 C++ 的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为 Java 没有结构,数组和串都是对象,所以不需要指针。Java 能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。
面向对象
Java 是一个面向对象的语言。对程序员来说,这意味着要注意应用中的数据和操纵数据的方法,而不是严格地用过程来思考。在一个面向对象的系统中,类是数据和操作数据的方法集合。数据和方法一起描述对象的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。
Java 程序是用类来组织的。Java 还包括一个类的扩展集合,分别组成各种程序包,用户可以在自己的程序中使用。例如,Java 提供产生图形用户接口部件的类(java.awt 包),这里 awt 是抽象窗口工具集的缩写,处理输入输出的类(java.io 包)和支持网络功能的类(java.net 包)。
分布性
Java 设计成支持在网络上应用,它是分布式语言。Java 既支持各种层次的网络连接,又以 Socket 类支持可靠的流网络连接,所以用户可以产生分布式的客户机和服务器。网络变成软件应用的分布运载工具。Java 程序只要编写一次,就可到处运行。
编译和解释性
Java 编译程序生成字节码(byte-code),而不是通常的机器码。Java 字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。
健壮性
Java 原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成高可靠和稳健的。Java 消除了某些编程错误,使得用它写可靠软件相当容易。
Java 是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java 要求显式的方法声明,它不支持 C 风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。可靠性方面最重要的增强之一是 Java 的存储模型。
Java 不支持指针,它消除重写存储和讹误数据的可能性。类似地,Java 自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java 解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。
异常处理是 Java 中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。使用 try/catch/finally 语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。
安全性
Java 的存储分配模型是它防御恶意代码的主要方法之一。Java 没有指针,所以程序员不能得到隐蔽起来的内幕和伪造指针去指向存储器。更重要的是,Java 编译程序不处理存储安排决策,所以程序员不能通过查看声明去猜测类的实际存储安排。编译的 Java 代码中的存储引用在运行时由 Java 解释程序决定实际存储地址。
Java 运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何 Java 语言限制。这个安全机制部分包括类如何从网上装载。例如,装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来代替标准 Java 类。
可移植性
Java 使得语言声明不依赖于实现的方面。例如,Java 显式说明每个基本数据类型的大小和它的运算行为(这些数据
类型由 Java 语法描述)。Java 环境本身对新的硬件平台和操作系统是可移植的。Java 编译程序也用 Java 编写,而 Java 运行系统用 ANSIC 语言编写。
高性能
Java 是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java 设计者制作了“及时”编译程序,它能在运行时把 Java字节码翻译成特定 CPU(中央处理器)的机器代码,也就是实现全编译了。Java 字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。
多线程性
Java 是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。Java 的 lang 包提供一个 Thread 类,它支持开始线索、运行线索、停止线索和检查线索状态的方法。
动态性
Java 语言设计成适应于变化的环境,它是一个动态的语言。例如,Java 中的类是根据需要载入的,甚至有些是通过网络获取的。
Java 的名词解释
JRE:(Java Runtime Environment),java 运行环境。包括 Java 虚拟机(JVM Java Virtual Machine)和 Java 程序所需的核心类库等,如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。
JDK:(Java Development Kit Java)开发工具包。JDK 是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了 JRE。所以安装 JDK 后,就不用在单独安装 JRE 了。
JVM:(Java Virtual Machine)Java 虚拟机。JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入 Java 语言虚拟机后,Java 语言在不同平台上运行时不需要重新编译。Java 语言使用 Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
Java 的安装
下载
我们可以从官网上下载最新版本 JDK 。传送门。
截至文章发布时,官网上最新可持久化版本是:JDK17。
Windows 系统下载这个版本就行。
安装
安装其实没有什么好说的,双击下载下来的.exe安装包,一路下一步,选择安装盘符即可。
环境变量
最新版本的 JDK 是可以不需要配置环境变量的,但是在讲解过程中,我们还是带领大家一起配置 JDK 的环境变量。配置系统以 windows11 来演示。
首先进入系统设置
其次进入高级系统设置配置JAVA_HOME
下来配置 path 变量
测试
快捷键 win+R ,输入 cmd,回车进入命令提示符。
分别输入 java -version和javac -version。
如果出现如下效果,说明安装成功!骚年,可以开始你的代码编程生涯了!
Hello,World!
开始我们经典的“Hello,World!”程序吧!
新建
新建一个 Java 文件,命名为 Hello.java。
编写
用编译器打开它,开始编写我们的代码。
public class Hello{
public static void main(String[] args){
System.out.println("Hello,World!");
}
}
编译
编写好的 java 代码不能直接运行,需要进行二次编译后才能执行。在 cmd 窗口下,进入当前文件所在目录,使用如下命令编译:
javac Hello.java
编译后,会生成如下文件:
运行
同样的,在 cmd 窗口下,进入当前目录,使用如下命令运行:
java Hello
Java 的运行流程
根据刚才的初始案例,我们能看到Java在书写完代码后并不能直接运行,需要编译后才能执行。
Java 源程序与编译型语言运行区别
- Java源程序-编译-字节码程序-解释执行-解释器-操作系统-裸机
- 编译型源程序-编译连接-可执行程序EXE-执行-操作系统-裸机
Java 的编译工具
Eclipse
是一个开放源代码的、基于 Java 的可扩展开发平台,也可以称之跨平台的自由集成开发环境(IDE)。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。最初主要用来 Java 语言开发,通过安装不同的插件 Eclipse 可以支持不同的计算机语言,比如 C++和 Python 等开发工具。
Eclipse 的本身只是一个框架平台,但是众多插件的支持使得 Eclipse 拥有其他功能相对固定的 IDE 软件很难具有的灵活性。许多软件开发商以 Eclipse 为框架开发自己的 IDE。
Idea
全称 IntelliJ IDEA,是 java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 java 开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、svn 等)、JUnit、CVS 整合、代码分析、 创新的 GUI 设计等方面的功能可以说是超常的。
使用 Idea 编写代码
我们刚才通过最原始的记事本方式输出了“Hello,world!”,会发现,输出这么一段话就需要很多步骤,太繁琐了!有没有简单点的方式快速构建代码体系呢?
有的,我们可以使用开发工具来实现这一目标,后期我们都使用 Idea 来作为主开发工具。
创建项目
Idea 使用项目来管理我们的代码,项目其实就是一个‘文件夹’,我们所书写的‘类’都存放在这个文件夹中。
点击新建项目,创建一个空项目
新建 src 文件夹
标记 src 文件夹为源代码根目录
创建好的项目结构如下:
新建包
什么是包:为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用:
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
如何新建一个包:
新建类
在刚才新建的包下右键,新建类 Hello。
代码如下:
public class Hello{
public static void main(String[] args){
System.out.println("Hello,World!");
}
}
在 Java 中,main()方法是 Java 应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是 main()方法,这个方法和其他的方法有很大的不同。比如方法的名字必须是 main,方法必须是 public static void类型的,方法必须接收一个字符串数组的参数等。
运行
是不是很简单,书写好代码之后工具会帮我们编译代码,我们只需要专注于代码书写即可。
Java 中的注释
注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、方法等的解释或提示,能提高程序代码的可读性。
注释只是为了提高可读性,不会被计算机编译。
注释的分类
- 单行注释
- 多行注释
- 文档注释
//单行注释
/*
多行注释
*/
/**
*@...
*....
*文档注释
*/
文档注释
单行注释和多行注释比较简单,分别代表描述一行的注释和多行的注释,那么文档注释又是什么呢?
文档注释又叫javadoc注释是Sun公司提供的一个技术,它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。也就是说,只要在编写程序时以一套特定的标签作注释,在程序编写完成后,通过Javadoc就可以同时形成程序的开发文档了。
javadoc命令是用来生API文档的,使用方式:使用命令行在目标文件所在目录输入javadoc +文件名.java。
我们写代码,都是有规范的,如果你写的代码可以运行,但是一团乱麻,是没人愿意使用的,因为难以维护,所以,代码不只是单纯的程序,在网络世界,我更愿意称之它为艺术品,需要你的精心镌刻。
可能有人会说,不就是注释吗?这有什么的
不过,这个Doc注释可不与其他两个注释一样,注释也是存在规范的哦!
文档注释规范
格式:写在类上的文档标注一般分为三段:
- 概要描述,通常用一句或者一段话简要描述该类的作用,以英文句号作为结束。
- 详细描述,通常用一段或者多段话来详细描述该类的作用,一般每段话都以英文句号作为结束。
- 文档标注,用于标注作者、创建时间、参阅类等信息。
@符号的用处
我们在写Doc注释时,/** 后直接回车,会自动生成后面的注释框架,和部分@符号,那么这些@符号有什么用呢?
标签 | 描述 | 示例 |
---|---|---|
@author | 标识一个类的作者,一般用于类注释 | @author description |
@deprecated | 指名一个过期的类或成员,表明该类或方法不建议使用 | @deprecated description |
{@docRoot} | 指明当前文档根目录的路径 | Directory Path |
@exception | 可能抛出异常的说明,一般用于方法注释 | @exception exception-name explanation |
{@inheritDoc} | 从直接父类继承的注释 | Inherits a comment from the immediate surperclass. |
{@link} | 插入一个到另一个主题的链接 | {@link name text} |
{@linkplain} | 插入一个到另一个主题的链接,但是该链接显示纯文本字体 | Inserts an in-line link to another topic. |
@param | 说明一个方法的参数,一般用于方法注释 | @param parameter-name explanation |
@return | 说明返回值类型,一般用于方法注释,不能出现再构造方法中 | @return explanation |
@see | 指定一个到另一个主题的链接 | @see anchor |
@serial | 说明一个序列化属性 | @serial description |
@serialData | 说明通过 writeObject() 和 writeExternal() 方法写的数据 | @serialData description |
@serialField | 说明一个 ObjectStreamField 组件 | @serialField name type description |
@since | 说明从哪个版本起开始有了这个函数 | @since release |
@throws | 和 @exception 标签一样. | The @throws tag has the same meaning as the @exception tag. |
{@value} | 显示常量的值,该常量必须是 static 属性。 | Displays the value of a constant, which must be a static field. |
@version | 指定类的版本,一般用于类注释 | @version info |
Java 中的输出
普通输出
普通输出主要有两种,一种是输出之后换行,另一种是输出之后不换行。
输出特殊字符
普通输出就是将内容书写到双引号中输出就行,那么对于一些特殊的符号或者操作如何进行呢?
这里我们就要用到转义字符来完成,Java 中的转义字符如下:
转义字符 | 意义 |
---|---|
\b | 退格(BS) ,将当前位置移到前一列,不能回退行。 |
\f | 换页(FF),将当前位置移到下页开头,在控制台上输出无意义。 |
\n | 换行(LF) ,将当前位置移到下一行开头。 |
\r | 回车(CR) ,将当前位置移到本行开头,如果之前该行有内容, 则会被覆盖,在控制台上输出无意义。 |
\t | 水平制表(HT) (跳到下一个 TAB 位置)。 |
\\ | 代表一个反斜线字符。 |
\' | 代表一个单引号字符。 |
\" | 代表一个双引号字符。 |
\0 | 空字符(NULL) ,在控制台上输出无意义。 |
Java 中的命名规则和规范
命名规则
所有命名规则必须遵循以下规则:
- 名称只能由字母、数字、下划线、$符号和中文组成。
- 不能以数字开头。
- 名称中不能使用 JAVA 中的关键字。
命名规范
不同类型的名称规范不同,具体规范如下:
- 包名命名全部小写,点分割符之间有且仅有一个自然语义的英语单词。
- 类名首字母大写,其后每个单词首字母大写,驼峰式命名方式,名词。
- 变量名首字母小写,其后每个单词首字母大写,驼峰式命名方式,名词。
- 方法名首字母小写,其后每个单词首字母大写,驼峰式命名方式,动词。
- 常量命名全部大写,单词间用下划线隔开,力求语义表达完整,不要嫌名字长。
- 代码中的命名均不要使用中文,命名尽量望文知义,不要中(拼音)英文混搭。
- 数组的命名使用“类型[] 数组名”的形式。
驼峰命名法
骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命名规则。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成类、变量和方法的名字。程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式。
有些程序员喜欢全部小写,有些程序员喜欢用下划线,所以如果要写一个my name的变量,他们常用的写法会有myname、my_name、MyName或者myName。这样的命名规则不适合所有程序员阅读,而利用驼峰命名法来表示,可以增加程序可读性。
初学时容易出现的问题
- Java 是大小写区分的语言。
- 标点符号都应该是英文状态下的。
- 目前输出时应使用””将内容输出。
- main 方法的基本格式别写错。
- 对齐、缩进和命名规范。
一个小练习
使用刚才学习的内容输出显示如下效果:
Java 中的变量
变量从字面上的意思来解释就是值可以发生改变的量。本质上来说就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
变量的语法
数据类型 变量名 [= 值];
数据类型
Java 中的数据类型主要分为两种:
- 基本数据类型
- 引用数据类型
基本数据类型
基本数据类型包括 boolean(布尔型)、float(单精度浮点型)、char(字符型)、byte(字节型)、short(短整型)、int(整型)、long(长整型)和 double (双精度浮点型)共 8 种,详见下图所示。
提示:char 代表字符型,实际上字符型也是一种整数类型,相当于无符号整数类型。
所有的基本数据类型的大小(所占用的字节数)都已明确规定,在各种不同的平台上保持不变,这一特性有助于提高 Java 程序的可移植性。
基本数据类型又可分为 4 大类,即整数类型(包括 byte、short,int 和 long)、浮点类型(包括 float 和 double)、布尔类型和字符类型(char),下面分别介绍这 4 大类数据类型。
整数类型
名称 | 说明 |
---|---|
字节型(byte) | byte 类型是最小的整数类型。当用户从网络或文件中处理数据流时,或者处理可能与 Java 的其他内置类型不直接兼容的未加工的二进制数据时,该类型非常有用。 |
短整型(short) | short 类型限制数据的存储为先高字节,后低字节,这样在某些机器中会出错,因此该类型很少被使用。 |
整型(int) | int 类型是最常使用的一种整数类型。 |
长整型(long) | 对于大型程序常会遇到很大的整数,当超出 int 类型所表示的范围时就要使用 long 类型。 |
浮点类型
浮点类型是带有小数部分的数据类型,也叫实型。浮点型数据包括单精度浮点型(float)和双精度浮点型(double),代表有小数精度要求的数字。
单精度浮点型(float)和双精度浮点型(double)之间的区别主要是所占用的内存大小不同,float 类型占用 4 字节的内存空间,double 类型占用 8 字节的内存空间。双精度类型 double 比单精度类型 float 具有更高的精度和更大的表示范围。
Java 默认的浮点型为 double,例如,11.11 和 1.2345 都是 double 型数值。如果要说明一个 float 类型数值,就需要在其后追加字母 f 或 F,如 11.11f 和 1.2345F 都是 float 类型的常数。
布尔类型
布尔类型(boolean)用于对两个数值通过逻辑运算,判断结果是“真”还是“假”。Java 中用保留字 true 和 false 来代表逻辑运算中的“真”和“假”。因此,一个 boolean 类型的变量或表达式只能是取 true 和 false 这两个值中的一个。
在 Java 语言中,布尔类型的值不能转换成任何数据类型,true 常量不等于 1,而 false 常量也不等于 0。这两个值只能赋给声明为 boolean 类型的变量,或者用于布尔运算表达式中。
字符类型
Java 语言中的字符类型(char)使用两个字节的 Unicode 编码表示,它支持世界上所有语言,可以使用单引号字符或者整数对 char 型赋值。其中整数数值代表ASCII码。
ASCII 码
ASCII 码((American Standard Code for Information Interchange):美国信息交换标准代码): ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础 ASCII 码,使用 7 位二进制数(剩下的 1 位二进制为 0)来表示所有的大写和小写字母,数字 0 到 9、 标点符号,以及在美式英语中使用的特殊控制字符。其中:
0~31 及 127(共 33 个)是控制字符或通信专用字符(其余 为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换 页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII 值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126(共 95 个)是字符(32 是空格),其中 48~57 为 0 到 9 十个阿拉伯数字。65~90 为 26 个大写英文字母,97~122 号为 26 个小写英文字母,其余为一些标点符号、运算符号等。
后 128 个称为扩展 ASCII 码。许多基于 x86 的系统都支持 使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。
引用数据类型
引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。
引用类型还有一种特殊的 null 类型。所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一个指针,只是 Java 语言里不再使用指针这个说法。
变量的定义
Java 语言是强类型(Strongly Typed)语言,强类型包含以下两方面的含义:
- 所有的变量必须先声明、后使用。
- 指定类型的变量只能接受类型与之匹配的值。
这意味着每个变量和每个表达式都有一个在编译时就确定的类型。类型限制了一个变量能被赋的值,限制了一个表达式可以产生的值,限制了在这些值上可以进行的操作,并确定了这些操作的含义。
声明变量
对开发人员来说,变量是用来描述一条信息的别名,可以在程序代码中使用一个或多个变量。变量中可以存储各种类型的信息,如年龄信息、用户名称、文件的大小、某个英文单词以及飞机票价格等。
在 java 中用户可以通过指定数据类型和标识符来声明变量,其基本语法如下所示:
int age ;
String name ;
char sex;
变量赋值
初始化变量是指为变量指定一个明确的初始值。初始化变量有两种方式:一种是声明时直接赋值,一种是先声明、后赋值。如下代码分别使用两种方式对变量进行了初始化:
int age;
age = 19;
String name = "关为";
另外,多个同类型的变量可以同时定义或者初始化,但是多个变量中间要使用逗号分隔,声明结束时用分号分隔。
int id,age;
String name="关为",address="陕西西安",desc="一个大帅锅";
注意:目前定义变量必须显式地初始化,否则在使用该变量时就会出错。
变量之间的类型转换
数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。数据类型的转换可以分为自动类型转换和强制类型转换两种。我们今天主要探讨原始类型之间的转换问题!
自动类型转换
整型、浮点型、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。 转换原则:从低级到高级。
在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:
- 数值型数据的转换:byte→short→int→long→float→double。
- 字符型转换为整型:char→int。
以上数据类型的转换遵循从左到右的转换顺序,最终转换成表达式中表示范围最大的变量的数据类型。
强制类型转换
尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。例如,如果你需要将 double 型的值赋给一个 int 型的变量,你将怎么办?
显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小。此时就需要通过强制类型转换来实现了。这种转换有使成为“缩小转换”,因为你肯定要将源数据类型的值变小才能适合目标数据类型。
所以当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。语法如下:
目标数据类型 变量1 = (目标数据类型)变量2或者值;
Java 中的运算符
运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的。
Java 语言中的运算符除了具有优先级之外,还有一个结合性的特点。当一个表达式中出现多种运算符时,执行的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的约束,以便确定是自左向右进行运算还是自右向左进行运算。这些运算符按照操作数的数量可以分为单目运算符、双目运算符和三目运算符。
最基本的运算符包括算术运算符、赋值运算符、逻辑运算符和关系运算符等。
算术运算符
假设:变量 A 的值为 10,变量 B 的值为 20
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法- 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B 等于 200 |
/ | 除法 - 左操作数除以右操作数 | B / A 等于 2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A 等于 0 |
++ | 自增: 操作数的值增加 1 | B++ 或 ++B 等于 21 |
-- | 自减: 操作数的值减少 1 | B-- 或 --B 等于 19 |
问题:a++和++a的区别是什么?
a++ 是先用后加,而++a是先加后用。例如:
int a = 1; int b = 1; System.out.println(a++); System.out.println(++b);
第一行输出结果是1,因为是先用后加,先输出后自增。
第二行输出结果是2,因为是先加后用,先自增后输出。
赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B |
+= | 加和赋值操作符 | C += A 等价于 C = C + A |
-= | 减和赋值操作符 | C -= A 等价于 C = C - A |
*= | 乘和赋值操作符 | C *= A 等价于 C = C * A |
/= | 除和赋值操作符 | C /= A 等价于 C = C / A |
%= | 余和赋值操作符 | C %= A 等价于 C = C % A |
关系运算符
假设:变量 A 的值为 10,变量 B 的值为 20。
操作符 | 描述 | 例子 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
!= | 检查两个操作数的值是否不等,如果不相等则条件为真。 | (A != B)为真。 |
> | 检查左边的值是否大于右边的值,如果是则条件为真。 | (A> B)为假。 |
< | 检查左边的值是否小于右边的值,如果是则条件为真。 | (A<B)为真。 |
>= | 检查左边的值是否大于或等于右边的值,如果是则条件为真。 | (A> = B)为假。 |
<= | 检查左边的值是否小于或等于右边的值,如果是则条件为真。 | (A <= B)为真。 |
逻辑运算符
假设布尔变量 A 为真,变量 B 为假。
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
|| | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为 真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为 true,则逻辑非运算符将得到 false。 | !(A && B)为真。 |
问题:优先判断问题?
当逻辑与和逻辑或的第一个条件影响到整个表达式时,后边内容不予计算。例如:
int a = 1; int b = 5; boolean c1 = a>b&&a++<5; System.out.println(a); boolean c2 = a<b||a++<5; System.out.println(a);
第一次输出1,因为a>b不成立,其后条件不予判断。
第二次输出1,因为a<b成立,其后条件不予判断。
位运算符
扩展知识点,假设:变量 A 的值为 60,变量 B 的值为 13。
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是 1,则结果为 1,否则为 0 | (A&B),得到 12,即 0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到 61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为 0,否则为 1 | (A ^ B)得到 49,即 0011 0001 |
~ | 按位取反运算符翻转操作数的每一位,即 0 变成 1,1 变成 0。这里获取到的是补码,需要转换成原码获取 到最终结果。 | (〜A)得到-61,即 1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的 位数。后边补 0。 | A << 2 得到 240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的 位数。正数前边补 0,负数前边补 1。 | A >> 2 得到 15 即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定 的位数右移,移动得到的空位以零填充。 | A>>>2 得到 15 即 0000 1111 |
三元运算符(条件运算符)
该运算符有 3 个操作数,并且 需要判断布尔表达式的值。该运算符的主要是决定哪个 值应该赋值给变量。
运算符的优先级(仅作了解)
好了,本章的内容就到这里。