Java数据类型详解

如有问题,欢迎指正!!!

Java是一种强类型语言,这就意味着必须为每一个变量声明一种类型。

Java中的数据类型主要分为两大类,即八大基本数据类型和引用数据类型两大类。

这次主要说一下基本数据类型,关于引用数据类型,以后会详细补充。

下面可以用一张图来表示数据类型的划分情况:

1. 所有数据类型均有默认值

整型默认值:0          浮点型默认值:0.0          字符型默认值:\u0000(空格)

布尔型默认值:flase          引用数据类型默认值:null

下面先看一段代码:

public class MoRenZhi {
  public static void main(String[] args) {
          int num; // 定义一个整型变量但并未赋值
          System.out.println(num);
   }
}

PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 MoRenZhi.java

MoRenZhi.java:5: 错误: 可能尚未初始化变量num

System.out.println(num);

^

1 个错误

这时弹出了一个错误,num尚未初始化,可是我们刚刚说过了所有的数据类型都有默认值的。那么这是为什么呢?

这是因为默认值必须结合类(class)来观察,函数中的临时变量(本题中则是num)不存在默认值,必须先赋值后使用。

解决方法:一种是在使用前进行赋值,另一种是在定义变量时赋值。

例如:下面是在使用前赋值的代码,在定义变量时赋值就不再赘述了,直接在定义临时变量时进行赋值就好了。

class Test {
    public int a;
}
public class Test {
    public static void main(String[] args) {
        Test test = new Test();
    System.out.println(test.a);
    }
}

2.整型:

在java中,任何一个整型常量都是一个int类型。

下面同样写一段代码:

public class Test {
    public static void main(String[] args) {
        int maxValue = Integer.MAX_VALUE;
        int minValue = Integer.MIN_VALUE;
        long num1 = maxValue + 1;
        long num2 = minValue - 1;
        System.out.println(num1);
        System.out.println(num2);
    }
}

PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 Test.java

PS C:\Users\Lenovo\Desktop\1-5> java Test

-2147483648

2147483647

这里显然int型数据出现了溢出问题,所以整型最大值加一便变成了整型最小值,整型最小值减一便变成了整型最大值。

这是因为存在符号位的问题。当数据类型达到最大值时,换一个保存范围更大的类型来解决数据溢出问题。

那么既然int型产生了数据溢出问题,那么唯一的办法就是更换数据类型,换成保存范围更大的long型。

public class Test {
    public static void main(String[] args) {
        int maxValue = Integer.MAX_VALUE;
        int minValue = Integer.MIN_VALUE;
        long num1 = maxValue + 1;
        long num2 = minValue - 1;
        System.out.println(num1);
        System.out.println(num2);
    }
}

PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 Test.java

PS C:\Users\Lenovo\Desktop\1-5> java Test

-2147483648

2147483647

运行结果依旧是错误的,这是什么原因呢?

原因是所有的程序执行顺序都是从右向左执行的,maxValue + 1已经溢出了,这时都已经变成整型最小值了,然后再把它保存在

long型里面已经为时已晚了。

正确的解决方法是:int + long = long 就会解决int型数据溢出问题。

java中声明一个long常量,需要在数字后加上一个L或l。

public class Test {
    public static void main(String[] args) {
        int maxValue = Integer.MAX_VALUE;
        int minValue = Integer.MIN_VALUE;        
        long num1 = maxValue + 1L;
        long num2 = minValue - 1L;
        System.out.println(num1);
        System.out.println(num2);
    }
}

PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 Test.java

PS C:\Users\Lenovo\Desktop\1-5> java Test

2147483648

-2147483649

需要注意的一点是:

在进行数学计算中(+ - * / %),小的数据类型自动转换成大的数据类型,

而大的数据类型变成小的数据类型必须强制类型转换,但是可能会溢出。

既然说到了整型数据,就不得不提到byte,byte类型保存的范围是:-128~127

byte与int:

当整型常量在byte保存范围内时,可以直接赋值给byte变量;

除此之外(常量大小超出byte范围或者int变量赋值给byte变量)所有赋值必须强转。

① byte data = 10 ;   // 10是int类型,在byte范围内,不用强转

② int num = 10;

    byte data = (byte)num; //  int变量赋值给byte变量,需要强转  结果:10

③ byte a = (byte) 300;   // 常量超出byte范围,必须强转  结果:44  (直接舍弃多余的位数)

3.浮点型:

java 中,所有小数常量都是double类型。

float保存范围小于double,如果要使用float,必须强制类型转换,要声明一个float变量,在变量后加F或f。

进行小数运算时,若出现个别情况的精度丢失,将double变为float解决。最终解决:使用BigDecimal类。

这里需要注意的是:

int numA = 10 ;
int numB = 4 ;
System.out.println(numA/numB) ;

输出结果是:2

这是因为int/int型还是int型,向下取整结果就是2了。

解决方法:

System.out.println(numA/(double) numB) ;

如果要想准确计算,必须将其中一个变量变为double类型。

4.字符型:

字符型使用char来表示,使用' '表示字符常量。char与int可以相互转换(ASAII码)。

public class FirstDemo {
    public static void main(String[] args) {
        char c = 'A';
        // char + int = int
        int num = c + 32;
        // 小类型变大类型自动提升,大类型变小类型必须强转
        char x = (char)num;
        System.out.println(x);
    }
}

需要明白的是:字符型与int型一定不相等!!

下面可以用一段代码来验证:

public class FirstDemo {
    public static void main(String[] args) {
        if('0' == 0) {
            System.out.println("相等!");
        } else {
            System.out.print("不相等!");
        }
    }
}

PS C:\Users\Lenovo\Desktop\1-5> javac -encoding UTF-8 FirstDemo.java

PS C:\Users\Lenovo\Desktop\1-5> java FirstDemo

不相等!

Java采用Unicode编码(支持世界上所有的语言),其他语言(C/C++)采用ASCII编码(不支持中文)。

Java中一个字符两个字节,与是否是英文无关!!!!

5.布尔型:

在其他语言中没有提供布尔类型,因此用0和1表示真假

java不用0和1表示真假,表示真用true,表示假用flase。

猜你喜欢

转载自blog.csdn.net/qq_43508801/article/details/86481673
今日推荐