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学习之一(引用相关)的更多相关文章

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

    1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象.  java对象的引用包括  强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...

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

    在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Objec ...

  3. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  4. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

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

    引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解 ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

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

    Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字 ...

  9. Java学习-034-JavaWeb_003 -- JSP page 指令

    前文对 JSP 的基础知识进行了初步的讲解,此文主要讲述 JSP page 指令. page 指令用于定义页面的多种属性,例如:脚本语言.编码方式.导入的 Java 包等,page 执行的语法如下: ...

随机推荐

  1. 006-Java的break和continue

    break 和 continue关键字的使用 break: 结束当前循环 continue:结束当次循环 示例如下 class JavaTest{ public static void main(St ...

  2. 7_API调用

    0 查看 kifastcallentry 里面具体怎么调用 首先是 切换了 fs 为kpcr的选择子 然后 构造了 一个trap frame(保存3环-->0环 切换的上下文:如果0环不使用就没 ...

  3. <a>标签中的href=""

    href="javascript:;",其中javascript:是伪协议,它可以让我们通过一个链接来调用javascript函数.而采用这个方式 javascript:;可以实现 ...

  4. Caused by: android.view.InflateException: Binary XML file line #18: Binary XML file line #18: Error inflating class android.widget.CheckedTextView

    困扰了我一天啊 终于吧 这个大bug  给解决掉了 可能是 当时懵逼了  竟然忘记重新构造了!!尴尬了 直接把项目的 build  文件删除重新构造了一边!!

  5. linux zip,tar压缩文件夹 忽略 .git 文件夾

    linux zip 忽略 .git 文件夾 # zip 命令 zip -r bitvolution.zip bitvolution -x *.git* # tar命令压缩文件夹忽略 .git文件夹 t ...

  6. Yii2 在php 7.2环境下运行,提示 Cannot use ‘Object’ as class name

    出错原因是: Object是php7.2中的保留类名,不可以使用Object作为类的名称. The object name was previously soft-reserved in PHP 7. ...

  7. NOI2014

    听说14,15年的题是最简单的,然后除了提答以外的不那么水的题都是以前讲过.做过的,都比较好想到,但是我实现起来却有各种Bug,也完全不能在5h里AC...太弱了 [NOI2014]起床困难综合症 纯 ...

  8. HDU - 1560 DNA sequence

    给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...

  9. CNN 常用的几个模型

    LeNet5 论文:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷 ...

  10. day22_1-课前上节复习+os模块

    # ********************day22_1-课前上节复习+os模块 *******************# ********************day22_1-课前上节复习+os ...