java 基本类型的引用_Java中的基本数据类型与引用数据类型
一、基本数据类型
byte、short、int、long(整数类型)
float、double(浮点数类型)
char(字符型)
boolean(布尔类型 )
Java数据大多数存放在堆栈中。栈区:存放局部变量,对象声明的引用等。
堆区:存放new关键字创建的类(包含成员变量)和数组等。
堆与栈的优缺点栈的优点:栈数据可以共享,存取速度比堆快。 缺点是:存在栈中数据大小与生命周期是确定的。
堆的优点:可以动态分配内存大小,生存期也不必事先告诉编译器。缺点是:存取速度较慢。
举个栗子,如下图:
编译器会在栈中创建一个a的引用,然后在栈中查找字面值为5的引用,将a指向5的地址,若没有找到,就会开辟一个地址来
存放字面值5,然后再将a指向该地址。定义int c=5;因为栈中存在字面值5,所有c会直接指向5的地址。令a=8,因为栈中
没有字面值为8的引用,所有会开辟一个地址存放8,a会重新指向8的地址,c的指向不受a影响,c的值不会改变。
二、引用数据类型
1. Class(类)
2. Interface(接口)
3. Array(数组)Java是面向对象语言,它为每一个基本数据类型都做了相应的包装类(见上一个表格),也就是实现了基本类型变量到包装类
对象的转换。引用类型一般通过new关键字来创建,(对象)它存放在内存的堆中,可以在运行时动态的分配内存大小。引用
变量中存放的是变量内容的地址,它存放在内存的栈中。当引用类型变量不被使用时,Java内部的垃圾回收器GC会自动回收。
1.代码示例-Class:public class Demo {
String Name;
int Age;
double Score;
Demo(String Name,int Age,double Score){
//定义带三个参数的构造函数,进行初始化
this.Name=Name;
this.Age=Age;
this.Score=Score;
};
public static void main(String[] args) {
Demo d1=new Demo("小吴",20,98);
Demo d2=new Demo("小天",19,80);
}
}
引用本身是保留在栈中的,而引用所指的对象是存放在堆中的。
2.代码示例-Interfaceinterface Animal {//定义Animal接口
public void eat();
public void speak();
}
public class Dog implements Animal {//Dog类实现Animal接口
public void eat() {
System.out.println("我喜欢吃骨头!");
}
public void speak() {
System.out.println("汪汪汪!");
}
public static void main(String[] args) {
Dog d=new Dog();
d.eat();
d.speak();
}
}编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
接口与类的区别:接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口需要被类实现。
接口支持多继承。
3.代码示例-Arraypublic class Array {
public static void main(String[] args) {
int[] myList = new int[] {5,2,0,1,3,1,4};
for(int list: myList) {
System.out.print(list);
}
}
}在以上代码中,myList变量存放了数组对象的引用,它存放到栈中,而数组对象所占的空间在堆上被分配(和上图一样)。
拓展1:方法的返回值类型为类名:返回该类的对象。
方法的返回值类型为接口名:返回该接口的实现类的对象。public static Comparable findMax(Comparable[] arr) {
int maxIndex=0;
for(int i=1;i
if(arr[i].compareTo(arr[maxIndex])>0)
maxIndex=i;
return arr[maxIndex];
}上述代码中,传递参数为实现了Comparable接口的对象数组,方法返回的是Comparable接口的实现类的对象。
我们通常会使用Object、接口类型等方式来表示泛型,目的是支持代码重用。
拓展2:自动装箱与拆箱自动装箱:如果一个int型量被传递到需要一个Integer对象的地方,编译器将在幕后插入一个对Integer构造方法的调用。
自动装箱:如果一个Integer对象被放到需要int型量的地方,则编译器将在幕后插入一个对intValue方法的调用。
注:参考《数据结构与算法分析Java语言描述》和 菜鸟教程
java 基本类型的引用_Java中的基本数据类型与引用数据类型相关推荐
- java原始类型和引用类型_Java中的8种原始类型
java原始类型和引用类型 几年前,当我开始编辑Java Basics系列时,我认为将一些非常详细的信息拉到自己的帖子中是很有意义的. 这样,初学者的内容就更容易消化了. 首先,我将介绍有关Java的 ...
- java date类型大小比较_java中date类型如何比较大小
java中date类型如何比较大小 时间:2018-01-19 来源:Java data类型讲解 Date类在jdk1.1中就已经出现,算得上一个比较有历史的类了,用来表示日期时间.在实际的工 ...
- java关于包的叙述_Java中构造方法,包的引用,final,super等词的概括
final修饰的类不允许被继承. 一个类不能既是final的,又是abstract的.因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,两者矛盾. f ...
- java对象类型有哪些_Java中常用的对象数据类型有哪些?它们分别又占多少个字节呢?...
CSDN上面有关于数据类型的一篇总结详细的文章,顺便复制过来: 在java中常见的数据类型有哪些 ? 内置数据类型类型名称字节.位数最小值最大值默认值例子 byte字节1字节,8位-128(-2^7) ...
- java 地址传递 返回值_Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍
知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用.我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型 ...
- java中类型的相互转化_Java中的数据类型及相互转换方法
本文主要讲解两个部分: 一.Java中的数据类型有哪些? 二.数字类型和字符串类型相互转换的方法? 一.Java中的数据类型有哪些: Java中的数据类型有:基本数据类型和引用数据类型: 基本数据类型 ...
- java中date类型如何赋值_Java 中的类型传递问题解惑
点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 来源: https://blog.biezhi.me/2018/11/java-pass-by-value.html 我之 ...
- java字面量和符号引用_java中字面量,常量和变量之间的区别(附:Integer缓存机制)...
一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...
最新文章
- 特斯拉终于要“国产”了!
- 使用 MTR 诊断网络问题
- boost::future相关的测试程序
- 2019牛客暑期多校训练营(第三场)J - LRU management (模拟+list+unorder_map)
- docker实现宿主机和容器之间数据共享
- 微信公众平台消息接口开发(2)-封装weixin.class.php
- LeetCode 876. 链表的中间结点(快慢指针)
- linux shell之case用法
- php ajax实现上移,jquery实现标签上移、下移、置顶_jquery
- 如何将索引碎片数量降至最低
- SQL Server — 更改数据库名
- php app用户验证失败,无法验证app需要互联网连接以认证 建议更换登陆的AppleID
- 前端 如何检测到当前的网页已经退出_如何监控网页崩溃?
- 【STM32】 AMS1117(稳压)模块
- 我曾经学习过的地方--中国欧盟可用性研究中心
- java 生成2位随机数_java生成随机数保留数点后两位
- python geopy 北斗导航_【Python】使用geopy由经纬度找地理信息
- 狂神说docker 常用命令笔记
- Go语言核心之美 2.1-整数
- (附源码)SSM 汽车停车位共享APP 毕业设计 041534
热门文章
- SqlSelect-在查询结果前面加一列序号列
- 完美解决百度地图MarkerClusterer 移动地图时,Marker 的Label 丢失的问题
- 如何解决“HttpException (0x80004005): 超过了最大请求长度”问题
- springboot启动总是启动不起来UnsatisfiedDependencyException异常
- 出现Failed to get convolution algorithm的解决方法
- 什么是C ++ 11中的lambda表达式?
- 为什么是string.join(list)而不是list.join(string)?
- 在Git存储库中查找并恢复已删除的文件
- session存储在redis/memcache/mysql
- java笔试题(3)