当前位置: 首页 > news >正文

java 静态类在内存中只会有一个事例吗_Java 中的设计模式:解决一个类在内存只存在一个对象。...

最近一直在学习 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 开辟的内存是在栈内存中的 ----> 栈内存主要存放局部变量和语句中的变量,如下图:

3f939d70d723db4caebf469adfaf4ef8.png

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

2c42bcd3b165ab7de8983433141730de.png

3.当 Single 已被加载完之后,变量 “s” 是不是有个值?有 ---> 那这个值是什么?从代码中可以看到是 Single s = new Single();

所以此时 s 的值就是,new Single() 对象在堆内存中开辟的内存地址的值,而不是 new Single() 本身的值,这就说明了 s 是引用类型的变量,相当于指针哈,如下图:

79fdea81d0389958271c354242141322.png

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

ddf42814712433b764ca3ed50ef4fd79.png

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

dfc7e0b893a03772e4d3d4833f92b242.png

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

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());

}

}

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

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

相关文章:

  • eclipse中java项目泛型报错_Java泛型Eclipse编译器错误?
  • mysql-8.0.13安装教程_win10下mysql8.0.13安装配置方法图文教程
  • java的class对象_java中Class对象详解
  • java 调用 r语言_从Java里调用R – JRI的设置方法
  • java程序解释_编写并解释第一个java程序
  • java 面板作用_Java面板基础:JPanel和JScrollpane的应用区别
  • java错误_java错误
  • centos7网卡编辑_Centos7.4修改网卡为eth0
  • doubb超时_dubbo超时重试
  • java中类是什么的抽象_java 抽象类是 什么
  • java heap和stack区别_java heap和stack有什么区别
  • java字符串和json字符串区别_Json对象和Json字符串的区别
  • java没有这样的元素异常_java – 如何解决,Stale元素异常?如果元素不再附加到DOM?...
  • java测试学习_JAVA开学测试
  • java怎么实现踢掉在线用户_Java实现用户异地登陆踢人操作
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【React系列】如何构建React应用程序
  • 345-反转字符串中的元音字母
  • javascript 哈希表
  • laravel with 查询列表限制条数
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • rc-form之最单纯情况
  • vuex 笔记整理
  • 第十八天-企业应用架构模式-基本模式
  • 类orAPI - 收藏集 - 掘金
  • 力扣(LeetCode)357
  • 力扣(LeetCode)56
  • 前端自动化解决方案
  • 嵌入式文件系统
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​决定德拉瓦州地区版图的关键历史事件
  • # .NET Framework中使用命名管道进行进程间通信
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (1)(1.13) SiK无线电高级配置(六)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C++)八皇后问题
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (转) Android中ViewStub组件使用
  • (转)Oracle 9i 数据库设计指引全集(1)
  • **PHP分步表单提交思路(分页表单提交)
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @Bean, @Component, @Configuration简析
  • @EnableConfigurationProperties注解使用
  • @Transactional类内部访问失效原因详解
  • @软考考生,这份软考高分攻略你须知道
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ Linux ] git工具的基本使用(仓库的构建,提交)