对象引用和存储

Java的面向对象,一切都是在类中进行操作,而不能有独立于类之外的面向过程函数模块处理逻辑

这里操作对象也是通过引用来进行,具体基本和python一致,创建一个对象,比如用new创建的,都在Java虚拟机分配的堆空间里;创建一个引用,这里是一个变量,类型要指定,一般网上有的习惯说成是遥控器,最终将新建的对象赋值给引用变量,形象一点就是变量引用了,或者说指向了这个对象

class Person {
    String name = "lihui";
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);
    }
}

比如main里,通过new在堆里分了一片内存空间保存新创建的对象的数据和方法(这里没有),而Person person定义了一个对象引用来指向新创建的对象,或者以C语言里的理解方式,将对象地址赋给了左边的对象引用,这样想输出对象的数据的时候,最终是通过对象引用来操作对象的数据进行输出,可对比C语言里的指针操作

同理,假如要做对象引用的赋值,和python一样,其实是传递了引用,让对象引用都指向了同一个对象

class Person {
    String name = "lihui";
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        Person people = person;
        System.out.println(people.name);
    }
}

这里引用person先指向了新创建的对象,可以理解为对象的地址后来又赋给了新的引用people,从而导致person和people同时指向了这个对象,而对这个对象本身并没有任何改变,但是假如通过其中一个引用对对象进行了更改,另一个引用获取的对象信息也会相应有了变化,因为指向了同一个对象这个宗旨未改变

对于对象存储的地方,加深印象一下:

1:寄存器,这里是最快的存储区,因为它位于的地方是处理器的内部,但是寄存器的数量是优先的,所以要按需分配,但Java里寄存器是在JVM内部有用到,一般无法直接控制,C语言里可以常见到寄存器变量

2:堆栈,在通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持,堆栈指针若向下移动,则分配新的内存,若向上移动,则释放哪些内存,这种快速有效的分配存储方法,仅次于寄存器;创建程序的时候,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针,这一约束限制了程序的灵活性,所以虽然某些Java数据存储在对战中,特别是对象引用,但是Java对象并不存储于其中(这段话抄的,比较拗口,但比较具体)

3:堆,通用的内存池(也在RAM区),用于存放所有的Java对象,堆不同于堆栈的好处是编译器不需要知道存储的数据在堆里存活多长时间,因此在堆里分配存储有很大的灵活性,当需要一个对象时,只需要new创建,会自动在堆里进行存储分配,当然为这种灵活性必须要付出相应的代价,用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间

4:常量存储,常量值通常直接存放在程序代码内部,这样做事安全的,因为永远不会改变,有时候在嵌入式系统里,常量本身会和其他部分分隔离开,所以在这种情况下,可以选择存放在ROM(只读存储器)中

5:非RAM存储,如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在,两个基本例子就是流对象和持久化对象;在流对象里,对象转化成字节流,通常被发送给另一台机器,在持久化对象里,对象被存放在磁盘上,因此,即使程序终止,它们仍可以保持自己的状态,这种存储方式的技巧在于,把对象转化成可以存放在其他媒介上的事物,在需要时,可以恢复成常规的,基于RAM的对象,Java提供了对轻量级持久化的支持,而诸如JDBC和Hibernate这样的机制提供了更加复杂的对在数据库中存储和读取对象信息的支持

好吧,第五条敲着都看晕了~!

发表回复