Java核⼼技术-读书笔记
基本语法
Java中的所有函数都属于某个类的⽅法
Java没有任何⽆符号的int、long、short 或 byte 类型
浮点数值不适⽤于⽆法接受舍⼊误差的⾦融计算中,⽐如2.0-1.1不会输出想要的0.9,如果不允许有任何舍⼊误差,应该使⽤BigDecimal类
建议不要在程序中使⽤char类型,除⾮确实需要处理UTF-16的代码单元,最好将字符串作为抽象数据类型处理
boolean类型:整数和布尔值之间不能相互转换
利⽤final指⽰常量,只能赋值⼀次,⼀旦被赋值后,就不能更改了
类常量:希望某个常量可以在⼀个类中的多个⽅法中使⽤,⽤ static final 设置,如果⼀个常量被声明为 public 那么其他类⽅法也可以使⽤这个常量,const是java的保留关键词,但并没有使⽤
操作符:>>>运算符会⽤0填充⾼位,这与>>不同,它会⽤符号位填充⾼位,不存在<<<;运算符
字符串:String.subtring,+,String.join等等
String类没有提供⽤于修改字符串的⽅法,不能修改Java字符串中的字符,可以提取⼦串后拼接,String不可变,StringBuilder可变
⼀定不要使⽤==运算符检测两个字符串是否相等,它只能判断两个字符串是否在放置在同⼀个位置上,可以⽤equals或compareTo
空串是长度为0的字符串,是⼀个java对象,null则不是
⽐C++多了带标签的break: ⽬的是跳出嵌套的深层循环,标签必须放在希望跳出的最外层循环之前,并紧跟⼀个冒号,通过执⾏带标签的break跳转到带标签语句块的末尾,if语句也同样使⽤,但不能跳⼊语句块,只能跳出
Java没有提供运算符重载的功能,除了字符串拼接的 +
java.math包中的BigInteger和BigDecimal类可以处理包含任意长度数字序列的数值,实现了任意精度的整数和浮点数运算
数组:将⼀个数组变量拷贝给另⼀个数组变量,两个变量将引⽤同⼀个数组
int[] a = b;
a[5] = 12; // now b[5] is also 12
如果希望将⼀个数组的所有值拷贝到另⼀个新的数组中,需要使⽤Arrays类的copyOf⽅法
OOP
算法+数据结构 = 程序
java核心技术有哪些⾯向过程往往先考虑算法实现,然后考虑数据存储
⾯向对象是相反的过程,将数据放在第⼀位,才考虑操作数据的算法
⾯对⼀个需求,先从设计类开始,然后再往类中添加⽅法。识别类的简单规则是在分析问题中寻名词(属性),寻动词(⽅法)
类之间的关系:
  依赖(uses-a):⼀个类的⽅法操纵另⼀个类的对象
  聚合(has-a):类A的对象包含类B的对象
  继承(is-a):类B继承类A的属性和⽅法
任何对象变量的值都是对存储在另外⼀个地⽅的⼀个对象的引⽤
只访问对象⽽不修改对象的⽅法称为访问器⽅法,修改则称更改器⽅法
不要编写返回可变对象的访问器⽅法,这样会导致破坏该对象私有数据的封装性,导致在类外发⽣⾃由修改。应该⽤clone返回⼀个拷贝
函数参数:Java总是采⽤按值调⽤,⽅法得到的是所有参数值得⼀个拷贝(值的拷贝,对象引⽤的拷贝[引⽤同⼀个对象])
参数⼀般分为(1)基本数据类型(数值、布尔),(2)对象引⽤。⼀般第⼀种类型实现的值传递,第⼆种实现所谓的"引⽤传递",实际还是值传递
1. ⼀个⽅法不能修改⼀个基本数据类型的参数
2. ⼀个⽅法可以改变⼀个对象参数的状态
3. ⼀个⽅法不能让对象参数引⽤⼀个新的对象(swap中只是swap了对象引⽤的拷贝,实参引⽤并没有交换,因为实质上还是值传递)
相⽐C++,Java没有构造初始化列表来初始化对象,⽽多了可以在类定义中,直接将⼀个值赋给任何属性,或调⽤函数进⾏初始化
相⽐C++,Java可以⽤this(...)的形式在构造函数中调⽤同⼀个类的另⼀个构造函数,C++不⾏
多了⼀种初始化块的⽅式来构造对象,⾸先运⾏初始化块,然后才运⾏构造器的主体部分
综上所述:构造⽅法⼤致有三种
  在构造函数中设置
  在声明中赋值
  初始化块
析构函数:java有⾃动的垃圾回收机制,不需要⼈⼯回收内存,所以java不⽀持析构函数
包:将类放⼊包中,必须将包的名字放在源⽂件的开头,包中定义类的代码之前,需要将包中的⽂件
放到与完整的包名匹配的⼦⽬录中,别的⽬录⽂件需要时直接import该路径下的类即可
包作⽤域:标为public的部分可以被任意的类使⽤,标为private的部分只能被定义它们的类使⽤,没有指定public和private的部分(类、⽅法、变量),可以被同⼀个包中的所有⽅法访问
继承:extends  所有继承都是公有继承
super可以调⽤⽗类的函数,也可以帮助⼦类完成初始化
多态:不需要将⽅法声明为虚拟⽅法,动态绑定是java的默认处理⽅式
如果是private, static, final⽅法或构造器,那么编译器将准确知道应该调⽤哪个⽅法,称为静态绑定。除此之外的⽅法采⽤动态绑定,虚拟机预先为每个类创建了⼀个⽅法表,其中列出了所有⽅法的签名和实际调⽤的⽅法
final类:阻⽌⼈们利⽤某个类定义⼦类,其所有⽅法⾃动成为final⽅法,属性不是,属性如果需要则可以单独设置为final
final⽅法:⼦类不能覆盖这个⽅法,且取消⽅法的动态绑定
抽象类:声明abstract的⽅法不需要实现,包含⼀个或多个抽象⽅法的类本⾝必须声明为抽象(abstract),不能创建这个类的实例化对象
编译器只允许调⽤在类中声明的⽅法
Object类:它是java中所有类的始祖,每个类都是由它扩展⽽来,除了基本类型不是对象,包括数组类型都是由Object类扩展⽽来
泛型数组列表:ArrayList是⼀个采⽤类型参数的泛型类,在添加或删除元素时,可以⾃动调节数组容量,相⽐C++访问元素⽤[],当java不能重载运算符只能调⽤显⽰的⽅法,另外C++是值拷贝,vector<int> a=b,a是⼀个和b的值⼀样的新向量,java则会使a和b指向同⼀个数组列表
对象包装器与⾃动装箱:对象包装器类是不可变的,⼀旦构造,不能改变内部的值,还是final的,不能定义其⼦类。作⽤是将基本类型包装为对象,这种类型的运算与基本类型⼀致,原因是进⾏了⾃动装箱和拆箱操作,另⼀⽅⾯该类封装了⼀些基本⽅法,⽐如parseInt:将⼀个数字字符串转化为数值
⼀个类只能继承⼀个类,但可以实现⼀个或多个接⼝,,接⼝所有的⽅法⾃动属于public,接⼝不能含有实例域(属性), 不能实例化,接⼝中的域⾃动属于public static final 静态常量
反射:JVM的动态加载机制,Class
深拷贝:实现Cloneable接⼝,重新定义public的clone⽅法对Object的浅拷贝对象,补上该对象的深拷贝
hashtable 和 hashmap 的区别:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。