【Java语言】变量详解

博客同步更新:https://nibbles.cn/java-variable.html
还不是个技术大牛,是个爱折腾的持续学习者。把这些笔记梳理成文,不仅是自己费曼,还是种互相学习的态度。


基本数据类型表

基本数据类型表

基本类型变量通用

通用格式:<数据类型关键字> <变量名>=<值>

public class Test {
    public static void main(String[] args) {
        long d = 10L;
        System.out.println(d);

        short a = 10;
        System.out.println(a);

        byte b = 10;
        System.out.println(b);

        float c = 10.24f;
        System.out.println(c);
    }
}

对于长整型的值来说,需要在数字的末尾加上L(也可以小写,但是大写的方便区分)才能被IDE识别为 long 类型。

对于单精度浮点型的值,需要在数字末尾加上f(也可以大写)才能被默认判断为单精度 float 类型。

通常,如果查看数据类型可以接受的范围的最大值和最小值,可以利用包装类型的MAX_VALUE 和 MIN_VALUE。一般的,除了 int 的包装类型名为 Integer ,其他的是关键字首字母大写即包装类型名。

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

整数除法和实数除法

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println(a/b);
    }
}

如上代码输出为0,显然与我们理解的1/2=0.5不同,原因在于除号两边都是整数,相除程序认为就是整数除法,结果自然变成了向下取整的0了。

如果希望输出预期的0.5这样的浮点数,可以把 a b 变量声明的数据类型改为 double。当然也可以把 a/b 改为 1.0*a/b

浮点数表示得不精确?

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

如上代码输出为1.2100000000000002 。 为什么小数点后面会这么长呢?是因为浮点数本来就不是一个精确的数字,计算机也无法表示精确是因为计算机以二进制的方式存储浮点数时,内存布局遵守 IEEE 754 标准(和C语⾔⼀样),尝试使⽤有限的内存空间表⽰可能⽆限的⼩数,势必会存在⼀定的精度误差。

字符型可以存的字符

不同于C语言中字符型变量只能存一个单字母,Java语言中的字符型不仅可以存储字母,还可以存储中文的单字。同样的,都需要单引号 ‘’ 把字符括起来。

在Java语言中字符的底层是Unicode,其中也包含了ASCII的部分,且码值原样不变。也正是底层为Unicode字符集,所以能表示的字符比C语言更多并包含中文。

字符型的包装类型名是 Character ,但是其MAX_VALUE 和 MIN_VALUE 都是不可打印的字符。

字符型在计算机中本质上是个整型,可以用如下代码检验:

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

        char int2ch = 'a';
        System.out.println(int2ch);
    }
}

布尔型的严格定义

public class Test {
    public static void main(String[] args) {
        boolean yes = true;
        boolean no = false;
    }
}

如上 yes 和 no 两个变量可以赋的值只能是布尔值中的真( true )假( false ),Java语言中没有隐式地将数字(隐式就是如C语言的"非零为真,0为假")转换为布尔值。

Java虚拟机规范中,并没有明确规定boolean占⼏个字节,也没有专⻔⽤来处理boolean的字节码
指令,见官方文档的引用:

「Chapter 2. The Structure of the Java Virtual Machine - The boolean Type」
In Oracle’s Java Virtual Machine implementation, boolean arrays in the Java programming language are encoded as Java Virtual Machine byte arrays, using 8 bits per boolean element.

类型转换

自动类型转换(隐式)

代码不需要经过任何处理,在代码编译时,编译器会⾃动进⾏处理。整数默认为int整型,浮点数默认为double双精度。

特点:数据范围⼩的转为数据范围⼤的时会⾃动进⾏。

比如让一个long类型的变量赋值为int类型变量:

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

强制类型转换(显式)

当进⾏操作时,代码需要经过⼀定的格式处理,不会自动处理。

如果数据范围大的类型转化为数据范围小的,利用强转出现两种情况:如果范围大的类型的数字本来就在范围小的类型内的话,其实截断后没有影响;但是范围大的类型的数字还大又超出了范围小的类型可接受的数值范围,则会造成丢失数据(或者说精度丢失),但仍可输出(IDE也会有检查操作),因为你的强转操作本身就代表了你接受丢失数据的后果。

不相⼲的类型不能互相转换。

类型提升

不同类型的数据之间相互运算时,数据类型⼩的会被提升到数据类型⼤的。

public class Test {
    public static void main(String[] args) {
        int a = 10;
        long b = 256l;
        long c = a + b;   // yes
        int d = a + b;  // no
    }
}

但是也有个同类型运算出现的奇怪现象,这个类型就是byte

public class Test {
    public static void main(String[] args) {
        byte a = 10;
        byte b = 1;
        byte c = a + b;   // no
        int d = a + b;   //yes
    }
}

虽然a和b都是byte类型,但是计算时候会把a和b均自动提升为int,导致结果也需要int。这是由于计算机CPU是通常按照4个字节为单位从内存中读写数据,以此为了硬件上实现的方便。short类型也同理。

字符串类型 - 引用数据类型

字符串的关键字为 String ,注意大写。

字符串拼接与字符串和整数互转

两个字符串相加的效果就是字符串拼接。

public class Test {
    public static void main(String[] args) {
        String str = "Hello";
        String str2 = " world!";
        System.out.println(str+str2);
    }
}

有时需要整数和字符串拼接,即使单个整数加入到字符串可以采用 System.out.println("a =" + 10); 但是如果希望加号后面是一个表达式呢? 可以对表达式加个括号,System.out.println("a =" + (a+b));

又或者可以使用String类类型的功能:String str = String.valueOf(<数字或结果为数字的表达式>); 使得整数转为字符串。

反过来,可以使用 int num = Integer.parseInt(<数字字符串>);

public class Test {
    public static void main(String[] args) {
        int a = 10;
        String str = String.valueOf("a = " + a);
        System.out.println(str);
        int b = 100;
        String str2 = String.valueOf("a + b = " + (a + b));
        System.out.println(str2);

        String stra = "10";
        int a2 = Integer.valueOf(stra);
        System.out.println(a2-1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Nibbles 尼布

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

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

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

打赏作者

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

抵扣说明:

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

余额充值