Java基础知识——4、基本类型与运算

4 基本类型与运算

4.1 基本数据类型

Java语言一共提供了八种基本数据类型:byte、short、int、long、float、double、char、boolean。
这些数据类型不是对象,而是Java语言中的不要同于类的特殊类型,这些基本类型的数据变量在声明之后立刻在栈上被分配内存空间。
除了这八种基本类型以外,其他类型都是属于引用类型,如:类、接口、数组等。

基本类型及其描述:

数据类型字节长度范围默认值包装类
byte1[ -128,127 ]0Byte
short2[ -32768,32767]0Short
char2Unicode [ 0,65535]u000Charater
int4[ -2147483648,2147483647 ]0Integer
long8( -2 ^ 63 , 2 ^ 63 - 1 )0L或01Long
float432位IEEE754单精度范围0.0F或0.0fFloat
double864位IEEE754双精度范围0.0Double
boolean1true 和 falsefalseBoolean

以上八种基本数据类型可分为四大类:

1)整数型:byte、short、int、long
2)浮点型:float、double
3)布尔型:boolean
4)字符型:char

小知识点:在Java语言中 void 也是一种基本类型,它对应的封装类为 java.lang.void,只是不能直接对其进行操作。



基本数据类型和封装类的区别

   1) 定义不同:封装类是对象,
   			   基本数据类型不是;
    2)使用方式不同:封装类需要先new初始化,再通过JVM根据具体情况实例化后赋予定值。某些集合类型必须使用包装类,不能使用基本数据类型,如ArrayList<Integer>
    			   基本数据类型可以直接赋值
   3) 初始值不同:包装类初始值默认为null,
   				 基本数据类型根据类型不同而值不同;
   4) 存储方式和位置不用:封装类分拆引用和实例,引用存储在栈(stack),具体实例存储在堆(heap)。
   						基本数据类型存储在栈中(stack)。

int 的默认值为 0,而 Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为0的区别,int 则无法表达出未赋值的情况。


4.2 什么是不可变类

不可变类是指当创建了这个类的实例后,就不允许改变它的值了,也就是说,在这个对象被创建出来后,在其整个生命周期中,它的成员变量就不能被修改。类似于常量,只允许别的程序读取,不允许别的程序进行修改。
在Java类库中,所有基本类型的包装类都是不可变类,如Integer、Float等。String也是不可变类。


创建不可变类的四个原则

1)类中所有成员被private修饰。
2)类中没有写或者修改成员变量的方法,没有set方法,只有构造函数,一次生成,永不改变。
3)确保类中所有方法不会被子类覆盖,可以把类定义为final,或者类中的方法定义为final来实现。
4)如果一个成员不是不可变量,那么成员在初始化或者使用get方法获取该成员变量时,需要通过clone方法来确保类的不可变性。

注意事项
由于类的不可变性,在创建对象时就需要初始化所有成员变量,因此最好提供一个带参数的构造函数来初始化这些成员变量。

不可变类具有使用简单、线程安全、节省内存等优点,但是不可变类的对象也会因为值的不同而产生新的对象,从而导致不可预料的错误,所以不可滥用此模式。


4.3 值传递与引用传递有什么区别

值传递
在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却是不同的存储单元,因此形参的改变不会影响到实参。

引用传递
在方法调用中传递的是对象,这时形参与实参的对象指向统一存储单元,因此形参的改变会影响到实参的值。


在Java语言中,原始数据类型在传递参数时都是按值传递,而包装类型传递参数时都是引用传递。


4.4 类型转换

在Java语言中,在参与运算的两个变量的数据类型不同时,就需要饮食的数据类型转换。
转换规则:byte < short < char < int < long < float < double


自动类型转换:低数据类型自动转换为高数据类型。

public class Main {
    public static void main(String[] args) {
        int a = 5;
        double b = 5.11;
        float f = 2.11f;
        long l = 120;

        double x1 = a + b;
        System.out.println("自动转换,x1 = " + x1);
    }
}

结果:
自动转换,x1 = 10.11


强制类型转换:高数据类型转换为低数据类型时就需要用到强制类型转换。强制类型转换可能会损失精度。
例:

public class Main {
    public static void main(String[] args) {
        int a = 5;
        double b = 5.11;
        float f = 2.11f;
        long l = 120;

        int x = a + (int) b;
        System.out.println("强转后会损失精度,x = " + x);

        double x1 = a + b;
        System.out.println("自动转换,x1 = " + x1);
    }
}

结果:
强转后会损失精度,x = 10
自动转换,x1 = 10.11


强制类型转换注意事项:
在Java语言中,涉及到byte、short、和char类型的运算时,首先会把这些类型的变量强制转换为int类型,然后对int类型进行计算,最终得到的值也是int类型。
因此如果我们需要得到byte、short、char类型的值,我们就需要进行显式的类型转换
例:

public class Main {
    public static void main(String[] args) {
        short s1 = 1;
        //s1 = s1 + 1;  此语句会报错

        short s2 = 1;
        s2 = (short)(s2 + 1);
    }
}

但是有一种情况是例外。“ += ”为Java语言规定的运算法,Java编译器会对其进行特殊处理,也就是不会产生自动强制类型转换。
例:

public class Main {
    public static void main(String[] args) {
        short s1 = 1;
        //s1 = s1 + 1;  此语句会报错

        short s2 = 1;
        s2 = (short) (s2 + 1);
        System.out.println(s2);

        short s3 = 1;
        s3 += 1;
        System.out.println(s3);
    }
}

这也是一道常见的面试题。



4.5 运算符优先级

Java语言中有很多运算符,由于运算符的优先级问题会导致程序在输出结果时会出现意想不到的结果。

单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。

下面是运算符的优先级表:

优先级运算符结合性
1()、[]、{}从左向右
2!、+、-、~、++、–从右向左
3*、/、%从左向右
4+、-从左向右
5«、»、>>>从左向右
6<、<=、>、>=、instanceof从左向右
7==、!=从左向右
8&从左向右
9^从左向右
10单管道符从左向右
11&&从左向右
12双管道符从左向右
13?:从右向左
14=、+=、-=、*=、/=、&=、=、^=、~=、«=、»=、>>>=

优先级为 1 的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。
例:

public class Main {
    public static void main(String[] args) {

        int x = 1;
        int y = 2;
        int z = 3;

        System.out.println(1 + 2 * 3);
        System.out.println((1 + 2) * 3);
    }
}

结果:
7
9







注:

此文来源于《Java程序员面试笔试宝典》一书

仅作为本人学习过程的记录

填写原创是因为找不到相关链接

如有不妥请联系本人,会立即删除

此书对于我这种小白来说非常有用,讲解详细,知识点全面,目前正在根据此书学习,陆续会记录更多知识点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值