Java学习之一(引用相关)
Posted yyuanyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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学习之一(引用相关)的主要内容,如果未能解决你的问题,请参考以下文章