写在前面
之前一直就用 java,但是并没有系统学习过。现在刷一下 java 的课程课程原视频,这里把一些之前没有注意的知识点记录一下。
主要是有一点理论的东西在里面,还有就是一些细节的知识点可能之前没有注意到。
下面的总结可能是没有什么逻辑和章法,就只是看到在课程中看到什么就总结什么,很零碎。
标题后面的编号,是原视频中对应的小节编号,防止之后看的时候看不懂,需要去原视频中重新理解。
Java 的堆空间和栈空间(2.3.2)
“对象是引用类型的数据”-----对象的初始化,放在堆空间中,变量放在栈空间中。看下面的一个例子:

这个例子中,定义一个整形数组。其中,new 操作符就是要在堆空间中开辟一片内存空间,然后 等号 是把堆空间中这一片内存的首地址赋值给栈空间中的 a 变量。建立起引用关系,如图所示。
之后,根据偏移量和索引就可以访问到数组中的不同元素。
类似的,我们看一下二维数组的内存空间使用情况。

二维数组和上面的一维数组其实是一样的。
这里是定义了一个 3*4 的数组,那么很简单,在堆中对应每一行,有一个长度为4的内存空间,然后需要有一个长度为3的数组记录每一行起始的地址;最终栈空间中的变量记录的是长度为3的数组的起始地址。
基本类型的数据存储在“虚拟机栈”中
看一个图就明白了。其中虚拟机栈是一个容量较小,但是运算速度极快的存储空间。

命令行参数
就是我们使用的主函数里面的 (String args[]) 这个东西。
一般是来传递命令行的参数的,平时都用不到,简单的来理解一下:如果在主函数内部将这个变量输出,而使用命令行来运行这个类,同时在命令行中输入几个 参数,运行时候就会发现这个命令行中输入的东西被输出了。
可变长参数
在方法的定义中,还涉及了一个可变长参数,之前没有见过。
static double maxArea(Circle c, Rectangle... varRec){
Rectangle[] rec = varRec;
// ...
}
/*下面是调用*/
maxArea(c, r1, r2);
maxArea(c, r1, r2, r3);
可以看到,调用的时候,因为可变长参数的原因,实际可以传入任意数量的 Rectangle 对象。
this 在一个构造方法内使用另外一个构造方法(同一类)
public class BankAccount(){
public BankAccount(String initName, int initNumber, float initMoney){
name = initName; //
number = initNumber;
money = initMoney;
}
public BankAccount(){
this("", 99999, 0.0f); // 使用同类另外一个构造方法
}
public BankAccount(String initName, int initNumber){
this(initName, initNumber, 0.0f); // 使用同类的另外一个构造方法
}
}
上面代码中有3个构造函数,其中后面两个构造函数都是通过 this 关键字来适用第一个构造函数来完成自身的实现的。
类似的, super 使用父类的一个构造方法。
枚举类
这个课程里面只是简单介绍了一下枚举类。
有一个 values() 方法可以遍历枚举类中所有的对象。
Object类(4.4.1)
这一节中,主要讲了一下作为根类的 Object 类中的一些方法。
- equals() 方法
如果是比较基本数据类型,那么只有比较运算符 "=="。如果是比较类的对象,才会有 equals() 方法。
这里有一个概念,相等(equal) 和同一 (identical)
如果比较两个对象,那么 "==" 运算符 和 equals() 方法都是用来判断两个对象是否“同一”,即两个引用变量是否指向同一个对象。
实际上 equals() 方法的实现,就是用了 “==” 运算符(如下),所以如果在比较两个对象时候,该方法和“==”是一样的,也是在判断同一性。
boolean equals(Object x){
return this == x;
}
如果需要像我们平时理解的那种 == (也就是说判断值是否相等)来比较的话,就要重写equals 方法。
pulbic boolean equals (Object x){
if (this.getClass()!=x.getClass())
return false;
ClassName b = (ClassName) x; // 先做类转换才能使用被比较类中的方法
return (this.getName).equals(b.getName); // 假如只有一个 name 变量属性
}
实际上在,String ,Integer,Date类中,equals() 方法被覆盖成为判断 相等性。
这个老哥具体讲了一下 String 类中的 equals 方法
- clone() 方法
这个方法是用来复制对象的。一个类的对象如果想要被克隆的话,需要实现Cloneable接口,才可以使用 clone() 方法
class MyObject implements Cloneable
{ // ...
}
泛型(4.7.1)
之前也理解过这个概念,这里重新认识一下。之前都是在容器中认识泛型的。
所谓泛型就是不指定的类型,从形式上来说就是一个尖括号扩住。
- 使用 "?" 作为通配符
class GeneralType<Type>{
// 泛型类
Type object;
pulic GeneralType(Type object){
this.object = object;
}
public Type getObj(){
return object; // 向上转型
}
}
class ShowType{
public void show(GeneralType<?> obj){ // 通配符
System.out.println(obj.getObj().getClass().getName());
}
}
5.2.1 接口
接口就是一个纯抽象类,即其中所有的方法都是没有方法体的抽象方法。
5.4.1 类型转换和方法查找
所谓的类型转换,分为自动转换和强制转换,自动转换是从“小的”--> 大的(不管是精度小的数到精度大的数、子类到父类)。
所谓的方法查找,是指在发生了类型转换之后,再进行方法调用时候,虚拟机查找调用哪个方法。
- 实例方法查找
从对象创建的类开始,向上查找
class Circle extends Math{
Circle circle = new Circle();
Math math = (Math) circle;
}
// 这个时候调用两个类共有的 area() 方法
math.area()
// 会发现其实 是 调用了 Circle 类中的方法,因为对象是 circle,属于 Circle类。
- 类方法查找(static 方法)
只看类。对于上面的情况,调用的是 Math 中的 statci circle().
5.7.1 构造方法和多态性
这一节之前在 Thinking in Java 中我们学习过。
- 构造子类对象时候,构造方法的调用顺序:
先调用父类构造方法,直到子类构造方法,然后是其他语句。(很好理解,先要有父类才可以有子类,所以是要先父类的构造方法。) -
不要在构造方法中调用多态方法
会产生不可知的错误。因为调用多态方法一般都会指向子类中的方法,而在构造时候,子类对象还没有初始化(构造),所以此时调用的方法会产生不可知的错误。
不建议在构造方法中调用其他方法,如果非要调用,可以调用那些 final 和 private 不可以被覆盖的方法。
6. 关于Collection 体系(集合体系)
先来看一下总图

对于java中的集合Collection体系,
Collection中文意思是“集合”,是一个存储同类型对象的数据结构抽象接口。其中主要包含Set、List、Queue三种接口。
- Set不允许元素重复,HashSet 和 HashTable 是其两个主要的实现类。
- List 允许重复。ArrayList、LinkedList 和 Vector 是其三个主要的实现类。
- Queue 是遵循先入先出(FIFO)的数据结构。
除此之外,Map也属于集合系统,但是从图上就可以看出来,实际上Map接口跟Collection 接口是并列的。 Map 是基于 key,value 的数据结构。HashMap、TreeMap 和 HashTable 是其三个主要的实现类。
这一块可能的面试问题
网友评论