第二章.一切都是对象

来源:互联网 发布:桐乡淘宝客服招聘信息 编辑:程序博客网 时间:2024/06/14 20:19

1.关于对象的存储位置:

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

(1)寄存器。毫无疑问,因为处于处理器的内部,所以寄存器是最快的存储区。寄存器的数量有限,而且也无法直接控制,只能按需分配;

(2)堆栈。堆栈位于随机访问存储器(RAM)中,可以通过堆栈指针对内存分配进行控制,指针向下移动是分配新的内存,向上移动则释放那些内存。堆栈的优点是:堆栈区是除寄存器外最快的存储区。缺点是:在java中,必须得知道在存储在堆栈中的所有项的生命周期,才能对指针进行移动,限制了程序的灵活性。

(3)堆。堆是一种内存池。堆相较于堆栈的优点在于:在用堆进行存储的时候,无需知晓存储在堆内的所有项的生命周期,程序的灵活性得到扩展。但同样的,这是以牺牲掉部分速度完成的,堆栈进行内存的分配时要比堆进行内存分配少花一些时间。大部分的java对象都放在堆里面。

(4)常量存储。常量通常直接存放在程序代码内部,放在只读存储器(ROM)中。

(5)非RAM存储。这种情况下,数据完全存活在代码之外,可以不受程序的任何控制,即使程序停止也可以存在。这种数据对象的经典例子为流对象和可持久化对象,可以看出,在代码中,流对象和可持久化对象都是处于一个与外界(这里的外界指磁盘存储或者实际数据库存储)交互的位置。这种存储方式的特点在于:将对象转换在其他媒介上的事物,在需要时恢复成为RAM式存储。

2.基本类型

2.1

关于对象的创建:普通对象的创建使用NEW关键字创建,new关键字创建出来的对象都被存储在堆中,而基本类型的创建通过创建一个并非引用的“自动变量”,直接存储“值”,这样创建的对象是存储在堆栈里的。

总的来说:

使用new关键字创建的对象存放在“堆”中,例如User user = new User(),而直接创建一个“自动变量”进行值的存储的对象存放在“堆栈”中,例如String str =“”。

[xb21cn1] 2.2非基本类型的BigDecimal与BigInteger

BigDecimal支持任意精度的定点数,可用于精确的货币计算等。BigInteger支持任意精度的整数,可以准确地表示任意大小的整数。[xb21cn2] 

 

2.3Java的数组

(Java的一个主要目标就是安全性)基于对C与C++关于数组的使用风险的考虑,Java的数组在创建后会进行初始化,与C++相比会牺牲些许效率对数组进行一次检查(确定初始化且不会在数组的范围外进行访问),提高安全性。

Java的数组创建时实际上是创建了一个引用数组,如果在初始化时没有给定确定的值,这个引用数组将会指向null,意为这个数组并未指向任何对象。在引用数组指向null时如果强行使用会出错。(在使用任何引用前都必须为其指定一个对象

ArrayList<Object>stringList = newArrayList<>();

ArrayList<String>strings = null;

String str = "string";

stringList.add(str);

strings.add(str);

如代码所示:通过两种方式创建的arraylist,其中stringList指向了一个实际的ArrayList对象,而strings这个“引用数组”并未指向任何对象,所以在下面调用add方法时,报出了java.lang.NullPointerException错误。

3.对象的销毁(“坏人”Java来做)

在Java语言中,我们可以庆幸这一点,对象,变量的销毁Java已经替我们做了。下面介绍它是如何做的。

3.1作用域(scope)的概念

在C,C++和Java中,作用域都是由花括号{}来划分的,一个花括号内部就是一个作用域,在作用域中创建的变量会在作用域结束时自动销毁(仅限于基本类型),也就是说在当前作用域中创建的变量只能应用于当前作用域中。

与基本类型不同,java对象在作用域结束时并不会销毁,准确来说,当在某一作用域中用new创建一个Java对象时,它可以存活在该作用域之外。[xb21cn3] 

{String str =new String()}    如代码所示,引用对象str在作用域结束时就已经消失了,但它所指向的String对象却始终存在内存中,但我们无法在这个作用域外访问这个对象。

事实证明:由new创建的对象,只要你需要就能一直的保留下去。

这时便会出现这样的一个疑问:既然由new创建的对象可以一直地保留下去,那么总有一天内存中会被遗留下来的对象“填充”满,这个问题怎么解决?解决方法已经由Java给出了,Java内部存在一个“垃圾回收器”用于监控用new创建的所有对象,并会进行辨别哪些再也不会被引用的对象,然后将其销毁,释放其所占的内存空间给新的对象使用。比如我们上文代码中的str指向的String对象,在垃圾回收器监控到该对象不会再被使用时,就会将该String对象销毁。

4.类的创建与方法的创建

      在Java中所做的全部工作就是:创建类,产生各种类的对象,并向这些对象发送消息。类(class)中总得来说包括两个成员:字段和方法。其中字段是组成这个类的基本的东西,除可以存储数据外也可以作为引用的对象使用。而方法就是向这些对象发送消息的方式。

      当一个基本数据类型的变量作为类的字段时,该变量会自动初始化为默认的值。但这只是在类中,在方法中如果创建一个基本数据类型变量却未给定初始化的值,该变量将不会自动初始化,在编译时会报出“参数未初始化”这样的错误。

      方法的基本组成部分为:名称,参数列表,返回值,方法体。名称与参数列表可唯一标示某一方法。参数列表中的参数也是通过对象形式传输的。

      关于Return关键字,若返回类型为voidreturn关键字的作用只是退出方法。若返回类型为其他类型时,return关键字将强制返回一个正确类型的返回值。

      程序的理解:程序似乎只是一系列带有方法的对象的组合,这些方法以其他对象为参数,发送消息给其他参数。

5.Java程序的创建

5.1名字的可见性与其他构件的运用

      Java设计者希望能够将自己的Internet域名反过来使用。其他构件的运用,即就是传统意义上的“导包”,可以使用import关键字完成。

5.2 static关键字是什么?

      当创建类时,就是在描述该类的外观及行为。只有用new创建这个类的对象,数据存储空间才被分配,其方法才被调用,否则这个对象根本不存在!

      static关键字可以在两种情形下使用:(1)只想为特定域分配存储空间。     (2)希望某个方法在没有创建对象的情况下,也能够被调用。当声明一个事物是static时,就意味着这个域或方法不再与包含它的那个类中的其他对象有任何的关联,可以不通过该类的对象直接调用该方法。

      对于static方法,不能简单地通过调用其他非static域或方法而没有指定某个命名对象,来直接访问非static域或方法。[xb21cn4] 

static作用于字段时,一个static字段对每个类来说只有一份存储空间,“一荣俱荣,一损俱损”,而对于非static字段来说,每个字段对应每个类都有一份存储空间。可以这么理解,创建两个类:

      public class user1{ static string userName;}

      public class user2{ string userName; }

其中user1中的userName拥有一份存储空间。而user2中的userName是通过创建类的对象才会生成,对于每一个对象,都有一个各自唯一的userName,在改变某一对象的userName时,其他对象的该值不受影响。

      static作用于方法时,改变的只是可以不通过类的对象进行调用该方法。

 

 

 

原创粉丝点击