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还是指向原来的地址,所以数值没有发生改变。图解如下:

原文地址:https://www.cnblogs.com/yyuanyu/p/11818854.html

时间: 2024-10-12 08:54:39

Java学习之一(引用相关)的相关文章

Java学习之强引用,弱引用,软引用 与 JVM

1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象.  java对象的引用包括  强引用 软引用 弱引用 虚引用 3.强引用 是指创建一个对象并把这个对象赋给一个引用变量. 强引用有引用变量指向时永远不会被垃圾回收.即使内存不足的时候.4.软引用 软引用通过SoftReference类来实现 软引用的对象当系统内存充足时和强引用没有太多区别,但内存不足时会回收软引用的对象. 很多对象,但是只有一个引用指向他们(可分别指定) pub

Java学习|强引用,软引用,弱引用,幻想引用有什么区别?

在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Object()中的obj就是强引用.通过关键字new创建的对象所关联的引用就是强引用. 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的"存活"对象来解决内存不足的问题.对于一个普通的对象,如果没有其他的引用关系

Java学习笔记<3>面向对象相关

面向对象的基本思想 从现实世界客观存在的事务出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式,如抽象.分类 继承.聚合.多态等. 类和对象的关系 对象中存储了类规定的数据类型,并且对象可以调用类的方法. java面向对象 <1>对象是java程序的核心,一切皆对象. <2>对象可以看成静态属性(成员变量)和动态属性(方法)的封装体. <3>类是创新同一类型对象的模版,定义了该类型对象应具有的成员变量及方法. 类的定义 成员变量可以用java语言的任何一种

答读者问(8):有关Java学习的相关问题

最近,我收到一位研究生朋友的邮件,大致内容如下: 周老师您好,我是XXX大学软件工程专业的一名研究生我叫XXX,学习的方向是java,有些问题不知道周老师能否帮我解惑下,在此谢谢老师! 1.我应该专注于后台的学习么?我在实际学习中,感觉到前台和后台也是分不开的总要涉及到,学习的过程中我学习了SSH大量的知识,再回头看看前台的一些技术jsp,html,css,jQuery感觉技术太多了,需要大量的练习记忆,不知道到底应该如何学习这些知识? 2.精通SSH(在此以SSH举个例子)等等技术到底需要个什

Java学习笔记之深入理解引用

引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解的版本. 我们知道引用根据引用的类型不同有许多名称,如字符串引用,数组引用等等. 一.栈内存和堆内存 我们数组来引出和解释这两个概念. 数组引用变量只是一个引用,这个引用可以指向任何有效的内存. 简单的理解就是,这个引用是用来存放数据地址的(数据地址指向数据在内存中的存储位置),在声明引用变量的时候

JAVA学习篇--JSTL基础

JSTL是什么 JSTL(JSP Standard TagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库. 为什么要用JSTL 我们JSP用于开发信息展现页非常方便;也可以嵌入java代码(scriptlet.表达式和声明)代码用来实现相关逻辑控制.看下面程序.但这样做会带来如下问题: jsp维护难度增加;出错提示不明确,不容易调试; 分工不明确;(即jsp开发者是美工,也是程序员); 最终增加程序的开发成本; <% if (session.getAttribute(

&lt;Java&gt;&lt;学习路线图&gt;

Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了. 但有一些一般的步骤: 1.熟悉一种文本编辑器,比如Vim, Emacs, Notepad++, TextMate等.知道哪些是开源的,哪些是闭源的,哪些要收费.养成不用盗版软件的习惯.2. 安装JDK(建议用你的Linux发行版自带的软件包管理器安装openjdk,过程中可能需要读发行版特定的文档)3. 写一个Java的Hello world程序,并用命令行工具javac编译,再用java命令运行这个程序.过程中熟悉源

Java学习总结:飘逸的字符串

Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字符串,那么就来好好认识一下吧. 怎么构造一个字符串? 在Java语言里,有两种方法来创建一个字符串对象:一是用字符串直接量 1 String message=new String("Welcome to Java"); 2 String message2="Welcome to

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my