Head First Java / After reading

Dog d =new Dog();

  • 在 d 中保存的是存取Dog()对象的方法,存储了指向Dog()对象的地址,存储了引用Dog对象的值。
    对象并没有放进变量中。


继承

  • is a 单方向判断

  • 可以用 子类 is a 父类,来判断是否符合继承关系

  • super.xx(); 调用父类的方法

  • JVM从最后的子类开始读取方法,层层向上读取

存取权限

  • private < default < protected < public

  • public 的成员会被继承;private 的成员不会被继承

  • 继承下来的方法可以被覆盖,但是成员变量无法被覆盖

抽象与接口

  • 抽象类必须要被继承,抽象方法必须要被覆盖

  • 如果声明出抽象方法,那必须将类也标记为抽象

  • 有抽象方法的类一定是抽象类

  • 抽象方法必须被其中的子类,或最后的子类实现

  • ArrayList 用到的是 Object 类型 ,所以ArrayList通用

  • ArrayList 是限制它的类型,这样 ArrayList只能保存int类型对象

  • 没有直接继承过其他类的类是隐含的继承对象。所有类都继承于 Object 类

  • Object 类主要目的:(1)作为多态让方法可以应对多种类型的机制 (2)提供Java在执行期的所有对象都有需要的基础方法

  • 编译器只管引用的类型,而不管对象的类型;Animal a =new Dog(); 只根据引用类型 Animal 来判断有哪些方法可以调用

堆栈与对象

  • JVM启动,从底层操作系统取得一块内存;在此内存执行Java程序

  • 在这内存中有两种区域:(1)对象的生存空间堆 (2)方法调用和变量的生存空间栈

  • 变量在哪个空间要看它属于哪种变量:(1)实例变量(2)局部变量[栈变量]

  • 调用方法压栈

  • 局部变量在所属的方法中,所以在栈上;对象始终都是在堆上的

  • 实例变量在所属的对象里面,所以在堆上

  • 如果实例变量是个对像的引用,则引用和对象也都是在堆上

  • 实例变量默认值:0/0.0/false,引用默认值 null

构造函数链

  • 创建子类对象时,父类对象的构造函数也会被层层执行

  • 执行方法,先压栈,压栈完毕后才逐个从栈顶开始执行

  • 调用父类构造函数的方法 super()

  • 对 super() 的调用必须是构造函数的第一个语句

  • 给父类构造函数传参 super(xxx)

  • 从一个构造函数中调用另外一个构造函数 this()

对象与垃圾回收器

  • 对象的生命周期取决于引用它的变量的生命周期

  • 对象被垃圾收集器回收

    (1)对象所处的方法执行完毕,方法弹出栈,因此里面的对象引用也消亡,所以对象没了引用,等待回收

    (2)对象引用被赋予新的对象,旧的对象失去了引用,等待回收

    (3)对象引用被赋予null,旧的对象同样失去了引用,等待回收

静态

  • 静态方法内没有变量,不依靠变量做出行为;可以直接通过类型方法调用

  • 非静态方法需要先实例化,再依靠引用变量来调用

  • 静态方法内无法调用非静态变量

  • 静态方法内无法调用非静态方法

  • 静态变量只会再第一次载入时进行初始化,并被同一个类的所有实例共享

  • 实例变量:每个实例共享一个

  • 静态变量:每个类共享一个

  • 静态变量在所属的类的对象创建之前就完成初始化

  • 同时标记静态 static 和 final 的变量是常数,一般命名都是全大写字母

  • final 可以用来固定值不变,方法不能被覆盖,类不能被继承

< - 僕らは知らない - >