Java编程思想(二、一切都是对象)

  每种编程语言都有自己的操纵内存中元素的方式。在java中,一切被视为对象。操纵的标识符实际上都是对象的一个“引用”(reference)。就像是遥控器(引用)来操纵电视机(对象)。

  1.用引用操作对象。拥有一个引用的同时,并不一定需要有一个对象与它关联。因此,如果想操作一个词或句子,则可以创建一个String引用。

String s;//这里创建的只是引用,并不是对象。如果此时给S发送消息,就会返回一个运行时的错误。因为此时s并没有与任何事物相关联。
String s=“adad”;//这是一种安全的写法。不过大部分的时候问题不大,如果你只是创建了一个引用,然后在后面的语句中使用到了String。编译器会提示你这个错误(not have been initialized);

  2.必须由你创建所有对象。一旦创建引用时,就希望它能与一个新的对象相关联。通常使用new操作符来实现这一目的。new关键字的意思是“给我一个新对象”。所以上文提到的

String s="adad";String s=new String("adad");//这个和上面的例子是一样的。它不仅表示了“给我一个新的字符串”。而且通过提供一个初始字符串,给出了怎样产生这个Sting的信息。

  3.对象存储到什么地方。在内存管理方面,涉及到底层实现的,需要谨记。这能更好地帮助自己理解java这门语言。

    1)寄存器。这是最快的存储区。位于处理器的内部。但内存容量小,根据需求进行分配。。程序员是不能直接控制的,没法在程序上写出将这部分对象存到寄存器中类似的语句。(但在C和C++中是可以向编译器建议寄存器的分配方式的)

    2)堆栈。位于RAM中。但在创建程序时,java系统必须知道存储在堆栈内所有项的生命周期,以便上下移动堆栈指针。但这约束限制了程序的灵活性。所以虽然某些java数据存在堆栈中---特别是对象引用。但是java对象并不存储在其中。  

    3)堆。一种通用的内存池(也在RAM中)。用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配有很大的灵活性。当new一个对象的时候,会自动在堆里进行存储分配。当用堆进行存储分配和清理可能会比堆栈进行存储分配需要更多的时间。

    4)常量存储。常量值通常直接存放在程序代码内部。比如int a=10;

    5)非RAM存储。一个是流对象,另一个是持久化对象。在流对象中,对象转化为字节流,通常被发送给另一台机器。在“持久化对象中”,对象被存放于磁盘中。

   特例:基本类型 不用new来创建变量。而是创建一个并非是引用的“自动”变量。这变量直接存储“值“,并置于堆栈中(就是把变量的值保存在堆栈中,在java语言中,我们知道堆栈中保存了引用,指向了堆中的具体对象)。包装类型,将基本类型包装起来,使得具有对象的性质。在java中很多时候需要这个对象的性质(毕竟是面向对象的语言)。比如在泛型的使用上。List<>这类的容器中。是只能存放对象的,像int这些基本类型是没有办法放进去的。必须转为Integer才行。

     4、java中数组。不同于C与C++。数组越界,java会在运行时报错。java会确保数组会被初始化,而且不能在它的范围之外被访问。这种范围检查,是以每个数组上的少量的内存开销及运行时的下标检查为代价的。当创建一个数组时,实际上是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦java发现null,就知道这个引用还没有指向某个对象。在使用任何引用之前,必须为其指定一个对象。如果试图使用还是一个null的引用,在运行时将会报错。

  5、作用域。大多数的过程型语言都有作用域的概念。作用域决定了在其定义的变量名的可见性和生命周期。在作用域里面定义的变量只可用于作用域结束之前。在对象的作用域中,java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。

{
  String s=new String(”dadas“);  
}//end  引用s在作用域终点就消失了。但是,s指向的String对象仍继续占据内存空间。                                                                      

  事实证明,由new创建的对象,只要你需要,它就会一直保留下去。Java的垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间。

   6、新的数据类型:类。一旦定义了一个类。(在java中所做的全部工作,就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素,字段和方法。字段可以是任何类型的对象,可以通过其引用与其进行通信,也可以是基本类型中的一种。如果是字段对某个对象的引用。那么必须初始化该引用,以便使其与一个实际的对象相关联。若类的某个成员是基本数据类型,即使没有进行初始化,java也会确保它获得一个默认值。但这个初始化并不适用于“局部”变量。因此,如果在某个方法定义中有int X;那么变量X得到的可能是任意值。(但似乎我现在并不能模拟出这个情况。java的编译器会在编译时返回一个错误,无法得到所说的那个任意值,不过我们都知道如果内存没初始化的时候,其里面的值一定是任意的或是上次使用过的,事实情况任意值应当是存在的,但是没法直接看到)

     7、方法、参数和返回值。方法的基本组成部分包括:名称、参数、返回值、方法体。方法名和参数列表(合起来称呼为“方法签名”)唯一地标识出某个方法。在java中,方法只能作为类的一部分来创建。方法只有通过对象菜才能被调用,且这个对象必须能执行这个方法调用。如果试图在某个对象上调用它并不具备的方法,在编译的时候就会报错。

    参数列表。在参数列表中必须指定每个所传递对象的类型及名字。这里面所传递的实际上也是引用,并且引用的类型必须正确。

    return关键字。代表“做完此方法,离开此方法”。

  8、构建Java程序。通常来说,当创建类时,就是在描述那个类的对象的外观与行为,除非用new创建那个类的对象,否则,实际上并未获得任何对象。当执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。

    static:当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。通常,必须创建一个对象,并用它来访问数据或方法。因为非static域和方法必须知道它们一起运作的特定对象。 static作用于某个字段时,肯定会改变数据创建的方式(因为一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象都有一个存储空间)。但static作用于方法时,差别就没有这么大了。static 方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。这一点对定义main()方法很重要,这个方法是运行一个应用时的入口点。

posted @ 2017-12-05 15:18  渣渣R  阅读(409)  评论(0编辑  收藏  举报