首页 > 编程语言 >【java】Java之关于基本数据类型和引用数据类型的存放位置

【java】Java之关于基本数据类型和引用数据类型的存放位置

时间:2024-05-09 16:55:56浏览次数:18  
标签:Java 变量 数据类型 引用 类型 java 方法 public

1、基本数据类型存放在哪?

基本类型的变量存在栈里或者堆里不是由"大小可知,生存期可知"就能确定了。

关键是上下文。

比如:

1 2 3 void method(){     int a = 3; }

这自然是存在栈里的。局部方法嘛。

而:

1 2 3 class Test {     int a = 3; }

这就肯定是随对象放到堆里的。

**因此,不要孤立的看到基本类型就说放到栈里,看到引用类型就说放到堆里。

**从更深层次去理解它们会更好,例如为什么是在基本类型的实例变量在堆上创建,局部变量在栈上创建,这样做有什么好处

2、思考

如果你熟悉java的内存结构的话就会知道,堆 是所有线程共享的内存区域,栈 是每个线程独享的,如果你将一个实例变量放在栈内,那么就不存在多个线程访问同一个对象资源了,这显然是不对的,所以实例变量要在堆上创建,也不是线程安全的。

但是对于局部变量,是在栈上创建的,每一次方法调用创建一个帧,独享一份内存区域,其他的线程是不会访问到该线程的资源,在 栈上创建也会减轻GC的压力,随着该方法的结束,帧出栈,相对应的内存消除,这种局部变量占用的内存自然就消失了,因此局部变量是线程安全的。

3、注

基本数据类型是放在栈中还是放在堆中,这取决于基本类型声明的位置。

一:在方法中声明的变量

即使变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因。

在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。

(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中

(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。

二:在类中声明的变量是成员变量

也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。

同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量

(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的

(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中.

总结:

基本数据类型和引用数据类型的区别

众所周知Java是一种强类型语言,在Java语言中,Java的数据类型一共分为两大类,分别为基本数据类型和引用数据类型,其中基本数据类型细分小类可分为整数类型、浮点类型、字符类型、布尔类型这四小类。

基本数据类型和引用数据类型

1. 基本数据类型

只有8种,可按照如下分类 :

  • 整数类型: long、int、short、byte
  • 浮点类型: float、double
  • 字符类型: char
  • 布尔类型: boolean
No.数据类型大小/位可表示数据范围默认值
1 byte(字节型) 8 -128~127 0
2 short(短整型) 16 -32768~32767 0
3 int(整型) 32 -2147483648~2147483647 0
4 long(长整型) 64 -9223372036854775808~9223372036854775807 0
5 float(单精度) 32 -3.4E38~3.4E38 0.0
6 double(双精度) 64 -1.7E308~1.7E308 0.0
7 char(字符) 16 0~255 ‘\u0000’ (其实就是一个空格)
8 boolean(布尔) - true或false false

2. 引用数据类型

引用数据类型非常多,大致包括:类Class、 接口类型Inteface、 数组类型Array、 枚举类型Enum、 注解类型、 字符串型

例如,String类型就是引用类型。简单来说,所有的非基本数据类型都是引用数据类型。

基本数据类型和引用数据类型的区别

1. 存储位置区别

a). 基本变量类型

在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的,基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上的。

b). 引用变量类型

只要是引用数据类型变量(类class、接口interface、数组array),其变量或者对象的具体内容信息都是存放在堆中的,而栈中存放的是其具体内容所在内存的引用地址

Tips : 通过变量地址可以找到变量的具体内容,就如同通过房间号可以找到房间一般

1 2 3 4 5 6 7 8 9 public class Main{    public static void main(String[] args){        //基本数据类型        int i=1;        double d=1.2;        //引用数据类型        String str="helloworld";    } }

c)内存划分:

 

2. 传递方式区别

a. 基本变量类型

方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的

1 2 3 4 5 6 7 8 9 10 11 12 //基本数据类型作为方法参数被调用 public class Main{    public static void main(String[] args){        int msg = 100;        System.out.println("调用方法前msg的值:\n"+ msg);    //100        fun(msg);        System.out.println("调用方法后msg的值:\n"+ msg);    //100    }    public static void fun(int temp){        temp = 0;    } }

内存空间

 

b. 引用变量类型

引用数据类型变量,调用方法时作为参数是按引用传递的

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 //引用数据类型作为方法参数被调用 class Book{     String name;     double price;     public Book(String name,double price){         this.name = name;         this.price = price;     }     public void getInfo(){         System.out.println("图书名称:"+ name + ",价格:" + price);     }     public void setPrice(double price){         this.price = price;     } } public class Main{    public static void main(String[] args){        Book book = new Book("Java开发指南",66.6);        book.getInfo();  //图书名称:Java开发指南,价格:66.6        fun(book);        book.getInfo();  //图书名称:Java开发指南,价格:99.9    }    public static void fun(Book temp){        temp.setPrice(99.9);    } }

调用时为temp在栈中开辟新空间,并指向book的具体内容,方法执行完毕后temp在栈中的内存被释放掉

内存空间

 

 

 

标签:Java,变量,数据类型,引用,类型,java,方法,public
From: https://www.cnblogs.com/zzsuje/p/18182628

相关文章

  • Java学设计模式之桥接模式
    一、桥接模式概念1.1什么是桥接模式桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将抽象部分和实现部分分离来解决多维度变化的问题,从而提高了系统的灵活性和可扩展性。结构桥接模式通常由以下几个部分组成:Abstraction(抽象类......
  • 第二届数信杯南区wp-easyJava
    writeupeasyJava用EclipseMemoryAnalyzer进行分析,利用OQL查找字符串这里要写正则表达式:我写了\\u.*意思是找unicode字符串,因为这里的中文都做了unicode编码搜索到这么一个字符串列表,转码——红色框框里的是还原后的内容。如下:想跟你说一个小秘密:我把码表修改成了......
  • Java-线程-线程池
    0.背景参考资料:Java线程池实现原理及其在美团业务中的实践在Java早期,每次创建线程时,都要涉及到线程的创建、销毁以及资源管理,这对于系统的性能和资源利用率是一种浪费。因此,Java提供了线程池的概念,以提高线程的管理效率和性能。资源管理优化:传统的线程创建和销毁需要涉......
  • Java学设计模式之装饰器模式
    一、模式概念1.1什么是模式装饰模式是一种结构型设计模式,它允许向现有对象动态添加新功能,同时又不改变其结构。装饰模式通过将对象放置在包装器类中,然后在运行时动态地向对象添加新的行为或责任,从而实现这一目的。结构装饰模式通常由以下几个部分组成:Component(组件):定义一......
  • Java学设计模式之适配器模式
    一、适配器模式概念1.1什么是适配器模式适配器模式是一种结构型设计模式,它提供了一种将不兼容的接口转化为兼容的接口的方式,从而使原本无法一起工作的类可以协同工作。适配器模式可以分为两种:对象适配器和类适配器。1.2对象适配器对象适配器通过组合的方式,将不兼容的接口适......
  • C语言数据类型篇
    前言写这个系列的文章,其实也是给自己一个交代。之前断断续续的学过C语言,后来发现了很多自己的问题。比如看过的东西过几天就忘记了,有比如要坚持看多少东西后来就坚持不下去了,另外没有一个东西来记录自己对C语言的学习知识点的记录,C语言很重要。是所有语言的母语言,就想在此次学习......
  • Java学设计模式之原型模式
    一、原型模式概念原型模式是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而不是通过实例化类来创建。这种方式可以提高创建对象的效率,特别是当对象的创建过程比较昂贵或复杂时。在原型模式中,原型对象是一个已经存在的对象,它作为新对象的模板。新对象通过复制原......
  • 国密算法SM3-java实现
    maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency> SM3Utilsimportorg.bouncycastle.crypto.digests.SM3Dig......
  • 国密算法SM4-java实现
    Maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency>SM4importjava.io.ByteArrayInputStream;importjava.......
  • Java学设计模式之建造者模式
    一、建造者模式概念1.1什么是建造者模式建造者模式是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示分离,以便同样的构建过程可以创建不同的表示。它允许客户端通过相同的构建过程来构建不同的产品。建造者模式通常涉及以下几个角色:产品(Product):表示被构建的复杂对......