美文网首页
第二章 一切都是对象

第二章 一切都是对象

作者: 极客天空 | 来源:发表于2019-12-17 20:48 被阅读0次
  • 2.1 用引用操作对象

每种编程语言都有自己的操纵内存中元素的方式。你是直接操纵元素,还是用某种基于图书与否的间接表示(例如C和C++里的指针)来操作对象
拥有一个引用,并不一定需要有一个对象与它关联。因此,如果想操作一个词或句子,则可以创建一个String引用:
String s;
但这里所创建的只是引用,并不是对象。如果此时向s发送一个消息,就会返回一个运行时错误。这是因为此时s时间上没有与热河失误相关联。因此,一种安全的做法是:创建一个引用的同时便进行初始化。

  • 2.2 必须由你创建所有对象

一旦创建了一个引用,就希望它能够与一个新的对象相关联。通常用new操作符来实现这一目的。new关键字的意思是“给我一个新对象”所以前面的例子可以写成:
String s = new String(“asdf”);

  • 2.2.1 存储到什么地方
  1. 寄存器。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。
  2. 堆栈。位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序,Java系统必须知道存储在堆栈内所有项的确切的生命周期,以便上下移动指针。
  3. 堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。
    为这种灵活性必须要付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间
  4. 常量存储。常量通常直接存储在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身和其它部分隔离开,所以这种情况,可以将其存放在ROM(只读存储器)中
  5. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个例子是流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存储于磁盘上,因此,即使程序终止,他们仍可以保持自己的状态。
  • 2.2.2 特例:基本类型

不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效。Java 要确定每种基本类型所占存储空间的大小
Boolean 类型所占存储空间大小没有明确指定,仅定义为能够取字面值true或者false
基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。
高精度数字
Java 提供了两个用于高精度计算的类:BigInteger 和 BigDecimal 虽然它们大体上属于“包装器类”的范畴,但这种都没有对应的基本类型。

  • 2.2.3 Java 中的数组

Java的主要目标之一是安全性,Java 确保数组会被初始化,而且不能在它的范围之外被访问。这种范围检测,是以每个数组上少量的内存开销以及运行时的下标检查为代价的。但由此换来的是安全性和效率的提高,因为付出的代价是值得的
当穿件一个数组对象时,时间上就是黄酒了一个引用数组,并且每个引用都会自动被初始化为一个特定的值,改制拥有自己的关键字null,一旦java看到了null,就知道这个引用还没有指向某个对象。
还可以创建用来存放基本数据类型的数组,同样,编译器也能确保这种数组的初始化,因为它会将这种数组所占用的内存全部置零。

  • 2.3 永远不需要销毁对象
  • 2.3.1 作用域

大多数过程型语言都有作用域的概念,作用域决定了在其内定义的变量名的可见性和生命周期。

  • 2.3.2 对象的作用域

Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外,所以假如你采用代码

{
  String s = new String(“a string”);
}

引用s在作用域终点就消失了,然而,s指向的String对象仍继续占据内存空间。
事实证明,由new创建的对象,只要你需要,就会一直保留下去。
Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。也就是说,你根本不必担心内存回收的问题。你只需要创建对象,一旦不需要,它们就会自行消失。

  • 2.4 创建新的数据类型:类

如果一切都是对象,大多数面向对象的程序设计语言习惯用关键字class 来表示,class 这个关键字之后跟着的是新类型的名称。

  • 2.4.1 字段和方法

一旦定义了一个类( 在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(有时被称作数据成员)和方法(有时候被称作成员函数)。字段可以是任何类型的对象,可以通过其引用预期进行通信;也可以是基本类型中的一种。
每个对象都有永磊存储字段的空间,
基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值
然而上述确保初始化的方法并不适用于“局部”变量(即并发某个类的字段) 因此,如果在某个方法定义由有
Int x;
所以在使用x前,应先对其赋一个适当的值。如果忘记了这么做,Java会在编译时返回一个错误,告诉你此变量没有初始化

  • 2.5 方法、参数和返回值

Java的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。
返回类型描述的是在调用方法治好从方法返回的值。
参数列表给出了要传给方法的信息的类型和名称。
方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法。
Java中的方法只能作为类的一部分来创建。方法只能通过对象才能被调用,且这个对象必须能执行这个方法调用。

  • 2.5.1参数列表

方法的参数列表指定要传递给方法什么样的信息,正如你可能料想的那样,这些信息像Java重点 其它信息一一,采用的都是Java对象形式。因此,在参数列表中必须指定每个传递对象的类型以及名字。像Java中任何对象的场合一样,这里传递的实际上也是引用,并且引用类型必须正确。

  • 2.6 构建一个Java 程序

  • 2.6.1 名字可见性

为了给一个类库生成不会与其它名字混淆的名字,Java设计者希望程序员反过来使用自己的Internet域名,因为这样可以保证它们肯定是独一无二的。
这种机制意味着所有的文件都能够自动存活于它们自己的名字空间内,而且同一个文件内的每个类都有唯一的标识符——Java语言本身已经接近了这个问题。

  • 2.6.2 运用其他构件

这个类坑在发出调用的那个源文件中,在这种情况下,就可以直接使用这个类——即使这个类在文件的后面才会被定义
如果那个类位于其他文件中,可以使用关键字import来准确地告诉编译器你想要的类是什么,import指示编译器导入一个包、也就是一个类的库

  • 2.6.3 static 关键字

通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象,执行new来创建对象时,数据纯粹空间才被分配,其方法才公外界调动
有两种情形用上述方法是无法解决的,一种情形是,指向为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根部就不创建任何对象,另一种情形是,希望某个方法不与包含它的任何对象关联在一起,也就是说,即使没有穿件对象,也能够调用这个方法。
通过static关键字可以满足这两方面的需要,当生命一个事物是static时候,就意味着这个域或方法不予包含它的类的任何对象实例关联在一起。

相关文章

网友评论

      本文标题:第二章 一切都是对象

      本文链接:https://www.haomeiwen.com/subject/tdsenctx.html