Java基础语法(二)——数据类型



接上篇Java基础语法(一)——初识Java



Java基础语法(二)——数据类型



本次介绍内容大纲
在这里插入图片描述

主要介绍上图的八种基本数据类型,引用数据类型先做了解即可。


一、int 整型类型


1.基本语法格式


int 变量名 = 初始值;

代码示例:

int num = 10; // 定义一个整型变量
System.out.println(num) ;

2.数值范围


  int 能够表示的范围是多大?

  在C语言中,有 有符号数 和 无符号数 ,但是记住了,在Java 中没有所谓的无符号数!

  我们看一下 int 表示的范围

  在 Java 中 int 占 4个字节 ,32个 bit 位,最高位是符号位,剩下的31位全是 数值位 。

在这里插入图片描述

使用以下代码查看 Java 中的整型数据范围:

public class Test {

    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);

    }
}

编译结果:
在这里插入图片描述

在这里插入图片描述
  所以验证了 int 的 最大值为 2 ^ 31-1 , 最小值 为 - 2 ^31.(约-21亿——21亿)

  那么不禁有同学问了,如果我们想要打印一个Max+1,Min-1的值,打印出来的结果是什么呢?

 public static void main(String[] args) {

        System.out.println(Integer.MAX_VALUE + 1);

        System.out.println(Integer.MIN_VALUE - 1);

    }

编译结果:
在这里插入图片描述

Max +1的值= - 2 ^ 31

Min -1的值 =2^31 +1

为什么出现这样的结果呢?

首先 int 的数值范围表示是这样的:
在这里插入图片描述

所以当 int = Max_value + 1 时,正数变成负数

这个结论适合于所有的类型(小数 float double 除外)


3.未定义时变量的默认初始值


当变量未定义大小时,没有默认值

  当我们未定义变量是多少,打印这个变量的数值时候,Java 的编辑器会直接报错,这就体现了Java的安全性。

在这里插入图片描述
在这里插入图片描述
  如果运算的结果超出了 int 的最大范围, 就会出现溢出的情况。21亿这样的数字对于当前的大数据时代来说, 是很容易超出的.

   针对这种情况, 我们就需要使用更大范围的数据类型来表示了。 Java 中提供了 long 类型来存储更大的数字。


4.注意事项


(1)int 表示变量的类型是一个整型

(2) 变量名是变量的标识. 后续都是通过这个名字来使用变量

(3) Java 中 = 表示赋值(和数学不一样), 意思是给变量设置一个初始值.

(4) 初始化操作是可选的, 但是建议创建变量的时候都显示初始化.

(5) 最后不要忘记分号, 否则会编译失败.

(6) // 表示注释. 注释作为代码的解释说明部分, 不参与编译运行.

二、 long 长整型类型


1.基本语法格式


long 变量名 = 初始值;

代码示例:

long num = 10L; // 定义一个长整型变量, 初始值写作 10l 也可以(小写的 L, 不是数字1). 
System.out.println(num) ;

2.数值范围


long 在C语言中占4 个字节 ,但是在 Java 中占据 8 个字节。

所以 long 范围大小是

–2 ^ 63 ——2 ^ 63 - 1

我们根据 Java 的代码看一下具体的数值

 public static void main(String[] args) {
        System.out.println(Long.MAX_VALUE);
        System.out.println(Long.MIN_VALUE);
    }

打印结果:
在这里插入图片描述

  8个字节,总之是一个足够大的数字。这个数据范围远超过 int 的表示范围. 足够绝大部分的工程场景使用.


3.long 定义变量


public static void main(String[] args) {
       // System.out.println(Long.MAX_VALUE);
       // System.out.println(Long.MIN_VALUE);

        long a=10L;
        System.out.println(a);
    }

  我们在定义长整型变量 a 的时候,如果 = 右边为 10的情况下, 默认为一个 int 类型的数据 ,为了更精确的表示 a 的值 ,我们在数值的后面加上 L (大小写无所谓,但是大写L更容易区分,小写的l 容易被认为是 1), 更精确的表示了 我们 给的 10 是一个长整型数据。


4.注意事项


(1) 基本语法格式和创建 int 变量基本一致, 只是把类型修改成 long

(2)初始化设定的值为 10L , 表示一个长整型的数字. 10l 也可以.

(3)使用 10 初始化也可以, 10 的类型是 int, 10L 的类型是 long, 使用 10 L 或者 10 l 更好一些.

(4)Java 中 long 类型占 8 个字节. 表示的数据范围 -2^ 63 -> 2 ^ 63-1


三、double 双精度浮点数类型


Java 中的 double 是 8 个字节


1.基本语法格式


double 变量名 = 初始值;

代码示例:

double num = 1.0;
System.out.println(num)

2. double 定义变量


代码一:

public static void main(String[] args) {
        double num=12.5;
        System.out.println(num);
    }

代码编译效果:
在这里插入图片描述

成功打印出 double num 的变量值


代码二:

    public static void main(String[] args) {

        int a=1;
        int b=2;
        System.out.println(a/b);

    }

代码编译效果:
在这里插入图片描述
  打印的结果为0, 两个 int 相除 ,得到的结果 也是 int 类型,所以 a/b 的结果等于0

  在 Java 中, int 除以 int 的值仍然是 int(会直接舍弃小数部分).

  如果想得到 0.5, 需要使用 double 类型计算.

public static void main5(String[] args) {

        double a = 1.0;
        double b = 2.0;
        System.out.println(a / b);

    }

在这里插入图片描述

代码三:

 public static void main(String[] args) {
        double c=1.1;
        double d=1.1;
        System.out.println(c*d);
    }

代码编译效果:

在这里插入图片描述
  我们知道 1.1 * 1.1 = 1.21,那么为什么结果出现了 1.210000…2呢?最后一位的2 从何而来?

  好的,这是由于 double 自身精度的问题,小数是没有精确的数字的。

  Java 的 double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差.


四、float 单精度浮点数类型


1.基本语法格式


float 变量名 = 初始值;

代码示例

  public static void main(String[] args) {
        float f=3.5f;
        System.out.println(f);
    }

编译结果
在这里插入图片描述

2.float 定义变量


  如果我们给 float 定义一个变量 f=3.5,我们来看结果

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

  在C 语言中我们3.5 是可以赋给 float 类型的变量的,为什么在Java中会进行报错呢?

  这里我们就要普及一个知识点:

在这里插入图片描述
  在 Java 当中 3.5、12.5、3.14 这些小数默认是 double 类型的,我们用 float 类型的变量接收,编译就会不通过 。我们在小数的后面加上一个f,强调这个数字是 float 类型的,这样编译就会通过了。


 public static void main(String[] args) {
        float f=3.5f;
        System.out.println(f);
    }

在这里插入图片描述


五、char 字符类型

  在Java 中 ,char 类型的变量在内存中占 2 个字节


1.基本语法格式


char 变量名 = 初始值;

代码表示

public static void main(String[] args) {
        char ch='a';
        System.out.println(ch);
    }

编译结果
在这里插入图片描述

2.char 定义变量


代码一

public static void main(String[] args) {
        char ch='a';
        System.out.println(ch);
    }

编译结果
在这里插入图片描述

代码二

 public static void main(String[] args) {
        char ch='陈';
        System.out.println(ch);
    }

编译结果
在这里插入图片描述
  我们可以用 char 类型 来定义一个 汉字

代码三:

 public static void main(String[] args) {
        char ch=97;
        System.out.println(ch);
    }

编译结果
在这里插入图片描述
  我们可以给char 类型定义一个数字,编译的结果是在 Unicode 中相对应的 字符。

代码四:

 public static void main(String[] args) {
        char ch=-10;
        System.out.println(ch);
    }

编译结果:
在这里插入图片描述
在这里插入图片描述
  我们知道 C语言中 可以用数字来表示相应的英文字符、常用字符,这张表就是ASCII表

  与之相对应的是 Java 中也有这样的表格,叫做 Unicode ,他表示的字符范围更大,可以说包含了ASCII的范围。

  但是,他们的共同点就是 字符与数字对应的起始都是从0开始的,没有负数表示的字符。

  所以 Java 当中的 char 表示的一定是正数


3.注意事项


(1) Java 中使用 单引号 + 单个字母 的形式表示字符字面值.

(2) 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一个字符占用两个字节, 表示的字符种类更多, 包括中文.


六、byte 字节类型

  Java 中 byte 占 1个字节


1.基本语法格式


byte 变量名 = 初始值;

代码示例:

byte value = 0; 
System.out.println(value);

2.数值范围


byte 占 1 个字节 ,8 个 bit 位,所以它的范围是

-2 ^ 7——2 ^ 7 -1

-128——127


3.byte 定义变量

代码一:

public static void main(String[] args) {
        byte a=10;
        System.out.println(a);
    }

编译结果:
在这里插入图片描述
我们给 a 赋值为 10,编译打印10.

代码二:

public static void main(String[] args) {
        byte a=128;
        System.out.println(a);
    }

编译结果:
在这里插入图片描述
  我们将 128 赋给 byte 类型的变量,但是发现编译时报错,说明什么?

  赋值的时候,不能给当前赋值范围外的数字,否则会报错。包括 int 类型也是这样。

代码三:

public static void main(String[] args) {
      byte b1=10;
      byte b2=20;
      byte b3=b1+b2;
        System.out.println(b3);
    }

编译结果:
在这里插入图片描述
  有同学不仅问了: b1+b2=30,没有超过byte 的范围啊,为什么还会报错呢?

说明:

在这里插入图片描述

4.注意事项


(1)字节类型表示的也是整数. 只占一个字节, 表示范围较小 ( -128 -> +127 )

(2)字节类型和字符类型互不相干.


七、数值提升


  在上面介绍byte 类型的时候,我们提到了整型提升,那么我们来了解一下具体的提升规则吧!

  详细的整型提升规则请到我的往期博客——隐式类型转换之整型提升了解


1.int 和 long 混合运算

在这里插入图片描述

结论:

  当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换.

类型提升的意义: 加快了计算机 CPU 计算运行的速度


2.byte 和 byte 的运算

在这里插入图片描述
结论

  byte 和 byte 都是相同类型, 但是出现编译报错. 原因是,虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这时赋给 c, 就会出现上述错误.

  由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int, 再参与计算.

  正确的写法:
在这里插入图片描述

3.小结


类型提升小结:


(1)不同类型的数据混合运算, 范围小的会提升成范围大的.

(2) 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.


八、short 短整型类型


1.基本语法格式


short 变量名 = 初始值;

代码示例:

public static void main(String[] args) {
        short value = 12;
        System.out.println(value);
    }

2.数值范围


在Java 中 short 占2 个字节, 16个bit位

所以他表示的数值范围就是

-32768 -> +32767


3.注意事项


(1)short 占用 2 个字节, 表示的数据范围是 -32768 -> +32767

(2)这个表示范围比较小, 一般不推荐使用.


九、boolean 布尔类型


boolean 在Java和 C++ 中有这种类型,在C语言中没有该类型

1.基本语法格式


boolean 变量名 = 初始值;

代码示例:

 public static void main(String[] args) {
        boolean value = true;
        System.out.println(value);
    }

2.注意事项


(1) boolean 类型的变量只有两种取值, true 表示真, false 表示假.

(2)Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.

(3)boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 这个没有明确规定.

代码一
在这里插入图片描述
编译结果如下:
在这里插入图片描述
所以 int 和 boolean 是两种毫不相干的类型,不能进行运算

代码二
在这里插入图片描述
在这里插入图片描述

将0,1 赋给 boolean 类型,则编辑器会报错
在这里插入图片描述

基本数据类型总结

数据类型包装类字节
intInteger4
shortShort2
charCharacter2
byteByte1
longLong8
floatFloat4
doubleDouble8
booleanBoolean没有明确规定

十、String 字符串类型


把一些字符放到一起就构成了字符串


1.基本语法格式


String 变量名 = “初始值”;

代码示例:

 public static void main(String[] args) {
        String name = "zhangsan";
        System.out.println(name);
    }

编译结果:
在这里插入图片描述

2.注意事项


(1)Java 使用 双引号 + 若干字符 的方式表示字符串字面值.

(2) 和上面的类型不同, String 不是基本类型, 而是引用类型(后面重点解释).

(3)字符串中的一些特定的不太方便直接表示的字符需要进行转义.

3.转义字符


转义字符解释
\n换行
\t水平制表符
单引号
"双引号
\反斜杠

还有很多,目前先介绍这些转义字符…


4.字符串常见操作


(1) + 操作, 表示字符串拼接


代码一

   public static void main(String[] args) {
        String a = "hello";
        String b = "world";
        String c = a + b;
        System.out.println(c);
    }

编译结果如下:
在这里插入图片描述

(2)+可用字符串和整数进行拼接


代码二

    public static void main(String[] args) {
        String str = "result = ";
        int a = 10;
        int b = 20;
        String result = str + a + b;
        System.out.println(result);
    }

编译结果如下:
在这里插入图片描述

(3)小结


  以上代码说明, 当一个 + 表达式中存在字符串的时候, 都是执行字符串拼接行为.

  因此我们可以很方便的使用 System.out.println 同时打印多个字符串或数字.


十一、变量


1.变量的作用域

  作用域就是该变量能生效的范围, 一般是变量定义所在的代码块 (大括号)

代码一:

 public static void main(String[] args) {

        int x = 10;
        System.out.println(x); // 编译通过;
    }

编译结果:
在这里插入图片描述
成功打印出10

代码二:

    public static void main(String[] args) {

        {
            int x = 10;
            System.out.println(x); // 编译通过;
        }
        System.out.println(x);
    }

编译结果:
在这里插入图片描述
  此时x被定义在局部的代码块里,出了该局部范围后,x被销毁,所以第二次打印x编译未通过。

改正后的代码:

    public static void main(String[] args) {

        {
            int x = 10;
            System.out.println(x); // 编译通过;
        }
        int x=5;
        System.out.println(x);
    }

编译结果:
在这里插入图片描述
编译通过,打印出两个x 的值:10 、5


2.变量的命名规则


(1)命名规则

在这里插入图片描述

(2)软性要求

在这里插入图片描述

(3)小驼峰命名规则


   当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大写.

命名示例:

int maxValue = 100;

String studentName = “张三”;


十二、常量


  上面讨论的都是各种类型的变量, 每种类型的变量也对应着一种相同类型的常量.

  常量指的是运行时类型不能发生改变.

  常量主要有以下两种体现形式:


1.字面值常量


10int 字面值常量(十进制)
010int 字面值常量(八进制) 由数字 0 开头. 010 也就是十进制的 8
0x10int 字面值常量(十六进制) 由数字 0x 开头. 0x10 也就是十进制的 16
10Llong 字面值常量. 也可以写作 10l (小写的L)
1.0double 字面值常量. 也可以写作 1.0d 或者 1.0D
1.5e2double 字面值常量. 科学计数法表示. 相当于 1.5 * 10^2
1.0ffloat 字面值常量, 也可以写作 1.0F
trueboolen 字面值常量, 同样的还有 false
‘a’char 字面值常量, 单引号中只能有一个字符
“abc”String 字面值常量, 双引号中可以有多个字符

2. final 关键字修饰的常量

在这里插入图片描述
编译结果如下:

在这里插入图片描述
  Java 中的 final 类似与 C 语言中的 const ,使得修饰的变量变成了常变量,常量不能在程序运行过程中发生修改.


十三、类型转换


  Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有较严格的校验

  我们通过下面几个代码来了解数据的类型转换:


1.int 和 long/double 相互赋值


代码一
在这里插入图片描述
  long 表示的范围更大, 可以将 int 赋值给 long, 但是不能将 long 赋值给 int.

代码二
在这里插入图片描述
  double 表示的范围更大, 可以将 int 赋值给 double, 但是不能将 double 赋值给 int.

结论:

   不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行.


2.int 和 boolean 相互赋值

代码
在这里插入图片描述
结论: int 和 boolean 是毫不相干的两种类型, 不能相互赋值.


3.int字面值常量 给 byte 赋值

代码如下
在这里插入图片描述
注意: byte 表示的数据范围是 -128 -> +127, 256 已经超过范围, 而 100 还在范围之内.

结论: 使用字面值常量赋值的时候, Java 会自动进行一些检查校验, 判定赋值是否合理.


4.强制类型转换


  如何使用强制类型转换?

代码一示例:

在这里插入图片描述
编译结果:
在这里插入图片描述
  结果成功编译,使用强制类型转换,将int 类型的数据转换为 byte,使得a的值可以赋给 b.

代码二:
在这里插入图片描述
编译结果:
在这里插入图片描述
  所以我们得知,并不是所有类型的数据都可以强制类型转换。

结论:
在这里插入图片描述

5.小结


(1)不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型.

(2)如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失.

(3)将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查.

  最后,我们将强制类型转换和隐式类型转换联系在一起,看一下两者的区别:

在这里插入图片描述





  好了,这次的Java数据类型的知识就分享到这里,感谢大家的欣赏与关注!!




  谢谢欣赏!!!!


Java基础语法(三)——运算符已更新,欢迎大家来关注哦!!


完!!

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RAIN 7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值