当前位置:首页 > Java技术 > Java编程思想学习笔记(四)

Java编程思想学习笔记(四)

2022年11月09日 09:23:16Java技术14

第二章 一切都是对象

2.1用引用操纵对象

每种语言都有各自的操纵内存中元素的方式,直接操纵元素或者使用简介表示来操纵(c、c++中的指针)。但是Java中,由于一切事物都被视作对象,所以可以使用固定单一的语法来实现。操纵的标识符实际上是对象的一个引用(reference),就好比使用遥控器来操纵电视机一样,遥控器就是电视机的一个引用,当然,就算没有了电视机,遥控器也可以单独存在,这也就是说,引用并不一定要有一个对象和他相关联

String s;

假设我们想操纵一个词或者句子,那么可以像上述代码创建一个String类型的引用,这里创建的只是引用,并不是实际的对象,这个时候向s传递一个消息,就会抛出一个运行时错误。所以安全的做法是,在创建这个引用的同时就对其初始化:

String s = "abcd";

2.2必须由你创建所有对象

创建一个引用之后,通常使用new关键字来使其与一个对象关联,new关键字的意思是“给我一个新对象”,前面的例子可以写作:

String s = new String("abcd");

(1)存储到什么地方?

  程序运行时,有五个地方可以存放数据:

  a.寄存器:最快的存储区(因为寄存器在处理器的内部),也是因为其位置,寄存器的存储容量非常有限,Java无法在程序中感觉到寄存器存在的任何迹象,他根据需求进行分配(c、c++允许程序员向编译器建议寄存器分配方式);

  b.堆栈:位于RAM(随机访问存储器)中,通过堆栈指针可以从处理器获得直接支持(可以直接根据堆栈指针进行快速的寻址),速度仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈中的所有项的确切生命周期,以便于之后堆栈指针的上下移动,这种方式限制了程序的灵活性,尤其是对象引用的灵活性,所以Java的对象不存储于堆栈中

  c.堆:一种通用的内存池(也位于RAM区),用于存放所有的Java对象,堆中的数据,编译器不需要知道生命周期为何(因为堆相较于堆栈是一种比较灵活的数据结构,所以堆空间的分配具有很大的灵活性),相应的,堆的存储分配和垃圾清理也需要比堆栈更多的时间;

  d.常量存储:直接放在代码的内部,这样做是安全的,永远不会被改变,常用于嵌入式开发中,常量会和其他部分隔开,存放于ROM中;

  e.非RAM存储:若数据完全存在于程序之外,那么他就可以完全不受程序的任何控制,在程序不运行时也可以存在,经典的例子是流对象持久化对象

  流对象,对象转化为字节流,通常被发送给另一台机器;

  持久化对象,被存放于磁盘上(数据库交互中的持久化就是指将程序中的数据转化为数据库中的持久化对象),在程序终止之后,数据还是可以保持自己的状态;

  这两种方式的共同点都是将对象转化成可以存储在其他媒介上的事物,在需要时,还是可以转化回常规的、基于RAM的对象。Java提供了轻量级的持久化支持,JDBC等机制提供了更复杂的与数据库进行交互的支持。

(2)特例:

  基本类型:

  在Java中,基本类型的对象需要被特殊对待,new创建的对象被存储于堆中,但是对于一些小的、简单的、基础的类型的对象,Java采用和C、C++相同的处理方法,也即不用new关键字,而是创建一个并非是引用的“自动”变量,这个变量直接存储值,并且直接存储于堆栈中

  Java确定每种基本类型所占存储空间的大小,并且不随机器硬件架构的变化而变化,这也赋予了Java更强的可移植性。 

Java编程思想学习笔记(四) _ JavaClub全栈架构师技术笔记

 

   基本类型具有的包装器类,使得我们可以在堆中创建一个非基本对象,用于表示对应的基本类型:

char c = 'x';
Character ch = new Character(c);

上述代码,第一行是创建在堆栈中的基本类型对象,第二行是使用其包装器类在中创建的对象。

Character ch = 'x';//Java SE5自动包装功能可以自动将基本类型转化为包装器类型
char c = ch;//可以实现反向转换

  高精度数字:

  Java提供的用于高精度计算的类:BigInteger(任意精度整数)、BigDecimal(任意精度浮点数),这二者属于包装器类范畴,但是没有对应的基本类型

  作用于int和float的操作,也能实现于这二者,只不过是调用相应的方法,而不是使用符号。

(3)Java中的数组

  大部分程序设计语言都需要数组,但是在c或者c++中使用数组是危险的,因为c、c++的数组就是内存块,在一个程序要访问自身内存块之外的数组,或者数组初始化之前使用内存时,都会产生难以预料的后果。

  安全性是Java的主要目标之一,Java确保数组会被初始化,并且不能在范围之外访问。这种范围检查,是以每个数组上少量内存开销及运行时的下标检查为代价实现的。

  创建一个数组对象时,实际上是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值有自己的关键字null,Java看到null,就知道这个引用还没有指向某个确切的对象。在使用任何引用前,必须为其指定一个对象,所以使用值为null的引用会在运行时报错。

  创建内容为基本类型的数组时,编译器也会自动进行初始化,具体是将这种数组所占的内存全部置零

2.3永远不需要销毁对象~

(1)作用域

  大多数过程型语言都有作用域(scope)的概念,作用域决定了变量的可见性和生命周期,c和c++中,作用域由花括号决定。

  但是Java是一种自由格式的语言,故缩进只是便于阅读,并不会对执行结果产生影响。

{
  int x = 12;
  {
     int x = 96;   
   }    
}    

  上述代码在c和c++中是合法的,但是在Java中非法,编译器会提示变量x已经定义过,Java设计者认为这种方式是将较大作用域变量隐藏起来的做法,会导致程序的混乱。

(2)对象的作用域

  Java的对象不具备和基本类型一样的生命周期,使用new关键字创建一个对象时,他可以存活于作用域之外:

{
    String s = new String("ababab");
}

  引用s在作用域的终点会消失,但是s指向的String对象仍然占据着内存空间,我们无法在这个作用域结束之后再访问这个对象,因为它唯一的引用已经超出了作用域的范围。

  由new关键字创建的对象,只要你需要,就会一直保留下去,这样就不会涉及到对象的销毁问题。但是这也带来了一个新的问题,如果对象会持续存在,那么怎么防止这些对象占满内存空间,进而阻塞程序的运行呢?Java给出的解决方案是垃圾回收器,垃圾回收器用于监督由new关键字创建的所有对象,并且辨别其中不会再被引用的对象,随后将这些对象的内存空间释放,供其他对象使用。

 

2021.2.1 晚 上传

读到P58

 

作者:aLieb
来源链接:https://www.cnblogs.com/aLieb/p/14358972.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68753.html

分享给朋友:

“Java编程思想学习笔记(四)” 的相关文章

Java空指针异常解决java.lang.NullPointerException解决心得

Java空指针异常解决java.lang.NullPointerException解决心得

今天做课设的时候运行程序报出以下错误 java.lang.NullPointerException 首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。 是由于某个参数(集合,数组等数据)可能出现一个null值而导致后面的程序不能运行时...

Java中四种访问修饰符的区别

在java中共有4种访问级别,按访问权限由高到低为:public(公有的)、protected(受保护的)、友好的(没有任何访问权限关键字修饰)和private(私有的)。 类型 类内部 同一个包其...

java之整数的分解可以理解为倒序输出

Scanner in=new Scanner(System.in); int number ; number=in.nextInt(); int result=0; do{ int diget=number%10;...

二分法(折半查找)的运用之java实现猜数字游戏

让计算机输入一个数 然后用户进行猜数游戏 一般而言,七次会猜对,如果猜不对,那么就是你的方法不对 在这儿涉及到的一个算法就是二分法 ***二分法查找,***也称为折半法,是一种在有序数组中查找特定元素的搜索算法。二分法查找的思路如下: (1)首先,从数组...

java计数循环及小技巧

要运行一个很大次数的循环应该选择一个小数,然后去判断 例如本例子是100可以选择10去判断 public static void main(String[] args) { // TODO Auto-generated metho...

Java开发手册精华总结

Java开发手册精华总结

阿里 Java 开发手册的思考总结 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。 -- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelCase 风格,比如 DO/BO/VO...

Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 上一篇总结了下ArrayList 、LinkedList和Vector比较,今天泥瓦匠总结下Hash 、LinkedList和Vector比较。其实大家都是...

java空指针异常:java.lang.NullPointException

一.什么是java空指针异常     我们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,我们不在这里讨论叫指针究竟合不合适,而只是针对这个异常本身进行分析。空指针就是空引用,java空指针异常就是引用本身为空,却调用了方...

【JAVA】浅谈java枚举类

【JAVA】浅谈java枚举类

一、什么情况下使用枚举类?   有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二、为什么不用静态常量来替代枚举类呢? public static final int SEASON_SPRING = 1; publi...

实现一个Java五子棋

实现一个Java五子棋

五子棋手把手教你写: 写在前面的话: 回想起从前初学代码的五子棋简直写的不像样子。今天闲来无事就写了个五子棋的小程序。 如果有需要可以从github上下载:github地址:https://github.com/GodofOrange/gobang.git 一来...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。