一、强类型语言和弱类型语言:

1.1 强类型语言

强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.net 、Python、C++等语言。

强类型包含两个方面:

(1)所有变量必须先声明、后使用

(2)指定类型的变量只能接受类型与之匹配的值

举个例子:定义了一个整数,如果不进行强制的类型转换,则不可以将该整数转化为字符串。

1.2 弱类型语言

弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括vb 、PHP、javascript等语言。

举个例子:

var A =5;
var B = "5";
SumResult = A +B;
MinResult = A -B;

输入SumResult的答案不是10,而是55,再次是将A的类型转化为了字符串,然后进行拼接。输入MinResult的答案是0,是将B的类型转化为了数字,然后进行减法。

1.3 强类型语言和弱类型语言区别

无论是强类型语言还是弱类型语言,判别的根本是是否会隐性的进行语言类型转变。强类型语言在速度上略逊于弱类型语言,但是强类型定义语言带来的严谨性又能避免不必要的错误。

二、Java数据类型分类

Java数据类型可以分为两类:基本类型(Prmitive Type)和引用类型(Reference Type) 

2.1 基本类型

基本类型包括 boolean 类型和数值类型。数值类型有整数类型和浮点类型。整数类型包括 byte、 short、int 、 long 、 char , 浮点类型包括 float 和 double 。

注:char类型代表字符型,实际上也是一种整数类型,相当于无符号整数类型。

2.2 引用类型

  引用类型包括类、接口和数组类型,还有一种特殊的 null 类型 。 所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种 。实际上 ,引用类型变量就是一个指针,只是Java语言里不再使用指针这个说法。

  空类型 (null type ) 就是 null 值的类型 , 这种类型没有名称。因为 null 类型没有名称 ,所以不可能声明一个 null 类型的变量或者转换到 null 类型。空引用 (null ) 是 null 类型变量唯一的值。空引用 ( null )可以转换为任何引用类型 。

  在实际开发中 , 程序员 可以忽略 null 类型 ,假定 null 只 是引用类割的一个特殊直接量。

注意:空引用( null )只能被转换成引用类型 , 不能转换成基本类型,因此不要把一个 null值赋给基本数据类型的变量 。

三、基本数据类型

Java基本数据类型分为两类:boolean类型和数值类型。而数值类型又可以分为整数类型和浮点数类型,整数类型里的字符类型又可以被单独对待。因此常把Java数据类型分为4类:

3.1 整型

4种整数类型:

(1)byte:一个byte类型整数在内存里占8位,表示整数范围:-128(-27)~127(27-1)

(2)short:一个short类型整数在内存里占16位,表示整数范围:-32768(-215)~32767(215-1)

(3)int:一个int类型整数在内存里占32位,表示整数范围:-2147483648(-232)~2147483647(232-1)

(4)long:一个long类型整数在内存里占64位,表示整数范围:--264~264-1

int 是最常用 的 整数类型,因 此 在通常情 况下, 直接给出一个整数值默认就是 int 类型。除 此 之 外,
有如下两种情形必须指出。

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

  如果使用 一个巨大的整数值(超出了 int 类型的表数范围)时 , Java 不会自动把这个整数值当成long 类型来处理。如果希望系统把 一 个整数值当成 lon g 类型来处理,应在这个整数值后增加 l或者 L 作为后缀 。通常推荐使用 L,因为英文字母 l 很容易跟数字 1搞混 。

下面的代码片段验证了上面的结论 。

 public class Test{
public static void main(String[] args){
//下面代码正确,系统会把56当作byte类型处理
byte a =56;
System.out.println(a);
/*
下面用法错误,系统不会把99999999999999当成long类型来处理
所超出int的表数范围,从而引起错误(换种理解:999999999999是一个int型的变量,超出了int类型的变量的范围,所以不能直接赋给long变量)
报错:过大的整数99999999999999
*/
//long bigValue=99999999999999;
//下面用法正确,在巨大的整数后面L后缀,强制使用long类型
long bigValue=99999999999999L;//99999999999999L是一个long变量,并未超出long的变量的范围,可以赋给long型变量Bigvalue
System.out.println(bigValue);
}
}

运行结果:

可以把一个较小的整数值(在 int 类型的表数范围以 内)直接赋给一个 long 类型的变量,这并不是因为 Java 会把这个较小的整数值当成 long 类型来处理, Java 依然把这个整数值当成 int 类型来处理,只是因为 int 类型的值会自动类型转换到 long 类型 。

Java整数值的4种表现形式:

十进制

二进制(以0b或0B开头)

八进制(以0开头)

十六进制(以0x或0X开头)

 public class system{
public static void main(String[] args){
//以0开头的整数表示八进制
int octalValue=012;
System.out.println(octalValue);
//以0x开头的表示为十六进制
int hexValue=0x12;
System.out.println(hexValue);
//二进制数表现
int binValue=0b10000000;
System.out.println(binValue);
//定义 32 位的二进制整数时,最高位其实是符号位,当符号位是 l 时 ,
//表明它是一个负数,负数在计算机里是以补码的形式存在的 ,因此还需要换算成原码。 long binValue1=0b11111111111111111111111111111111;
System.out.println(binValue1);
}
}

输出结果:

在计算机中所有的数都是以二进制表示的,binValue1=0b11111111111111111111111111111111

转换为原码的过程:

补码:0b11111111111111111111111111111111

补码减1得到反码:0b11111111111111111111111111111110

符号位不变,其余位取反得到原码:0b1000000000000000000000000000000001

最后的结果为负,数值为1

3.2 字符型

  字符型通常用于表示单个的宇符 ,字符型值必须使用单引号 (,)括起来。 Java 语言使用 16 位的Unicode 字符集作为编码方式 ,而 Unicode 被设计成支持世界上所有书面语言的字符 ,包括中文字符 ,因此Java 程序支持各种语言的字符。

字符型有三种表示形式:
(1)直接通过单个字符来指定字符值,例如'A','9','0'等。

(2)通过转义字符表示特殊的字符型,例如'\n'、'\t'等。

(3)直接使用Unicode值来表示字符型,格式是'\uXXXXX',其中XXXX代表一个十六进制的整数。

Java常用转义字符:

转义字符 说明 Unicode表示方式
\b 退格符 \u0008
\n 换行符 \u000a
\r 回车符 \u000d
\t 制表符 \u0009
\'' 双引号 \u0022
\' 单引号 \u0027
\\ 反斜线 \u005c

  宇符型值也可以采用十六进制编码方式来表示,范围是'\u0000'~'\uFFFF' , 一共可以表示 65536 个字符,其中前 256 个 ('\u0000'~'\u00FF' ) 字符和 ASCII 码中的字符完全重舍 。由于计算机底层保存字符时,实际是保存该字符对应的编号 ,因此 char 类型 的值也可直接作为整型值来使用 , 它相当于一个 16 位的无符号整数 , 表数范围是 0~65535 。

注意:char类型的变量值完全可以参与力加、减、乘、除运算,也可以比较大 小—— 实际上都是用该字符对应的编码参与运算。如果把0~65535一个int整数赋给char类型变量,系统会自动把这个int整数当成char类型来处理。

字符变量使用:

 public class CharTest{
public static void main(String[] args){
//直接指定单个字符作为字符型
char aChar='a';
//使用转义字符作为字符集
char enterChar='\r';
//使用Unicode编码值来指定字符值
char ch='\u9999';
System.out.println(ch);
//定义一个汉字的字符值
char zhong='汉';
int zhongValue=zhong;
System.out.println(zhongValue);
char c=97;
System.out.println(c);
}
}

3.3 浮点型

Java浮点型有两种:float和double。Java浮点型有固定的表数范围和字段长度,字段长度表数范围与机器无关。Java浮点数,遵循IEEE754标准,采用二进制数据的科学计数法表示。

对于float型整数:第1位是符号位,接下来8为表示指数,在接下来23位表示尾数

对于double型整数:第1位是符号位,接下来11为表示指数,在接下来52位表示尾数

Java语言的浮点数两种表示形式:

1、十进制数形式:这种形式是最简单的浮点数,例如5.12,512.0,.512.浮点数必须包含一个小数点,否则会被当做int类型处理。

2、科学计数法形式:例如5.12e2或5.12E2

  必须指出的是,只有浮点类型的数值才可以使用科学计数法形式表示。例如, 51200 是一个 int 类型的值 , 但 512E2 则是浮点类型的值 。

   Java语言浮点数的默认类型是double类型,如果希望Java把一个浮点数当成float处理,应该在这个浮点类型值后跟一个f或F。例如5.12代表一个double类型的值,占64位的内存空间;5.12f或5.12F才表示一个float类型的值,占32位的内存空间。也可以在一个浮点数后添加d或D后缀,强制指定为double类型,但通常没有必要。

  Java提供了三种特殊的浮点数类型值:正无穷大、负无穷大和非数,用于表示溢出或出错。例如用一个正数除以0将得到正无穷大,使用一个负数除以0将得到负无穷大,0.0除以0.0或对一个负数开根号将得到一个非数。正无穷大通过double或float类的POSITIVE_INFINITY表示;负无穷大通过NEGATIVE_INFINITY表示;非数通过double或float类的NaN表示。

  必须指出的是,所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的 : 而 NaN不与任何数值相等 , 甚至和 NaN 都不相等 。只有附带念书除以0才可以得到正无穷大或负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。如果一个整型值除以0,则会抛出一个异常:ArithmeticException:/by zero

程序示范:

 public class FloatTest{
public static void main(String[] args){
/*
浮点数表示的5.2345678f,输出这个变量值已经发生改变
使用double型表示比浮点数更加精确,但如果浮点数的精度过高,依然可能发生输出结果不一致
如果需要精确的保存一个浮点数,则可以考虑使用BigDecimal类
*/
float af=5.2345678f;
System.out.println(af); //所有正无穷大或负无穷大都是相等的
double a=0.0;
double b=Double.NEGATIVE_INFINITY;
double c=Float.NEGATIVE_INFINITY;
System.out.println(b==c);
System.out.println(6.0/0==555.0/0); //0除以0.0(默认会将0当作浮点数来处理)将出现非数
System.out.println(0/a); // 下面代码将抛出除以 0 的异常,只有浮点数除以0才能得到正无穷大或负无穷大
System.out .println(0/0);
}
}

*数值中使用下划线分隔

Java 7 后允许在整形数值、浮点数值中使用下划线(_)来分割数据来更清晰地看清数值的位数。

3.4 布尔型

  布尔型只有一个boolean类型,用于表示逻辑上“真”或“假”。在Java语言中,boolean类型的数值只能是true或false,不能用0或者非0来代表。其他数值类型也不能转化成boolean类型。虽然 boolean 类型‘的变量或值只要1位即可保存,但由于大部分计算机在分配内存时允许最小内存单元是字节( 8 位) , 因此 bit 大部分时候实际 上占用 8 位 。

 public class BooleanTest{
public static void main(String[] args){
boolean b1=true;
boolean b2=false;
System.out.println(b1); //字符串"true"和"false"不会直接转化成boolean类型,但如果使用一个boolean类型的值
//和字符串进行链接运算,则boolean类型的值会自动转化成字符型
String str=b1+"";
System.out.println(str);
}
}

  boolean类型的变量或值主要用来做标识来进行控制流程(if语句、循环语句、三目运算符)。

3.5 使用·var定义变量

Java 10开始支持var定义局部变量:var相当于一个动态类型,使用var定义局部变量的类型由编译器自动推断——定义变量时分配了什么类型的初始值,那么该变量就是什么类型。但Java属于强类型语言,因此使用var定义变量依然没有明确的类型。只有为局部变量指定初始值时,该变量的类型才确定下来。

使用var的优点在于:编码更简洁,不管什么类型的局部变量,直接使用var声明即可;缺点在于:变量类型的可读性降低了。

以下情况,应该避免使用var定义局部变量:

(1)变量的类型不容易直接判断

(2)局部变量的使用范围很大

2、数据类型和运算符——Java数据类型的更多相关文章

  1. Java 第二章 变量、数据类型和运算符

    第二章      变量.数据类型和运算符 什么是变量: 变量代表一块内存区域,变量类型不一样,这一块内存的大小也不一样. #在编程语言里面,你可以通过定义变量,向内存里添加数据或者修改内存已有的数据. ...

  2. Java中的变量,数据类型和运算符

    变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...

  3. Java1变量数据类型和运算符

    day02_变量数据类型和运算符   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class jh_01_数据类型说明 {     public  ...

  4. IOS开发新手教程(一)-数据类型和运算符

    OC语法入门(一) 数据类型和运算符 1.1凝视 凝视和其它语言一样,同意单行 ,多行凝视,一份规范的代码里面须要有一些正式的凝视,例如以下凝视: /* 这是多行 凝视 */ //这是多行凝视 OC语 ...

  5. PostgreSQL自学笔记:5 数据类型和运算符

    5 数据类型和运算符 5.1 PostgreSQL 数据类型介绍 5.1.1 整数类型 整型类型 字节 取值范围 smallint 2字节 -2^15 ~ 2^15 int integer 4字节 - ...

  6. 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...

  7. 初识java之变量、数据类型和运算符(一)

    博友目标: 1.掌握变量的概念 2.引子----会使用常用数据类型 众所周知,每台电脑都有一个内存这么个必不可少的元素,那么到底内存到底是用来干什么的呢?其实啊,计算机内存相当于人类的大脑,计算机在处 ...

  8. java基础知识(一)之数据类型和运算符

    1.标识符:JAVA里面我们可以为之命名的就是标识符,如变量.方法.类等. 但是标识符只能包含字母.数字.下划线(_)和美元符号($),并且只能以字母.下划线和美元符号开头不能以数字开头.2.变量:在 ...

  9. Java基础 - 数据类型和运算符

    Java 语言支持的类型分为两类:基本数据类型(Primitive Type)和引用类型(Reference Type). 目录 基本数据类型 数值类型 整数类型 byte short int lon ...

随机推荐

  1. 【leetcode】1184. Distance Between Bus Stops

    题目如下: A bus has n stops numbered from 0 to n - 1 that form a circle. We know the distance between al ...

  2. 6424. 【NOIP2019模拟2019.11.13】我的订书机之恋

    题目描述 Description Input Output Sample Input 见下载 Sample Output 见下载 Data Constraint 题解 lj题卡线段树 求出每个右端点往 ...

  3. Codecombat 游戏攻略(计算机科学三)2

    第33关 逻辑之路 判断secretB 非真,走上面:否则,走下面(这里面要先自己进行逻辑判断)if…else语句或者这样用(不用自己进行判断) // 如果 secretB 非真,走上面:否则,走下面 ...

  4. 集合比较器报错java.lang.IllegalArgumentException: Comparison method violates its general contract!

    Collections.sort(listMonthlyUsage, new Comparator<MonthlyUsageDto>() { //按照元素从小到大排序 @Override ...

  5. springmvc+ajax异步上传图片

    1.javaweb传统的上传图片方式就是通过form表单提交 <form action="#" method="post" enctype="m ...

  6. 能给个安全点的fifo吗

      调试一个基于altera  FPGA的项目,发现开机200次,就会有1到2次的开机不正常现象,但只要是成功开机了,无论运行多久都是正常的.   遇到这类问题,按照经验来说 一般首先想到的可能是电源 ...

  7. Ubuntu16.04 同时连接无线网络和以太网端口

    背景: 激光雷达VLP16通过以太网线连接电脑.在本博客所述的设置之前,一旦连接以太网线,本机(dell笔记本)的无线网络立即断开,即无法同时连接无线网络和以太网端口. 问题查找: 命令行  $ ip ...

  8. 双重Iterator 报错!!!!

    List list = new ArrayList(); list.add(new String[]{"0","s1","0038",&qu ...

  9. vue之Object.defineProperty()

    了解Object.defineProerty()方法 关于Object.defineProperty()方法的解释,理解Object.defineProperty的作用 这篇文章做了很详细的概述 关于 ...

  10. [HDU4336]:Card Collector(概率DP)

    题目传送门 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物.商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值$W_i$(每种礼物的喜悦值不能重复获得).每 ...