java中的数据类型

Posted xdyixia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的数据类型相关的知识,希望对你有一定的参考价值。

java中的数据类型

java语言的数据类型包括两种,基本数据类型和引用数据类型。

定义

基本数据类型:变量名指向具体的数值。

引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值。

 

基本数据类型:整数类型(byte,short,int,long);浮点类型(float,double);字符型(char);布尔型(boolean)。

引用数据类型:类(class),接口(interface),数组([])。引用数据类型的类都是Object类的子类。

 

内存分配

基本数据类型:在被创建时,在栈上给其划分一块内存,将数值直接存储在上。

引用数据类型:在被创建时,首先要在上给其引用(句柄)分配一块内存,而对象的具体信息都存储在内存上,然后由栈上面的引用指向堆中对象的地址。

例如,有一个类Person,有属性name,age,带有参的构造方法,

Person p = new Person("zhangsan",20);

在内存中的具体创建过程是:

1.首先在栈内存中位其p分配一块空间;

2.在堆内存中为Person对象分配一块空间,并为其三个属性设初值"",0;

3.根据类Person中对属性的定义,为该对象的两个属性进行赋值操作;

4.调用构造方法,为两个属性赋值为"Tom",20;(注意这个时候p与Person对象之间还没有建立联系);

5.将Person对象在堆内存中的地址,赋值给栈中的p;通过引用(句柄)p可以找到堆中对象的具体信息。

相关知识:

静态区: 保存自动全局变量和 static 变量(包括 static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。

堆区:  一般由程序员分配释放,由 malloc 系列函数或 new 操作符分配的内存,其生命周期由 free 或 delete 决定。在没有释放之前一直存在,直到程序结束,由OS释放。其特点是使用灵活,空间比较大,但容易出错。

栈区: 由编译器自动分配释放,保存局部变量,栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限。

文字常量区: 常量字符串就是放在这里的, 程序结束后由系统释放。

程序代码区:存放函数体的二进制代码。

参考:https://www.cnblogs.com/fxust/p/4622105.html

Java中的Null是什么?

正如我说过的那样,null是Java中一个很重要的概念。null设计初衷是为了表示一些缺失的东西,例如缺失的用户、资源或其他东西。但是,一年后,令人头疼的空指针异常给Java程序员带来不少的骚扰。在这份材料中,我们将学习到Java中null关键字的基本细节,并且探索一些技术来尽可能的减少null的检查以及如何避免恶心的空指针异常。

1)首先,null是Java中的关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错。

Object obj = NULL; // Not Ok
Object obj1 = null  //Ok

使用其他语言的程序员可能会有这个问题,但是现在IDE的使用已经使得这个问题变得微不足道。现在,当你敲代码的时候,IDE像Eclipse、Netbeans可以纠正这个错误。但是使用其他工具像notepad、Vim、Emacs,这个问题却会浪费你宝贵时间的。

2)就像每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将false作为自己的默认值,Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。为了证明这个事实,你可以通过创建一个变量然后打印它的值来观察这个引用变量,如下图代码所示:

private static Object myObj;
public static void main(String args[]){
    System.out.println("What is value of myObjc : " + myObj);
}

What is value of myObjc : null

这对静态和非静态的object来说都是正确的。就像你在这里看到的这样,我将myObj定义为静态引用,所以我可以在主方法里直接使用它。注意主方法是静态方法,不可使用非静态变量。

 转自:http://www.importnew.com/14229.html

以上是关于java中的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

LockSupport.java 中的 FIFO 互斥代码片段

如何从 Firebase 获取数据到 Recyclerview 中的片段?

如何使用java将数据从片段传递到android中的另一个片段?

22.java方法的定义

java 获取片段中的活动数据

Android 上的 Kotlin:如何在片段中使用数据库中的 LiveData?