Java学习之一(引用相关)
1.Java概述
首先,Java是一门面向对象的编程语言。相对于C/C++等语言,Java中没有指针,但是这不代表指针等知识不重要;Java中不存在多继承但是存在多接口。在我自己的学习过程之中,我偏向于实现接口的方式进行编程,因为Java不支持多继承,而支持多接口。
Java具有跨平台开发的特点。Java可以编写桌面应用、Web应用程序、分布式系统和嵌入式系统等应用程序等。我主要是往Web应用程序学习。
2.Java命名习惯
包名:统一小写 例如:org.study.pojo(三个文件夹)
常量名:所有字母大写
变量名:首字母小写,后面单词首字母大写
类名:单词首字母大写
3.基本数据类型
常用的Java数据类型主要是8个基本数据类型
8个基本数据类型
byte:Java中最小的数据类型,占用8位(bit),1字节;取值范围为-128~127,默认值为0
short:短整型,占用16位内存,默认值为0
int:整型,占用32位内存,默认值为0
long:长整型,占用64位内存,默认值为0L;注意,在进行long类型变量的声明的时候,如果数值过大需要在数据后面加上L;
float:浮点数(浮点型),占用32位内存,默认值为0;注意,在进行float类型变量的声明的时候,如果后面有小数点则需要在数据后面加上一个f,否则编译器会进行报错
double:双精度浮点类型,占用64位内存,默认值为0;
char:字符型,用来存储单个字符,占用16位,2个字节,默认值为null
boolean:布尔类型,占用1个字节,只有两个值为true、false,默认值为false
4.Java中引用类型
常见的引用类型有:String、数组、类、接口、枚举等
4.1关于这个问题,先看看所谓的Java引用是什么?
引用的基本概念:如果申明一个变量的类型是一个类而不是一个基本类型,则就称为这个变量为引用;一般情况下,当一个对象没有引用的时候会被垃圾回收机制所清理(GC)。而根据引用的强弱关系,可以将对象的引用级别划分为:强引用(使用new进行申明)、软引用、弱引用、虚引用。
这时候可能还会存在糊涂,什么是对象、什么是引用。
4.2对象与引用感觉是同一个?
举例说明
Student student = new Student();
看上面我们new了一个对象(蓝色部分为申明了一个Student对象),变量student由Student类进行申明,所以student变量是一个引用。
4.3关于强引用、软引用、弱引用、虚引用(关于底层还是不曾了解,学习GC机制后回来书写实例)
4.3.1强引用
强引用是java中最常见的引用类型,一般是new出来的对象;如果对象是强
引用,则垃圾回收机制不会对其进行回收,Java虚拟机情愿抛出异常错
(OutOfMemoryError)也不会回收。
如果对象需要进行回收的话,可以手动将引用设置为null,这样对象就会在合
适的时候被垃圾回收器进行回收(GC回收机制是在对象没有引用的时候会自动
的进行回收)。
例如:Student student = null;这样,对象没有了引用,则垃圾回收机制则会在合适的时候将对象进行回收。
4.3.2软引用
用来描述有用但并不是必须的对象,对于软引用所申明的对象,在JVM内存不够的情况下,会自动回收这个对象。这个特性很适合用来实现缓存。
4.3.3弱引用
通常用来描述非必需对象,当JVM进行垃圾回收的时候会自动的回收这个类型的对象。当然也可以通过显示的进行回收Systrm.gc();【这句话的意思是通知JVM进行垃圾的回收,但是JVM并不会立即执行回收机制】
4.3.4虚引用
虚引用的话,和没有引用关联的对象差不多,随时都可能会被垃圾回收机制进行回收。由于随时可能会被回收,所以可以利用这个特性来监听垃圾回收机制是什么时候执行的。
5.Java的值传递
网上存在着两种说法:一、Java即存在值传递也存在引用传递 二、Java只存在引用传递。
值传递:将数据的值拷贝一份传入参数
那么,哪种说法是真确的呢?我们先写一个代码
public class TestString01 {
public static void change(String str,char[] ch,int number){
str = "方法中的值";
ch[1] = 'a';
number = 100;
} public static void main(String[] args) {
String str = "主方法";
char[] ch = new char[]{'1','1','1'};
int number = 10;
//调用方法
change(str,ch,number);
System.out.println("字符串:" + str + " " + "数组:" + ch[1] + " " + "数字" + number);
}
}
运行结果为
其中number是基本类型,String与数组都是引用类型,为啥结果过都不一样呢?这就关系到Java中数据在内存中的存储机制了
6.Java数据的存储机制
栈:每一个线程包含一个栈区,栈中指保存基本数据类型的值和对象引用以及基础数据的引用
堆:存储对象,JVM只有一个堆,这个堆会被所有的线程共享,只存放对象本身而不存在对象的引用
方法区(静态区):被所有的线程共享,存放class文件以及static变量与方法
常量池:jdk1,6常量池放在方法区、jdk1.7常量池放在堆内存、jdk1.8放在元空间里面,和堆相独立
这也就是为什么基本数据类型在进行传递之后,主函数的值没变的原因。
再来看一看数组的引用类型:
由此可见,所谓的引用传递其实传递的也是一个值,只不过这个值是一个地址。既然是引用传递,那为什么String的值没有改变呢?
我们先来看看String的代码:
这里有两个final,第一个存在于class之前,代表了这个类不能被继承;第二个final则是我们的数据了,由于它使用了final修饰符,所以String所定义的数据是一个常量;常量保存在常量池中,不会被更改;所以当执行更换方法的时候,它并不会更改原有的值,而是会重新开辟一块空间并指向这块空间的地址。而原来main中的String还是指向原来的地址,所以数值没有发生改变。图解如下:
Java学习之一(引用相关)的更多相关文章
- Java学习之强引用,弱引用,软引用 与 JVM
1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括 强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...
- Java学习|强引用,软引用,弱引用,幻想引用有什么区别?
在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Objec ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- Java学习笔记之深入理解引用
引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记(十六)——Java RMI
[前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...
- Java学习总结:飘逸的字符串
Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字 ...
- Java学习-034-JavaWeb_003 -- JSP page 指令
前文对 JSP 的基础知识进行了初步的讲解,此文主要讲述 JSP page 指令. page 指令用于定义页面的多种属性,例如:脚本语言.编码方式.导入的 Java 包等,page 执行的语法如下: ...
随机推荐
- pointer && reference
关注点在于区别两者之间的不同. 我们可以从两者使用的场景进行区分: 1, 是否需要存在null的情况: YES-pointer NO-reference 如果确定不会存在null的情况,那么使用ref ...
- mysql UDF提权问题
测试UDF提权,时候遇到问题,创建函数shell提示存在 当执行操作的时候又提示,shell函数不存在. FUNCTION mysql.shell does not exist 如果在测试环境下,一般 ...
- gcc 4步编译过程
一. gcc编译过程 1. 预处理: 主要进行宏替换以及头文件的展开 gcc -E *.c -o *.i 2. 编译::编译生成汇编文件,会检查语法错误 gcc -S *.i ...
- SQL 顺序
查询语句中select from where group by having order by的执行顺序 查询语句中select from where group by having order by ...
- 获取linux性能数据
import reimport osimport sysimport jsonimport socketfrom urllib import request,parseimport urllibfro ...
- hibernate的核心思想
Hibernate的核心思想是ROM对象关系映射机制.它是将表与表之间的操作映射成对象与对象之间的操作.也就是从数据库中提取的信息会自动按照你设置的映射要求封装成特定的对象.所以hibernate就是 ...
- bcolz
raise Exception("this is an ex") bcolz总结: 0.需要用bcolz的columns需要为ndarray的列,不能直接拿list去赋值,因为我发 ...
- java基本类型映射表
- hibernate_05_hibernateHQL查询QBC查询和SQL查询
1.HQL简介:HQL是Hibernate Query Language(Hibernate 查询语言)的缩写,提供更加丰富灵活.更为强大的查询能力:HQL更接近SQL语句查询语法.Hibernate ...
- mvc和mvvm区别
mvc和mvvm区别 MVC和MVVM的区别其实并不大.都是一种设计思想. 主要就是MVC中Controller演变成MVVM中的viewModel. MVVM主要解决了MVC中大量的DOM操作使页面 ...