文章目录

  • 初入JAVA
    • 1、什么是基本类型
    • 2、基本类型的分类、长度和默认值
    • 3、拆箱和装箱

初入JAVA

java学习都是从基本类型开始的,日常工作中基本类型也是经常用的东西。不过基本类型的知识点确认已经掌握了吗?
来看看那接下来的几个问题吧

1、boolean类型的长度是多少?
2、void是基本类型吗?
3、int i=0; Integer j=i;这个装箱过程中,基本类型是怎么赋值给引用类型的?
4、基本类型存储在栈上,什么时候存储在堆上呢?

这些问题的答案包含在接下来的内容里,让我们一块来研究下吧

1、什么是基本类型

   Java中对象的类型分为基本类型和引用类型,那么怎么区分基本类型和引用类型呢。

常用简单区分引用类型和基本类型的方法是:基本类型存储在栈上;引用类型是引用存储在栈上,而数据存储在堆上。但是!!!根据数据存储位置来区分类型。这种方法实际上存在一些错误。

看下接下来的代码:

public void demo1(){    int tmp1=0;
}
tmp1存储在demo1方法的方法栈中,这个没有什么疑问,可是接下来的情况呢?
public class Demo2 {int tmp2 =1;
}
 Demo2是引用类型,实例化对象demo2的数据存储位置是堆,tmp2是int类型,如果tmp2数据存储在栈中
,demo2是如何找到栈中的tmp2呢,如果这里还有一个引用指向tmp2的引用吗?显然是不可能这么设计的,所
以tmp2实际存储位置是堆中。

所以,基本类型的存储位置分为这一下情况:

1、基本类型作为方法中的局部变量时,存储在方法栈上;

2、作为对象属性的时候,对象存储在堆上,那么基本类型就会存储在堆上。(这里强调对象存储在堆上,这个涉及编译优化的,暂不详述)

3、final和static修饰的存储在方法区

个人观点,区分基本类型和引用类型的关键还是它们的数据存储结构,

1、基本类型数据结构组成:创建时分配的存储空间,并且存储的是基本类型包含的值;2、引用类型的数据结构组成:栈上的引用和堆上的数据,在堆上分配的存储空间,存储的是对象的值,在栈
上分配的存储空间,存储引用指向堆中的地址。

现在弄清楚了基本类型是什么,接下来具体聊一下基本类型吧

2、基本类型的分类、长度和默认值

基本类型分为四类:整型、布尔型、泛型和字符型名称  长度(字节)    默认值
byte    1   0
short   2   0
int 4   0
long    8   0
float   4   0.0
double  8   0.0
char    2   \u000
boolean 未规定 false其中值得研究一下的是boolean,因为官方没有明确给出boolean长度,实际的长度是由相应的虚拟
机来设计的。boolean表示是、否两种情况,只需要一位就可以表示。在jvm中基本类型分为:数值类型、
boolean类型和returnAddress三种类型。boolean作为一种单独的类型,个人认为它是一种比较特殊的
情况。不过在jvm中的最小单位是字节,也就是说boolean不会少于8位,比较让人接受的说法是,boolean
在编译过程中使用int表示,即占用4个字节。而boolean数组中使用一个字节表示。

接下来聊一下基本类型的使用吧

3、拆箱和装箱

   拆箱,即把包装类型转换为基本类型装箱,即把基本类型转换为包装类型

拆箱和装箱是在日常代码中经常用到的,下面代码,就是一个拆箱和装箱的过程

public void demo()
{//装箱Integer  no1 = 10;//拆箱int no2 = no1;
}
这种代码已经很熟悉了,不过no1赋值10这个过程中,一个基本类型是怎么变成引用类型的呢?
这就要从java代码的语法糖说起了
语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。(Java中有很多被加糖的语法,如for循环、String的拼接等等,有兴趣的话可以了解下。)
也就是说Integer  no1 = 10;这行代码被加糖了,具体做了什么呢。很简单反编译一下class文件看下这行代码的真实面目就好了,没有加糖前的代码是这样的
Integer  no1 = Integer.valueOf(10);
int no2 = no1.intValue();

这下就明白了拆箱和装箱过程的整个过程了!!!

这里还有一个关于包装类型的比较巧妙地设计,来看下valueOf这个函数

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}

IntegerCache.low 是-128,IntegerCache.hig是127,也就是说,如果int值是-128-127之间的时候,返回的结果是IntegerCache.cache这个缓存池中的对象,即valueOf函数返回结果在这个范围内的都是指向的是一个对象,如果不在这个范围内就返回一个新的Integer对象。

所以面试过程中,这个经常会问

Integer  no1 = 10;
Integer  no2 = 10;
Integer  no3 = 200;
Integer  no4 = 200;
System.out.println(no1==no2);
System.out.println(no3==no4);

上边这块代码输出结果是什么?

Java基础篇-基本类型相关推荐

  1. 你所需要的java基础篇深入解析大汇总

    java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序 ...

  2. 你所需要的java基础篇和提升篇大总结

    好好学java 致力于java知识分享 关注 精彩内容 你所需要的java全套视频教程 你所需要的java电子图书 你所需要的大数据视频教程 你所需要的java练习项目 如 / 诗 近半个月,每天一篇 ...

  3. Java基础篇4——数组

    Java基础篇4--数组 1.数组的概念 当需要在Java程序中记录单个数据内容时,则声明一个变量即可 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数 组即可,一维数组本质上就是 ...

  4. Java基础篇3——流程控制

    Java基础篇3--流程控制 1.顺序结构 正常代码的流程即是顺序流程 2.分支结构 2.1.if-else分支 if(条件表达式) {语句块1; } if(条件表达式) {语句块1; } else ...

  5. Java基础篇2——运算符

    Java基础篇2--运算符 1.运算符 1.1.算数运算符 +表示加法运算符 -表示减法运算符 *表示乘法运算符 /表示除法运算符 %表示取余运算符 1.2.关系运算符 所有以关系运算符作为最终运算的 ...

  6. Java基础篇1——变量与数据类型

    Java基础篇1--变量与数据类型 1.标识符命名规则 标识符以由大小写字母.数字.下划线(_)和美元符号($)组成,但是不能以数字开头. 大小写敏感 不能与Java语言的关键字重名 不能和Java类 ...

  7. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  8. 菜鸟学习笔记:Java基础篇6(数组、字符串)

    菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...

  9. 菜鸟学习笔记:Java基础篇5(抽象类与接口、回调函数、内部类)

    菜鸟学习笔记:Java面向对象篇下 抽象类 接口 回调函数 内部类 成员内部类 匿名内部类 抽象类 通过前面知识的学习,抽象类这个概念应该不难理解,但比较容易和后面要说的接口混淆,而且在面试中也比较爱 ...

最新文章

  1. 宏基因组扩增子3统计绘图:中文首发,最详系,零基础(箱线图、散点图、热图、曼哈顿图、火山图、韦恩图、三元图、网络图)
  2. Struts2的概述和入门
  3. 第十七届智能车竞赛何时开始呀?
  4. 【Spark-core学习之九】 Spark案例
  5. PHP之session与cookie
  6. oracle冷备份/恢复
  7. 隧道不能访问web vxaln_SpringBoot实现本地存储文件上传及提供HTTP访问服务
  8. FPGA RTL级设计原则
  9. MYSQLmy-innodb-heavy-4G.cnf配置文件注解
  10. python炒股日记_Python日记
  11. netframework有什么用_为什么.NET Web 应用推荐使用 await、async异步编程?
  12. 如何高效学习,斯科特·扬(全文)
  13. 应用Matlab小波变换工具箱进行图像压缩
  14. 2018“百度之星”程序设计大赛 - 复赛 1003 带劲的and和(位运算,很好的题)
  15. 项目管理培训的一些总结
  16. 2022年3000元电脑最强组装 组装电脑配置推荐3000元左右
  17. powerquery分组_Power Query 神奇的分组统计1
  18. Python测试进阶(三)
  19. 计算机字长通常不可能,计算机的字长通常不可能为( )位。
  20. office 2010 安装教程

热门文章

  1. 青海西藏新疆地区有名的调查研究咨询公司
  2. 蜜蜂剪辑v1.5.0.1更新啦
  3. html5实现百度语音播报功能
  4. vivo X21的Usb调试模式在哪里,打开vivo X21Usb调试模式的步骤
  5. bugku ctf 这不是md5 (666c61677b616537333538376261353662616566357d)
  6. (转载)你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作...
  7. Oracle v$nls_parameters 和 nls_database_parameters 区别
  8. Kaggle 新手入门必看,手把手教学
  9. python卡尔曼滤波融合_数据融合之卡尔曼滤波示例
  10. bugku(crypto)-聪明的小羊