javaSE扫盲_02

作者: 啊耶嗨 | 来源:发表于2020-10-09 11:21 被阅读0次

    表达式类型的自动提升


    当一个算数表达式中有多个类型的值时,整个算数表达式的数据类型将发生自动提升。在java中所有的byte、short、char类型将被提升为int类型;如果有int之上的类型,则自动提升为最高类型。转换顺序为int→long→float→double

    说白了就是,表达式的类型将严格保持和表达式中最高等级操作数相同的类型

    ASCII编码


    System.out.println('a'+1);对这行代码进行输出,会发现结果是98。由此得出,a的值或者说'a'(此处a为字符而非变量)的值为98。

    最后一个式子中,先进行的是'a'+7的运算,其中'a'自动提升为int类型,变成a对应的ASCII值:97。至于说第二个式子为啥不是字符“Hey!a”+7——Hey!a的ASCII值+7。首先字符只能单个使用,其次"Hey!"+'a'已经默认的转型为String类型。

    栈?堆?方法区?本地方法区?寄存器(程序计数器)?


    栈?

    存储都是局部变量。只要是在方法中定义的变量都是局部变量。 一旦变量的生命周期结束该变量就被释放。 当实体不在使用时,就会被垃圾回收机制处理。八种基本数据类型(byte、short、int、long、float、double、char、boolean)的局部变量(定义在方法体中的基本数据类型的变量)也是存储在栈中并且在栈中存储的是它们对应的值。栈中还存储局部的对象的引用(定义在方法体中的引用类型的变量),对象的引用并不是对象本身,而是对象在堆中的地址,换句话说,局部的对象的引用所指的是对象在堆中的地址, 而这个则引用存储在了栈中。当然,如果对象的引用没有指向具体的对象,对象的引用则是null。

    堆?

    堆内存都是实体(对象)(new 关键词创建的),每一个实体都有一个首地址值。而且堆内存的变量都有默认的初始化值。不同类型不一样,如: int——0;double——0.0;boolean——false;char——’\u0000’。

    方法区?

    在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

    本地方法区?

    和java栈的作用差不多,只不过是为JVM使用到的native方法服务的。

    寄存器?

    用于保存当前线程执行的内存地址(多线程的概念在后面文章中详细介绍)。

    对上面那堆废话可以这样理解:基本数据类型的局部变量,变量名和变量值都存储在栈内存中。而引用类型的变量,变量名存储在栈内存中,具体的实例存储在堆内存中,此时栈内存中的引用类型变量的变量名就相当于指针,指向堆内存。而堆内存中的引用变量的实例又指向了方法区。

    =、==、equals问题


    =

    等号在此就不多少了,罗列出来主要是为了形成对比

    ==

    基本数据类型用==比较值是否相等,因为基本类型不是对象,所以没有equals方法。

    ==比较的是(基本变量/引用变量)所指向的内存地址

    New出来的对象都是重新分配内存地址,所以需要用equals比较值

    除了String类重写了equals方法,其他都与Object类的equals方法一致,String类型的变量可直接用==比较值

    Integer Double Long Character等包装库的equals方法比较的是值

    =就是用来赋值的;==是用来比较地址值的;equals方法是用来比较具体值的

    相关文章

      网友评论

        本文标题:javaSE扫盲_02

        本文链接:https://www.haomeiwen.com/subject/sgnkpktx.html