首页 > 编程语言 >On Java8读书笔记

On Java8读书笔记

时间:2024-03-28 09:58:27浏览次数:35  
标签:存储 Java Reference 读书笔记 对象 数组 使用 Java8

Objects EveryWhere

使用Reference掌控对象

掌控一个对象有两种不同的方式:直接掌控变量本身 or 间接掌控一个"通道",通过"通道"可以掌控对象

在Java中,我们通过间接的方式掌控对象,而这个"通道"就是Reference

Reference不同于对象本身,对象本身往往是"臃肿的"(对象内包括字段和方法),而Reference则是"轻巧的"

一个Reference在每一时刻只能对应一个对象,但是在线性的时间上,可以对应不同的对象(即可以改变Reference的指向)

使用new创建对象

那么要如何创建一个对象呢?

在Java中使用new关键字创建一个新的对象,例如:String s = new String("hello")

new不仅仅表示为’s’建立"通道"连接到一个String对象上,同时也创建了一个String对象

数据存储的地方

了解数据在计算机中的存储方式也许能让我们进一步理解对象和Reference之间抽象的关系!

数据存储的地方有五种:

  1. Register:这是最快[^1]的存储方式,然而由于Register的数量实在太少,因此为了防止程序员随意的使用而造成一些列不可预估的结果,Java并不允许我们直接使用Register,甚至我们都无法在程序中感知到它的存在
  2. stack:栈是另一种常见的存储空间,其中的数据后进先出[^2],同时它也是效率和速度仅次于Register的。对于存储在栈上的数据,Java必须知道它的生命周期,这种限制降低了我们的效率。一般来说,Reference和基本数据类型存储在栈上
  3. heap:不同于栈,Java并不需要明确知道堆中数据的生命周期,这使得我们的编程更加灵活,然而这种灵活性也需要付出代价:开辟和回收堆空间时需要耗费更多的时间。不过在Java中这种代价在逐步被优化。可以说所有的对象都存储在堆中
  4. constant storage:常量一般都直接出现在程序中,由于它们的不可变性,它们往往都非常的安全,这些数据则存储在constant storage中
  5. Non-RAM:存储于硬盘或流中的数据往往都在Non-RAM中,它们往往都完全独立于程序之外

基本数据类型

虽然Java强调万物皆对象,但是Java中也有基本数据类型,不同于包装类(Integer、Character等)基本数据类型往往更加的轻便、高效(存储于stack),并且由于它们拥有固定的大小,所以在不同的机器中,它们都可移植。Java8以上实现了自动装包和拆包,因此可以将基本数据类型和包装类直接运算

数组

许多拥有数组的编程语言都将数组作为一个块存储于stack中,加入一个程序数组索引超出了规定的范围,很有可能会访问到一块不属于数组的内存,从而造成不可预估的后果

在Java中,将数组视作一个对象,存储于heap中,我们则使用Reference去掌控数组,如果使用了超出范围的索引,则会在编译阶段报错[^3]

创建了数组以后,若没有直接给数组的元素赋值,那么Java会为每个元素赋上默认值,对象是null,其它的是0

数据回收

作用域

同样于其它语言,Java使用{}表示一个作用域,当作用域结束时,stack上的数据会被释放

heap上的数据并不会随着作用域的结束而结束,它会继续存在于程序中,直到一个垃圾回收装置检测到它不再被使用,才会被回收

在c++中你可能会看到如下代码

`outer:
{
    int x = 10;
    `inner:
    {
        int x = 9;
        cout << x;
    }
    cout << x;
}

c++中采用了’hide’的机制,第一次打印的值是9,第二次是10。在inner中创建了一个x变量(outer中的x隐藏),因此第一次打印9,而当{}结束后,x又变回了outer中的x,因此打印10。然而在Java中这样的语句是非法的,编译器会报错。

Java中无需我们手动是否内存空间,它有着优秀的内存回收机制,尽管也没那么智能(bushi),但它也让Java程序员比c++程序员少掉很多头发

一个类(class)包含了两个部分:字段与方法

可以这样理解,字段就是类本身的属性,例如一个人的身高、体重、年龄等;而方法则是类本身的行为,例如一个人可以走路、说话

字段如果没有被显示的定义,则会赋给它默认值(o或null)

字段可以使用.来访问:在Reference后面跟上.和字段名,方法的使用也同字段一样。不过我们一般会将字段设置为private(类外不可访问),这与程序的安全性相关

也许一个习惯于使用c++的程序员在刚接触到Java时会犯这样的错:在类外写方法,然后发现无法调用方法,查阅了无数资料发现了一个可怕的事实,是的,Java中所有方法都必须定义在类中!Java确实是一个更加纯粹的面向对象语言,在Java中万物皆对象

那么随之而来的新问题就是,如果我想使用一个和类的实例毫无关联的方法怎么办?或者说使用一个毫无关联的字段怎么办?

static关键字呼之欲出,使用static关键字在任何的方法或字段之前,可以让他们成为一个被同一类所有不同实例所共享的"共享单车",如果你想调用它们,直接使用类名.方法或字段即可

标签:存储,Java,Reference,读书笔记,对象,数组,使用,Java8
From: https://blog.csdn.net/m0_73435415/article/details/137101455

相关文章

  • 郭天祥新概念51单片机(第四期读书笔记)
    时钟周期、状态周期、机器周期、指令周期与晶振频率之间的关系1、晶振频率与脉冲的关系假设单片机的晶振频率是12MHz,那么它的一个脉冲为1/12微秒;晶振单位时间发出的脉冲则为:12∗......
  • Java8递归生成树
    @Data@BuilderpublicclassMenu{/***id*/publicIntegerid;/***名称*/publicStringname;/***父id,根节点为0*/publicIntegerparentId;/***子节点信息*/publicList<Menu>......
  • 当年明月《明朝那些事儿》读书笔记(二)
    最近一直保持着一周至少3小时阅读这本书,每次看一段时间后总有种恍如隔世的感觉,尤其是今天。确实,那些过去几年几十年的光阴,我在一个小小的方块上用几十分钟就看完了,自然会有一种时空上的恍惚。先说说最近读的,主要是讲王守仁。说实话,读这段时时常感到困惑,不知道王巡抚如何“格”遍......
  • 深入理解并行编程-读书笔记 rcu
     在当前的Linux内核中发挥着重要的作用。RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。RCU适用......
  • 深入理解Java虚拟机读书笔记
    1.双亲委派模型的兼容性优化    双亲委派模型在jdk1.2才开始,在以前是通过覆盖loadClass()方法来自定义类加载器,但是不做兼容,由于多态性,那么实际上加载时是直接用ClassLoader子类的loadClass()方法,ClassLoader的loadClass()方法不会被调用,所以为了兼容,添加了findClass(),这样自定义的类......
  • Centos安装配置Java8
    查看Centos发行版本[root@lavm-ik3g4r3pga~]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)查看java8安装包[root@lavm-ik3g4r3pga~]#yumlistjava-1.8*Loadedplugins:fastestmirrorRepositorybaseislistedmorethanonceintheconfiguration......
  • Java编程思想读书笔记
    1.finalize()方法垃圾回收器只能回收通过new创建的对象的内存空间,但由于Java可以调用本地方法,本地方法中有可能通过c语言的malloc()方法来分配内存,所以垃圾回收器会执行一次finalize()方法来调用C语言的free()方法(finalize()方法需要自己去编写代码去调用本地方法)来释放内存2.封......
  • 还在用Calendar操作Date?Java8都弃用了,还不知道它的这款强大的工具吗?
    引言在过去的Java版本中,日期和时间的处理主要依赖于java.util.Date和java.util.Calendar类,然而随着业务系统的复杂以及技术层面的提升,这些传统的日期时间类暴露出了若干显著的不足之处。随着Java8的发布,其引入了一套全新的日期时间API,彻底改变了我们处理日期和时间的方式。传统......
  • csapp读书笔记——链接
    链接链接是将各种代码和数据收集并组合成一个文件的过程,最终得到的文件可以被加载到内存执行在大型应用程序的开发过程中,我么不可能将所有的功能实现都放在一个源文件中,而是将它分解为更小、更容易管理的模块。当我们修改其中一个模块时,我们只需要重新编译这个修改后的模块,而其......
  • java8中,Arrays.sort()默认是升序的,对于基本数据类型,使其降序怎么实现
    对于引用数据类型,自定义比较器对象,实现Comparator接口/Comparable接口对于基本数据类型,自定义比较器对象,将基本数据类型转换成对应的包装类型即可但是这样写是错误的,importjava.util.Arrays;importjava.util.Comparator;publicclassSortExample{publicstatic......