一.Object类
对于 Object 类型的学习,就相当于人类的女娲,是一切类的根源。
着重说的三个方法:
1. equals 方法,目前官方的标准库里已有 150 中往上的 equals 比较方法,但是我们也可以自己定义比较的内容。 equals 方法主要用于比较一个对象是否是等于另外的一个对象。
这里,equals 方法是通过比较 对象的内容来是否相等,通常,对于我们自定义的类,还需要我们去重载;
而 "==" 用于比较两个引用类型的对象是否指向同一个内存地址,也就是说它比较的是对象的引用(内存地址),这通常用于比较基本类型 。
2. hashCode() 方法,就是返回整数作为对象的唯一的标识符,独一无二的一个标志,可以用来快速的找到所要的对象,可以配合着 equals () 方法使用来比较两个对象是否相等。
3. toString() 方法,我的理解就是将最后的内容以字符串的样式输出,不管是基本数据类型(int ,double,...)还是其它的。当然如果是自定义的类,就需要自己去重载了,重载使输出自己想输出的内容和样式。
二.泛型
1.基本概念
C++学习的时候,记得 泛型 就是不给出具体的数据类型,等使用什么类型的数据,就定义类型 改为什么类型。
这里 Java 也类似,
ArrayList<E>() 数组列表,我将其理解为动态数组,你可以随意的增删查改其内容,但要用对方法(方法:add(),get(),...),E 就是我们自定义的类型,但是E不可以是基本数据类型,只能是类,那基本数据类型,就需要用到包装类(Integer,Long,Float,...)。较好的方便性,就是牺牲了速度,所以ArrayList<Integer> 相比于 int[] 效率很低,因此只用于小型集合,因为较小的集合我们操作的快捷与方便更重要。
2.类型擦除
Java 中,泛型的类型擦除(Type Erasure)是指在编译时,编译器会移除泛型信息,使得在运行时无法获取到具体的类型。
举例有:
泛型类和接口:
- 当你定义一个泛型类或接口时,编译器会在编译阶段将泛型参数替换为它的边界类型(如果有的话),或者替换为
Object
类型(如果没有指定边界)。public class Box<T> { private T item; }
(边界类型:就是泛型的限定类型。)
public <T extends Number & Comparable<T>> void process(T number) { // T 必须是 Number 的子类,同时实现 Comparable 接口 }
类型擦除的结果是,泛型在运行时会失去类型信息,无法进行类型检查和强制转换。
类型擦除是指泛型在编译时的处理方式,即泛型类型信息在运行时被移除,替换为其原始类型。这意味着即使你在定义对象时提供了具体的类型,类型擦除仍然会发生,
三.继承.小知识点
"is_a" 关系,一个子类(或派生类)被视为一种特定类型的父类(或基类)。这样说可能有点别扭。
这里假设父类包含 变量 a ,方法 b ,方法 c 。
然后我们想定义一个其子类1想要包含,变量 a,方法 b ,方法 c ,方法 d 。这里子类包含父类所有的变量和方法,即子类的对象也是(超类)父类的对象,就说是满足 " is_a " 关系。
如果我们定义一个子类2包含,变量 a ,方法 b ,变量 e ,方法 d。这里就用不到方法 c ,那么继承的时候就会占空间,又用不到,就不是 " is_a 关系 " 。
这里 "is_a" 关系主要是提醒我们在继承时,注意父类与子类的关系是否适合继承。如果相似点太少,就不要在继承了,毕竟继承的作用是少写代码,让我们不必去重复的造轮子,而是在别人造的轮子的前提下,去造自己的车子。
四.逻辑"与","或"
如果有&&,与||的联合使用,假设A&&B||C,B会与A先结合成A&&B,或C;而不是A&&B或A&&C,呜呜,在判断条件很多的时候,尤其要注意这点,非常会埋坑,还不好找到,