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

Notes on Thinking in Java

第一章 对象导论
第二章 一切都是对象
前两章是从宏观来介绍面向对象编程相关的内容,挺有意思,可多看几遍。
笔记从第三章开始:

第三章 操作符

别名现象

赋值对象引用会发生什么
将一个对象赋值给另一个对象,实际上是将引用从一个地方复制到另一个地方。

若想保持两个对象彼此独立,不建议直接操作对象内的域。容易导致混乱,且违背了面向对象程序设计的原则。
解决方案:深克隆
https://blog.csdn.net/DeMonliuhui/article/details/54572908
https://blog.csdn.net/nishuishenhan/article/details/4693710
https://blog.csdn.net/qq_28081081/article/details/80455150

==和equals

1)对于==比较的是值是否相等

如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

intx=10;inty=10;String str1=newString("abc");String str2=newString("abc");System.out.println(x==y);// 输出trueSystem.out.println(str1==str2);// 输出false
String str1=newString("abc");String str2=newString("abc");System.out.println(str1.equals(str2));//输出trueSystem.out.println(str1==str2);//输出false

上述str1和str2都是在堆内存中创建了对象!new了

String s1="abc";String s2="abc";System.out.println(s1.equals(s2));//输出trueSystem.out.println(s1==s2);//输出true

为什么第二个会是true呢?
涉及到了内存中的常量池,常量池属于方法区的一部分,当运行到s1创建对象时,如果常量池中没有,就在常量池中创建一个对象"abc",第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。

第五章 初始化与清理

数据初始化顺序

类加载时:(静态只执行一次)

父类——静态变量
父类——静态初始化块
子类——静态变量
子类——静态初始化块
类创建时:(每次创建类执行)
父类——变量
父类——初始化块
父类——构造器
子类——变量
子类——初始化块
子类——构造器

第六章 访问权限控制

JAVA解释器运行过程(加载包过程)

首先,找出环境变量CLASSPATH,CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称(于是,package foo.bar.baz会变成foo\bar\baz或foo/bar/baz或者其他;这一切取决于操作系统)。得到的路径会与CLASSPATH中的各个不同的项相连接,解释器就在这些目录中查找与你所要创建的类名称相关的.class文件。(解释器还会去查找某些涉及java解释器所在位置的标准目录。)

private构造器

构造器私有化,谁也无法创建该类的对象,别人该怎样使用这个类呢?

1、创建一个static方法,创建一个新的对象并返回一个对它的引用。如果想在返回引用前做一些额外的工作,或者记录到底创建了多少个对象,此种做法可行。

classSundae{privateSundae(){}publicstaticSundaemakeASundae(){returnnewSundae();}}

2、单例模式singleton

classSoup2{privateSoup2(){}privatestaticSoup2 ps1=newSoup2();publicstaticSoup2access(){returnps1;}}

Soup2类的对象是作为Soup2的一个static private 成员而创建的,所以有且仅有一个,而且除非是通过public方法access(),否则是无法访问到它的。

第七章 复用类

在组合和继承之间选择

组合:想在新类中使用现有类的功能而非是它的接口(has-a)有一个

继承:使用某个现有类,并开发它的特殊版本 (is-a)是一个
到底该用组合还使用继承?
问一问自己是否需要从新类向基类进行向上转型。
如果必须向上转型,则继承是必须的;但如果不需要,则应当好好考虑自己是否需要继承。

其它:private保留“更改底层实现”的权利。然后通过protected方法来控制类的继承者的访问权限

第八章 多态

多态:编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法体,并加以调用。

1、只有非private方法才可以被覆盖
2、只有普通方法的调用可以使多态的
3、如果某个方法是静态的,它的行为就不具有多态性。(静态方法是与类,而并非单个的对象相关联的)
4、父类一个变量,子类一个同名变量不会覆盖父类的
Super sup=new Sub();
sup.field变量还是父类的,sup的普通方法是子类的

因为任何域访问操作都将由编译器解析,因此不是多态的。

http://www.jsqmd.com/news/1282325/

相关文章:

  • 哪个法硕刷题App最专业?实测5款,第一名实至名归 - 资讯在线
  • AI副业时间管理实战手册(从混乱到日入500+的7步闭环):基于2147位副业者行为数据的精准复盘
  • 高效知识吸收体系:第二周学习框架与实操指南
  • 计算机毕业设计之基于SpringBoot的贷款审批系统
  • 高性价比大型新能源SUV怎么选?从保值残值+购车权益双维度选购指南 - 资讯在线
  • Spring 事务
  • 苏州代账公司怎么选——从资质到流程的多维对照 - 资讯在线
  • cf----2019-09-01( Appending Mex,Changing Array,Candies Distribution)
  • 星巴克双赛事体育营销策略与执行全解析
  • 问题解决方案之VC++
  • 半导体抛售潮下,SK海力士股价暴跌,AI芯片上涨行情能否持续引质疑?
  • 5分钟实现网页视频自由下载:VideoDownloadHelper完整技术解析与实战指南
  • 济南名包回收哪家店出价高?成色/附件/热门款对回收价格的影响全解析 - 二奢分享官
  • 广州夏令营:军博营地专业严谨 - 17728098551
  • 物联网设备初级电池寿命延长技术与NBM7100A方案解析
  • 2026年广东口碑好的精密cnc加工工厂推荐:谁解精度痛点? - 变量人生001
  • 滨州环保设备水帘厂家哪家好?2026避坑指南:4个坑+5条硬标准,帮你绕开90%的坑 - GEO99
  • 为什么你学了AI却用不起来?揭秘普通人落地失败的3个隐形陷阱(附避坑清单)
  • 龍魂系统 · 三国谋士多维度推演报告 基于《三国志》正史数据 | 非演义美化 | 非文学滤镜
  • Plus one (66)
  • Avidemux2:开源视频编辑器的完整指南与专业技巧
  • TPIC7710EVM评估模块:汽车电子驻车制动ASIC硬件设计与GUI调试实战
  • VS静态库调用问题
  • TPIC7710评估板实战指南:从硬件解析到软件调试的完整开发流程
  • SpringBoot+Vue构建智慧图书管理系统全解析
  • 2026年广东专业的精密cnc加工源头工厂排行榜 - 变量人生001
  • 从零上手 Hermes Agent:构建可成长AI助手的完整实践指南
  • 原生js多组星级评价
  • 高性价比长续航轿车推荐 - 资讯在线
  • 如何快速找到并安装最适合的用户脚本:Greasy Fork实用指南