003_JAVA 的数据类型和运算符

Rambo 2020年05月25日 249次浏览

一、JAVA 数据类型特性

  Java 语言是一门强类型的语言,所有的变量必须先声明后使用,从而保证程序更加健壮,可以在编译过程中发现源代码的错误,为此 java 语言提供了丰富的基本数据类型:整形(byteshortintlong)、字符型(char)、浮点型(floatdouble)、布尔型(boolean),基本类型大致上可以分为两类:数值类型和布尔类型。其中数值类型是可以进行类型转换的,这种类型转换包括自动类型转换和强制类型转换。

  Java 语言还提供一系列功能丰富的运算符:算术运算符、位运算符、比较运算符、逻辑运算符。将这些运算符和操作数连接在一起就形成了表达式。

二、JAVA 注释语法

注释:用于注解说明程序的文字,用于调试。注释过的文字不会被编译到字节码中去,也就是说在程序中加注释不会扩大编译文件的大小。

  • 单行注释

    // 被注释的内容
    
  • 多行注释

    /* 
        被注释的内容 
        被注释的内容
        被注释的内容
    */
    
  • 文档注释

    /** 
        被注释的内容 
    */
    通过 javadoc 的命令,生成帮助文档。
    

三、JAVA 文档注释和 API 文档

  Java 语言还提供了一种功能更强大的注释形式:文档注释。如果编写 java 源代码时添加了合适的文档注释,然后通过 JDK 提供的 javadoc 工具可以直接将源代码里面的文档注释提取成一份系统的 API 文档。

  文档注释是用于生成 API 文档的,而 API 文档主要用于说明类、方法、属性的功能。因此 javadoc 工具只处理文档源文件在类、接口、方法、属性、构造器和内部类之前的注释,忽略其它地方的文档注释,而且 javadoc 工具默认只处理 publicprotected 修饰的类、接口、方法、属性、构造器和内部类之前的文档注释,如果要提取 private 修饰的内容,则可以在使用 javadoc 工具时增加 -private 选项。

  文档注释以斜线后紧跟两个星号(/**)开始,以星号后紧跟一个斜线(*/)作为结尾,中间部分就是文档注释的内容,会被提取到 API 文档中。

Javadoc 命令的基本用法

Javadoc常用的选项有如下几个(javadoc -help):

-d<directory>:          该选项指定一个路径,用于将生成的 API 文档放到指定目录下
-windowtitle<text>:     该选项指定一个字符串,用于设置 API 文档的浏览器窗口标题
-doctitle<html-code>:   该选项指定一个 html 格式的文本,用于指定概述页面的标题(一定要对处于多个包下面的源文件来生成 API 文档时才有概述页面)。
-header<html-code>:     该选项指定一个 HTML 格式的文本,包含每个页面的页眉
javadoc 选项 java源文件/包

# 命令行窗口执行如下命令
javadoc –d apidoc –windowtitle 测试 –doctitle 学习javadoc工具的测试API文档 –header 自定义类 java源文件名*.java  

javadoc 命令可以对源文件、包来生成 API 文档,java 源文件可以支持通配符,例如使用 *.java 表示当前路径下所有 java 源文件。

除此之外,如果我们希望 javadoc 工具生成更详细的文档信息,可以使用如下标记:

- @author:      指定java程序的作者
- @version:    指定源文件的版本
- @deprecated: 不推荐使用的方法
- @param:      方法的参数的说明信息
- @return:     方法的返回值的说明信息
- @see:        “参见”,用于指定交叉参考的内容
- @exception:  抛出异常的类型
- @throws:     抛出的异常和Exception同义

上面的提取命令将会提取 java 源程序中的 -author-version 两个标记的信息,除此之外还会提取 @param@return 标记的信息。

Javadoc 工具默认不会提取 @author@version 两个标记的信息,如果需要提取这两个标记的信息,应该在使用 javadoc 工具时指定 -author-version 两个选项。

API文档

  Application Program Interface Document 开发一个大型的软件时,需要定义成千上万的类,而且需要很多人参与开发。每个人都会开发一些类,并在类中定义一些方法、属性提供给其他人使用,但其他人怎么知道如何使用这些类和方法,以及这些类和方法的功能是什么呢?这时候就需要提供一份说明文档,用于说明每个类、每个方法的用途。当其让人使用一个类或方法时,他无需关心这个类或方法的具体实现,只要知道这个类或方法的功能即可。然后使用这个类或方法来实现具体的目的,也就是通过调用应用程序结构(API)来编程。API 文档就是用以说明这些应用程序接口的文档,对于java而言,API文档通常详细说明了每个类、每个方法的功能,用法等。

  Java 语言提供了大量的基础类,并提供了文档可供程序开发人员下载查阅,可以登录 Oracle 公司官网下载 JavaSE 版本号 Documentation 项来下载。

四、JAVA 基本语法构成

Java 语言的基础组成:关键字、标识符、注释、常量和变量、运算符、语句、函数、数组

标识符和关键字

  Java 语言也和其他语言一样,使用标识符来作为变量、对象的名字,也提供了系列的关键字用来实现特定的功能。

分隔符

  Java 里面的分号(;)、花括号({})、方括号([])、圆括号(())、空格、圆点(.)都具有分隔作用,因此被称为分隔符号。

  • 分号

    java 语言里语句的分隔不是使用回车来完成的,而是采用分号(;)作为语句的分隔,因此每个 java 语句必须使用英文分号作为结尾。因此,java 程序允许一行书写多行语句,一条语句也可以跨多行来写,每个语句之间以分号(;)隔开即可,一个语句的结束必须是以分号(;)结束的。

    值得说明的是,java 语句是可以跨多行书写,最后只要以分号(;)结束该语句即可,但是字符串、变量时不可以跨多行的。
    以下的书写形式是错误的:

    // 字符串不能跨多行书写
    String str = “Hello
    World !!!”;
    
    // 变量名不能跨多行或者有空格
    String na
    me=”Peyont”;
    

    java 语言可以跨多行书写语句,但字符串和变量名不能跨多行Java 语法上允许一行书写多条语句,但是从程序的可读性来开,应该避免在一行书写多条语句。

  • 花括号

    花括号的作用就是定义一个代码块,一个代码块指定就是{}所包含的一段代码区域,代码块在逻辑上是一个整体。对 java 语言而言,类定义部分必须放在一个代码块里。方法体部分也必须放在一个代码块里。除此之外,条件语句中的条件执行体和循环语句中的循环体通常也放在代码块里。花括号是成对出现的有一个左花括号开始就一个有一个右花括号结束。

  • 方括号

    方括号的主要作用是用于访问数组的元素,方括号通常紧跟数组变量名,而方括号里指定希望访问的数组元素的索引。

  • 圆括号

    圆括号是一个功能非常丰富的分隔符,定义方法时必须使用圆括号来包含所有的形参声明,调用方法时也必须使用圆括号来传入实参值。不仅如此,圆括号还可以将表达式中的某一个部分括成一个整体,保证这个部分优先于计算。圆括号还可以做强制类型转换的运算符。

  • 空格

    Java 语言使用空格分隔一条语句的不同部分,Java 语言是一门格式自由的语言,所以空格几乎可以出现在 java 程序的任何地方,也可以出现任意多个空格,但不要使用空格把一个变量名隔开,这样就会导致错误。
    Java 语言中的空格符包括:空格符(Space)、制表符(Tab)、回车(Enter)
    Java 语言还会使用空格符号来合理缩进代码,从而提高代码的可读性。

  • 圆点

    通常用做类/对象和它的成员(包括属性和方法和内部类)之间的分隔符,表明条用某个类或某个实例的指定成员,相当于中文 的意思。

标识符规则

  所谓的标识符(Identifier)就是 java 语言用于给程序中的变量、类、方法命名的符号,标识符起名一定要有意义。java 语言的标识符必须以字母、下划线、美元符开头,后面可以跟任意数目的字母、数字、下划线和美元符,此处的字母不限于 26 个大小写的英文字母,而且可以包含中文字符、日文字符等,标识符中不可以包含空格、关键字和保留字,标识符的长度没有限制。

  由于 java 采用的是 Unicode 编码方式,因此 java 的标识符可以使用 Unicode 所能表示的多种语言的字符。Java 语言是严格区分大小写的,因此 abcAbc 是两个不同的标识符。

关键字

  Java 所有的关键字都是小写的,这些单词都是 Java 中赋予了特殊含义的。truefalsenull 都不是 java 的关键字,java 一共包含 48 个关键字:

mark

除了以上 48 个关键字以外,java 还包含了 gotoconst 两个保留字,保留字的意思是 java 现在还未使用这两个单词作为关键字,但是可能在未来的 java 版本中使用这两个关键字。

Java 还提供了 3 个特殊的直接量truefalsenulljava 语言的标识符也不能用这两个保留字和三个特殊直接量。

五、JAVA 的数据类型

数据类型分类

  Java 语言是强类型的语言,每个变量和每个表达式都有一个在编译时就确定的类型,所以所有变量必须显式声明类型,也就是说,所有的变量必须先声明,后使用。类型限制了一个变量能有什么值,限制一个表达式可以产生的值,限制了在这些值上可以进行的操作,并确定过这些操作的含义。强类型语言可以在编译时进行更严格的语法检查,从而减少编程错误。

Java 语言支持的类型分为两类:基本类型、引用类型

mark

基本类型

Java 的基本类型可以分为两大类:boolean 类型和数值类型,java 语言里包含了这 8 种基本数据类型

mark

值得指出的是:

字符串不是基本数据类型,字符串类型是一个类,也就是一个引用数据类型。

  • 整型(byteshort、intlong

int 是最常用的整数类型,因此通常情况下一个 java 整数常量默认就是 int 类型

mark

注意:

  • 如果直接将一个较小的整数常量(在 byteshort 的取值范围内)赋给一个 byteshort 变量,系统会自动把这个整数常量当成 byte 或者 short 类型处理

  • 如果使用一个巨大的整数常量(超出了 int 类型的表示范围)时,java 不会自动把这个整数常量当成 long 类型来处理,如果希望系统把这个整数常量当成 long 类型来处理,应在这个整数常量后面增加 lL ,建议使用 L

// 下面代码是正确的,系统会自动把56当成byte类型处理
byte a = 56;
//下面代码是错误的,系统不会将9999999999999999999999当成long类型处理,所以超出 int 的表示范围,从而引起错误
long bigValue = 9999999999999999999999;
// 必须在整数常量后面加一个L或l,强制使用long类型
long bigValue = 9999999999999999999999L;
  • 字符型

字符型通常用于表示单个的字符,字符常量必须使用单引号('')括起来,由于 java 使用 unicode 编码格式,而 unicode 被设计成支持世界上所有书面语言的字符,包括中文字符,因此 java 程序支持各种语言的字符。

  • 转义字符
public class TestDemo {
    public static void main(String args[]) {
        // 直接指定单个字符作为字符常量
        char c = 'a';
        // 使用转义字符来作为字符常量
        char ch = '\n';
        // 使用unicode编码值来指定字符常量
        char chr = '\u9999';
        // 输出一个‘香’字符
        System.out.println(chr);
        // 定义一个’中’字符常量
        char zhong = '中';
        // 直接将一个char变量当成int类型变量使用
        int zhongValue = zhong;
        System.out.println(zhongValue);
        // 直接把一个0-65535范围内的int整数赋给一个char变量
        char cc = 97;
        System.out.println(cc);
    }
}

java 没有提供表示字符串的基本数据类型,而是通过 String 类来表示,字符串由于由多个字符组成,字符串常量使用双引号括起来

String str = “我是一段字符串”。  
  • 浮点型

单精度浮点型(float)占内存 4 个字节、双精度浮点型(double)占内存 8 个字节。

java 语言中默认的浮点型是 double 类型的,如果希望将一个浮点型的数值当做 float 类型来处理的话,则必须在常量值后面显示的增加一个 f 或者F

例如:

5.12 代表的是一个 double 类型的浮点型常量,如果要当做 float 来处理的话则必须在后面增加一个 F 或者 f5.12f

  • 引用类型

空引用 null 只能被转换成引用类型,不能转换成基本类型,因此不要把一个 null 之赋给基本数据类型(intStringchar等)。

  • 布尔型

布尔型对应只有一个 boolean 类型,用于表示逻辑上的 ,在 java 语言中,boolean 类型的数值只能是 true 或者 false,不能用 0 或者 非零 来代表。
其它的基本数据类型也不能转换为 boolean 类型。

基本类型的类型转换

  在 java 程序中,不同基本类型的值经常需要在不同类型之间进行转换,java 语言所提供的 7 个数值型之间可以相互转换,有两种转换方式:自动类型转换和强制类型转换。

  • 自动类型转换

    如果系统支持把某个类型的值直接赋给另一种基本类型的值,则这种方式称为自动类型转换。当把一个表示范围小的数值或变量直接赋给另一个表示范围大的变量时,系统将可以进行自动类型转换。

    表数范围由小到大的排列顺序(箭头左边的值可以自动转换为箭头右边的值):

    byte → (char / short) → int → long → float → double
    
    public static void main(String args[]) {
        // int可以自动转换为float类型
        int a = 65;
        float f = a;
        // 输出65.0
        System.out.println(f);
        // byte类型不能自动类型转换为char类型
        byte b = 9;
        // char c = b;
        // 将byte类型自动转换为double类型
        double d = b;
        System.out.println(d);
    }
    

    当把任何基本类型的值和字符串值进行连接运算,基本类型的值将自动转换为字符串类型。虽然字符串类型不再是基本类型,而是引用类型。因此如果希望把基本类型的值转换为对象的字符串,可以把基本类型的值和一个空字符换进行连接即可。

  • 强制类型转换(基本类型转换为基本类型):

如果希望把上面的箭头右边的类型转换为箭头左边的类型,则必须要使用强制类型转换,强制类型转换的语法格式

(targetType)value

强制类型转换的运算符是圆括号 ()。当进行强制类型转换时,类似于把一个大瓶子的水导入一个小瓶子,如果大瓶子里的水不多还好,但是如果大瓶子里的水很多你将会引起溢出,从而造成数据丢失。

  • 字符串转换为基本类型数据

通常情况下,字符串不能直接转换为基本类型,但是通过基本类型对应的包装类则可以实现把字符串转换为基本类型。如:

String s = “45”;
// 使用Integer的方法讲一个字符串转换为int类型
int i = Integer.parseInt(s);

java 为 8 种基本类型都提供了对应的包装类

boolean 对应 Boolean
byte    对应 Byte
short   对应 Short
int     对应 Integer
long    对应 Long
char    对应 Character
float   对应 Float
double  对应 Double

这 8 种包装类都提供了一个 parseXxx(String str) 的静态方法用于将字符串转换成基本的类型。

public static void main(String args[]) {
    String str = "45";
    // 将字符串str转换为整形
    int i = Integer.parseInt(str);
    System.out.println(i);
    // 将字符串str转换为单精度浮点类型
    float f = Float.parseFloat(str);
    System.out.println(f);
}

表达式类型的自动提升

当一个算术表达式当中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。java 定义如下

  • 所有 byte 型、short 型、char 型将被提升到 int

  • 整个算术表达式的数据类型自动提升到与表达式中最高等级的操作数同样的类型。操作数的等级排列如上面的箭头所示

// 定义一个char类型的变量
short s = 5;
// 表达式中的c将自动提升到int类型,则右边的表达式类型为int
// 将一个int类型的值赋给short类型的变量将发生错误
// s-2自动提升为int类型,所有再赋给short就会出错
s = s – 2; 

直接量

直接量指在程序中通过源代码直接指定的值,例如:int a = 5; 这行代码中,我们为变量 a 所分配的初始值 5 就是一个直接量。
并不是所有的数据类型都可以指定直接量的,能够指定直接量的通常只有三种类型

  • 基本类型

  • 字符串类型

  • null 类型

null 类型是一种特殊类型,它只有一个值:null,而且这个直接量可以赋给任何引用类型的变量,用以表示这个引用类型变量中保持的地址为空,即还未指向任何有效对象(可以被垃圾回收机制将其回收)。

直接量的赋值

  通常总是把一个直接量赋值给对应类型的变量,当然可以在系统可以自动类型转换的情况下可以把一个类型的直接量赋值给另一个类型的直接量,String 类型的直接量不能赋值给其他类型的变量,null 类型的直接量可以直接赋给任何引用类型的变量,包括 String 类型。boolean 类型的直接量只能赋给 boolean 类型的变量。

int a = 5;
boolean b = true;
float f = 52.1f;
double d = 2;
String str = "Hello";

运算符

算术运算符:

+ :加 / 字符串拼接
- :减 / 求负数运算符
* :乘
/ :除 除数不能为零,否则将会引发除以零异常。任何数模以2,结果不是0 就是 1
% :取余 除数不能为零,否则将会引发除以零异常。
++:自增运算符,注意 ++i 和i++的区别
--:自减运算符,注意 –i和i—的区别

自增或自减只能操作变量不能操作常量或者直接量 如:5++ 等是错误的行为。但是如果在进行除法或者取余运算时,参与运算的两个变量有一个或者两个都是浮点数这此刻除数是可以为 0 或者 0.0 的,其得到的结果为正无穷大( Infinity )或负无穷大( -Infinity )。

赋值运算符:

赋值运算符用于为变量指定变量值,符号为=
可以一次为多个变量赋值:int a=b=c=5;(由于可读性差,不推荐此赋值方式)

位运算符:

  • & : 按位与

  • | : 按位或

  • ~ : 按位非

  • ^ : 按位异或

  • <<: 左移运算。左移几位其实就是该数据乘以2的几次幂 3<<2 = 3*2(2)=12 3<<3= 3*2(3)=24

  • >>: 右移运算。右移几位其实就是该数据除以2的几次幂 6>>1=6/2(1)=3 6>>2=6/2(2)=1

  • >>>>:无符号右移运算

扩展后的赋值运算符:

+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=、>>>=

只要能使用这种扩展后的赋值运算符,通常都推荐使用这种赋值运算符。因为这种运算符不仅具有更好的性能,而且程序会更加健壮。

public static void main(String args[]) {
    short a = 5;
    a = a + 5;
    System.out.println(a);

    a += 5;
    System.out.println(a);
}

比较运算符:

比较运算符用于判断来个两个变量或常量的大小,比较运算符的结构式一个布尔值(true 或者 false)。

> 、>= 、< 、<= 、 == 、 !=

逻辑运算符:

  • && : 短路与,一假为假

  • & : 不短路与,一假为假

  • || : 短路或,一真为真

  • | : 不短路或,一真为真

  • ! : 非,只需要一个操作数,如果操作数为true则返回false

  • ^ : 异或,当两个操作数不同时才返回true,如果两个操作数相同则返回false

三目运算符:

// 条件表达式 ? 表达式1 : 表达式2  
表达式 ? 表达式为真返回的值 : 表达式为假返回的值

三目运算符是可以嵌套使用的,使用嵌套的三目运算符可以处理更为复杂的逻辑

public static void main(String[] args) {
    int a = 11;
    int b = 12;
    // 三目运算符的嵌套使用
    System.out.println(a > b ? "a 大于 b" : (a < b ? "a 小于 b" : "a = b "));
}

运算符的结合性和优先级

  所有的数学运算都认为是从左向右运算的,JAVA 语言中大部分运算符也是从左向右运算的,只有单目运算符、赋值运算符和三目运算符例外。
如下图所示,上一行中的运算符总是优先于下一行

mark

进制的由来

任何数据在计算机中都是以二进制的形式存在的。

二进制:0、1; 满2进一
八进制:0-7; 满8进一,用0开头表示
十进制:0-9;满10进一(默认都是以十进制的形式显示)
十六进制:0-9,A-F,满16进一,用0x开头作为标识表示; A代表10  F代表 15
23 这个数字 默认是十进制的 如果使用八进制表示则是 023  二进制表示则是只有 01 这两个 若是用十六进制的话 则是 0x23

结论:

八进制数:其实就是二进制中的3个二进制数为一个八进制位
十六进制数:其实就是二进制中的4个二进制数为一个十六进制位
十进制 二进制互转
十进制转二进制 除二取余
二进制转十进制 乘以二的幂数
负数的二进制是其正数的二进制取反加1;
负数的二进制最高位是一