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

第二章 一切都是对象(Java对象)

作者: WandaGao | 来源:发表于2018-07-03 15:21 被阅读0次

    如果我们说另一种不同的语言,我们会发现另一个不同的世界

    2.1 用引用来操作对象

    每个语言都有自己操纵内存元素的方式 

    在c c++中程序猿使用指针来来操作内存中的对象  

    而java中使用引用来操作对象  但是引用并不是对象 而是指向对象 

    对象是电视 那么 引用就是遥控器  我们可以通过遥控器来控制电视 同样java中我们可以通过引用来控制对象

    电视 和 遥控器 都可以独立存在  所以你拥有一个引用并不代表 要有一个对象与之管理

    例如 String  A ; 我们只创建了一个引用  由于他没有对象无法通过 向A发送消息执任何行为 如果我们这么做就会收到错误提示

    2.2 必须由你来创建对象

    java 中使用 new 字来创建新对象

    String a = new String(“sdfsdf”);  //这种状态下引用和对象进行了关联  事实上 java 创建了引用就应该让引用于对象关联,即初始化引用

    对象在内存中的存储

    1.寄存器:最快的存储区域 位于CPU内部,空间有限,按照需求进行存储,我们无法控制,在程序运行时无法感知到它的存在。

    2.堆栈:位于RAM(随机访问存储器)中,通过堆栈指针可以从处理器那里获得直接支持。堆栈指针向下移动则分配新的内存,向上移动则释放这些内存。这是一种快速有效的分配存储,效率仅次于寄存器。但是在程序执行时,必须严格的知堆栈站内所有对象的生命周期,以来控制堆栈指针的移动,以便维护堆栈控制对象资源的释放(c c++ 使用该策略执行进行资源的控制).... java为了程序的灵活性,放弃了该做法,在java中堆栈用来存储对象的引用 并不存放对象

    3.堆:位于RAM中,一种通用的内存池,用于存放所有的java对象。堆的好处在于:编译器不需要知道存储的数据在堆里的生命周期,因此,在堆分配存储具有很强的灵活性。需要创建对象只需要new 关键字就能在堆里面进行存储分配  缺点:存储和分配,清理的速度较慢相对于堆栈存储(GC负责清理对象资源)

    4.常量存储:常量值直接放在程序代码内部。 因为他永远不会改变...有时在嵌入式系统中,常量本身会与其他部分分离,所以在这种情况下,可以选择存放在ROM中(比如常量池)

    5.非RAM存储: 流对象 持久化  数据库啥的

    2.2.2 基本类型

    bit 位   byte 字节(B)  1请记住好吗 java中的基本标量的 位数

    对于基本类型 java使用的不是new出对象放在堆里 而是 学习c c++相同的方法 创建一个非引用的"自动常量",这个常量直接存储“值”,并置于堆栈中,因此更加高效

    基本类型具有包装类  使得可以在堆中创建一个非基本对象 ,来表示基本类型 

    char c = “x”;

    Character ch = new  Character(“x”);

    ch = “x”   //自动装箱

    c = ch //自动拆箱

    高精度数字

    Java提过两个用于计算高精度的了: BigInteger 和 BigDecimal  类似包装类 但没有对应的基本类型

    BigInteger : 支持任意精度的整数

    BigDecimal:支持任意精度的定点数

    2.2.3 Java中的数组

    java中创建一个数组就相当于创建了一个引用数组,并且每个引用都指向了null

    2.3永远不需要销毁对象

    2.3.1 作用域

    在作用域里定义的对象只可作用于作用域结束之前  {    <-----scope----->       }

    2.3.2对象的作用域

    对象的作用域与基本类型不同   

    {

               String s = new String(“123”);

    }//End of scope

    引用s在作用域终点就消失了,然而 对象 String(“123”)任然在堆中占据空间,我们无法在作用域之后访问该对象,因为它已经超出了作用域的范围。

    2.4 创建新的数据类型:类

    关键字 class + 类名 {   }

    2.4.1字段和方法

    这里注意 在类中 定义的 字段中如果是 基本类型 java会默认为基本类型赋值

    基本类型赋值

    但是在方法中 int x  是不会被默认赋值的

    2.5 方法 参数和返回值

    java的方法决定了一个对象可以接收什么样的信息  

    方法基本包括 名称 参数 返回值 方法体

    void  main(String[ ]  arg){     修饰符 + 返回值 + 名字 + ()+参数 +{ }

                A   a = new A();

                a.f();  // 调用方法的行为我们一般称为 发消失给对象

    }

    2.5.1 参数列表

    int getLength (String s ){

           return s.length() ;

    }

    事实上在传递对象参数时 我们传递的是 对象的引用 因为 引用指向对象 所以可以控制对象

    在java中对象的传递其实 就是对象引用的传递

    这里 我想强调的是 基本类型(除String外) 传递的不是引用 而是指

    2.6 构建一个java程序

    2.6.1 名字空间 又名 命名空间  

    标识类的位置 同时也起到区分的作用  所以即使是同类名在java中只要包名不同 就无所谓了

    使用import 来准确的表示导入那个包,即类库

    如果我们在 在 import 后面加*  则表示我们导入改包下的所有类资源

    2.6.2 static

    当创建类时 就是在描述这个类的外观与行为 java中使用 new 来创建对象,数据空间才会被分配

    这样有两个问题需要解决:1. 我只想在的定区域分配一个存储空间,而不想要创建多少对象

    2.我不想使用对象就调用某些类的行为,我希望这个行为和对象没有关系

    static 出现就是解决这类问题 

    static 方法或域  不予对象关联 而是与包含他的类相关联

    使用 : 直接将static放在 类前面做修饰即可

    例如   class Test {

    static  int   k =0;

    }

    这个情况下 及时你创建了 连个 Test 对象 

    Test.i 也独享一份存储空间

    两个对象共享一个 i

    同样的静态方法也适用 :

    class Incrementable{

              static  void  increment (){

                               xxxx;

                 } 

    }

    Incrementable.increment()  类名.方法名

    当使用static 修饰某个字段时 , 那么这个字段的创建方式就发生了改变,

    static字段对于每个对象都是只有一份存储空间,而非static字段 每个对象都有各自不同的存储空间

    但是 static 修饰的方法 差异性却没有那么大

    2.7 你的第一个java程序

    java.lang 是默认导入在每个类中的

    暂时结束

    相关文章

      网友评论

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

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