JAVA----基本类型与运算(理解记忆)

目录

一、Java提供了哪些基本数据类型?

二、在Java语言中null值是什么?在内存中null是什么?

三、如何理解赋值语句String x=null?

四、int和Integer有什么区别?

五、什么是不可变类

六、在Java语言中,类型转换有哪几种类型?

(1)类型自动转换

(2)强制类型转换

七、 强制类型转换的注意事项有哪些?

八、Math类中round、ceil和floor方法的功能各是什么?

九、++i与i++有什么区别?


一、Java提供了哪些基本数据类型?

        Java语言一共提供了8种原始的数据类型(byte,short,int,long,float,double,char,boolean),这些数据类型不是对象,而是Java语言中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立刻在栈上被分配内存空间。

        除了这8种基本的数据类型外,其他类型都是引用类型(例如类、接口、数组等),引用类型类似于C++中的引用或指针的概念,它以特殊的方式指向对象实体,这类变量在声明时不会被分配内存空间,只是存储了一个内存地址而已。

        此外,Java语言还提供了对这些原始数据类型的封装类(字符类型Character,布尔类型Boolean,数值类型Byte、Short、Integer、Long、Float、Double)。

        需要注意的是,Java中的数值类型都是有符号的,不存在无符号的数,它们的取值范围也是固定的,不会随着硬件环境或者操作系统的改变而改变。除了以上提到的8种基本数据类型以外,在Java语言中,还存在另外一种基本类型void,它也有对应的封装类java.lang.void,只是无法直接对它进行操作而已。

封装类型和原始类型有许多不同点:

        首先,原始数据类型在传递参数时都是按值传递,而封装类型是按引用传递的。

        其次,当封装类型和原始类型用作某个类的实例数据时,它们所指定的默认值不同。对象引用实例变量的默认值为null,而原始类型实例变量的默认值与它们的类型有关(例如int默认初始化为0)

二、在Java语言中null值是什么?在内存中null是什么?

        null不是一个合法的Object实例,所以编译器并没有为其分配内存,它仅仅用于表明该引用目前没有指向任何对象。其实,与C语言类似,null是将引用变量的值全部置0。

三、如何理解赋值语句String x=null?

        在Java语言中,变量被分为两大类型:原始值(primitive)与引用值(reference)。声明为原始类型的变量,其存储的是实际的值。声明为引用类型的变量,存储的是实际对象的地址(指针,引用)。对于赋值语句String x=null,它定义了一个变量“x”,x中存放的是String引用,此处为null。

四、int和Integer有什么区别?

        Java语言提供两种不同的类型,即引用类型和原始类型(或内置类型)。int是Java语言的原始数据类型,Integer是Java语言为int提供的封装类。Java为每个原始类型提供了封装类。
引用类型与原始类型的行为完全不同,并且它们具有不同的语义。而且,引用类型与原始类型具有不同的特征和用法。

五、什么是不可变类

        不可变类是指当创建了这个类的实例后,就不允许修改它的值了,也就是说,一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了。它有点类似于常量(const),即只允许别的程序读,不允许别的程序进行修改。

在Java类库中,所有基本类型的包装类都是不可变类,例如Integer、Float等。此外,String也是不可变类。

要创建一个不可变类需要遵循下面5条基本原则:
1)类中所有成员变量被private所修饰。
2)类中没有写或者修改成员变量的方法,例如setxxx,只提供构造函数,一次生成,永不改变。
3)确保类中所有方法不会被子类覆盖,可以通过把类定义为final或者把类中的方法定义为final来达到这个目的。
4)如果一个类成员不是不可变量,那么在成员初始化或者使用get方法获取该成员变量时,需要通过clone方法来确保类的不可变性。
5)如果有必要,可使用覆盖Object类的equals()方法和hashCode()方法。在equals()方法中,根据对象的属性值来比较两个对象是否相等,并且保证用equals()方法判断为相等的两个对象的hashCode()方法的返回值也相等,这可以保证这些对象能被正确地放到HashMap或HashSet集合中。

六、在Java语言中,类型转换有哪几种类型?

(1)类型自动转换

低级数据类型可以自动转换为高级数据类型

当类型自动转换时,需要注意以下几点:
1)char类型的数据转换为高级类型(如int,long等),会转换为其对应的ASCII码。
2)byte、char、short类型的数据在参与运算时会自动转换为int型,但当使用“+=”运算时,就不会产生类型的转换
3)另外,在Java语言中,基本数据类型与boolean类型是不能相互转换的。
总之,当有多种类型的数据混合运算时,系统会先自动地将所有数据转换成容量最大的那一种数据类型,然后再进行计算。

(2)强制类型转换

当需要从高级数据类型转换为低级数据类型时,就需要进行强制类型转换

需要注意的是,在进行强制类型转换时可能会损失精度。

七、 强制类型转换的注意事项有哪些?

        Java语言在涉及byte、short和char类型的运算时,首先会把这些类型的变量值强制转换为int类型,然后对int类型的值进行计算,最后得到的值也是int类型。因此,如果把两个short类型的值相加,最后得到的结果是int类型;如果把两个byte类型的值相加,最后也会得到一个int类型的值。如果需要得到short类型的结果,就必须显式地把运算结果转换为short类型

例如对于语句short s1=1;s1=s1+1

由于在运行时会首先将s1转换成int类型,因此s1+1的结果为int类型,这样编译器会报错,所以,正确的写法应该short s1=1;s1=(short)(s1+1)。

有一种例外情况。“+=”为Java语言规定的运算法,Java编译器会对其进行特殊处理,因此,语句short s1=1;s1+=1能够编译通过

八、Math类中round、ceil和floor方法的功能各是什么?

1)round方法表示四舍五入。round,意为“环绕”,其实现原理是在原来数字的基础上先增加0.5然后再向下取整,等同于(int)Math.floor(x+0.5f)。它的返回值类型为int型,例如,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11
2)ceil方法的功能是向上取整。ceil,意为“天花板”,顾名思义是对操作数取顶,Math.ceil(a),就是取大于a的最小的整数值。需要注意的是,它的返回值类型并不是int型,而是double型。若a是正数,则把小数“入”,若a是负数,则把小数“舍”。

Math.ceil(12.5)的结果为13

Math.ceil(-12.5)的结果为-12
3)floor方法的功能是向下取整。floor,意为“地板”,顾名思义是对操作数取底。Math.floor(a),就是取小于a的最大的整数值。它的返回值类型与ceil方法一样,也是double型。若a是正数,则把小数“舍”;若a是负数,则把小数“入”。

Math.floor(12.5)的结果为12,

Math.floor(-11.5)的结果为-12

九、++i与i++有什么区别?

在编程时,经常会用到变量的自增或自减操作,尤其在循环中用得最多。以自增为例,有两种自增方式:前置与后置,即++i和i++,它们的不同点在于i++是在程序执行完毕后进行自增,而++i是在程序开始执行前进行自增

i=1 ,i++ + i++ =?,i++ + ++i=?,

i++ + i++ +i++=

表达式i+++i++首先执行第一个i++操作,由于自增操作会稍后执行,因此,运算时i的值还是1,但自增操作后,i的值变为了2,接着执行第二个i++,运算时,i的值已经为2了,而执行了一个自增操作后,i的值变为了3,所以i+++i++=1+2=3,而运算完成后,i的值变3。

表达式i++ + ++i首先执行第一个i++,但是自增操作会稍后执行。因此,此时i的值还是3,接着执行++i,此时i的值变为4,同时还要补执行i++的自增操作,因此此时i的值变为5,所以i+++++i=3+5=8。

同理,i+++i+++i++=5+6+7=18。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值