新手区 Java 中的设计模式:解决一个类在内存只存在一个对象。

凡旺 · 2015年02月06日 · 最后由 Archer 回复于 2015年02月07日 · 1439 次阅读

最近一直在学习 java 的面向对象这块,有关于关键字 static、this、构造函数、构造代码块、静态代码块之类的。这些东东一开始看的时候那是槽糕的要死,看着代码一会就晕晕的,目前使用一个例子,来说明下我对对象中的调用,其对象在内存中的分配方式的了解,和最近一段时间的感悟吧。

Java 中设计模式 ---> 单例设计模式:就是为了解决一个类在内存中,只有一个对象的解决方案。

需求:大家可以先想想,如何才能实现一个类在内存中只有一个对象的存在呢?

一、思路:
1、这个就涉及到了构成函数的概念,我们只要将类中的构造函数私有化即可实现----> 私有化构造函数之后即禁止了此类被创建对象。
2、既然不能在其他的类中创建此类的对象,又要保证对象的存在,只能在本类中创建一个对象---> 显示内存中只有一个对象的存在
3、一个类的创建是需要提供给其他人使用的,所以此类需要提供一个方法,以供其他类的访问 ---> 提供方法方便其他人来访问

二、代码:
1、使用 private 是有构造函数
2、在此类的内部创建对象
3、提供方法方便其他人来访问

代码如下:

class Single
{


    private  Single(){}//构造函数私有化

    private static Single s = new Single();//创建对象

    public static  Single getInstance() //提供对外访问的方法
    {
        return s;
    }
}

class SingleDemo 
{
    public static void main(String[] args) 
    {
        Single s1 = Single.getInstance();

    }
}

三、以上代码在内存中的分配方式

1、代码要先执行,需要找到主函数的入口,上面的代码中主函数中有一句:Single s1 =Single.getInstance();
读取 Single s1 的时候,就会在内存中创建一个空间,用于存放类类型的变量 s1,这里先说下,Java 在内存有有 3 个分配区域:
1:栈内存、2:堆内存、3:方法区

而此时 Main 开辟的内存是在栈内存中的 ----> 栈内存主要存放局部变量和语句中的变量,如下图:

2、读取右边时,single 类此时就会被加载,那么在方法区中就有了 Single 类的空间,首先在 Single 类空间中有了 “s” 变量和 getInstance() 方法;如图:

3.当 Single 已被加载完之后,变量 “s” 是不是有个值?有 ---> 那这个值是什么?从代码中可以看到是 Single s = new Single();
所以此时 s 的值就是,new Single() 对象在堆内存中开辟的内存地址的值,而不是 new Single() 本身的值,这就说明了 s 是引用类型的变量,相当于指针哈,如下图:

4、接下来,当我们去调用 getInstance() 方法的时候,这个方法就会被执行,这里面没有局部变量和 this(因为是静态的),这个方法执行的时候,返回变量 “s”, 返回的 “s” 的值赋值给了主函数中的 “s1”,所以此时主函数中的 s1,也指向了堆内存中的对象。

5、通过以上的说明,目前可以在写一句代码 Single s2 = Single.getInstance(); 主函数又会产生一个变量 s2,但此时依然指向与 s1 同一个对象,发现别的类在使用我这个类的时候,不管怎么用.内存中只有这一个对象,其他的类是不能建立对象的,因为构造函数已被私有化啦,这样就保证了一个类在内存当中对象的唯一性

目前为止以上的代码在内存中的调用分配方式都已说的差不多啦,不知道大家理解了没有,咱们来看看下面的一个小练习吧

class Student
{
    private Student(){}
    private static Student s = new Student();
    public static Student getStudent()
    {
        return s;
    }
    private int age;
    public void setAge(int age)
    {
        this.age=age;
    }
    public int getAge()
    {
        return age;
    }

}
class StudentDemo
{
    public static void main(String[] args)
    {
        Student s1=Student.getStudent();
        Student s2=Student.getStudent();
        s1.setAge(26);
        System.out.println(s2.getAge());
    }
}

以上代码请问输出的结果是什么?内存中共存在几个对象?那么此对象共被哪些变量所指引哈~~~~~

共同学习~~仅供参考,多多指教

共收到 4 条回复 时间 点赞

看完以后,我觉得我没学过 java

看完以后,我觉得我对不起编程

看完以后,我觉得我压根就没学会设计模式。用过 singleton,但没试过探究到内存这么深入。赞一个

很赞,做技术的就要往下深挖,能收获很多意想不到的东西。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册