以下所有内容来自《疯狂Java讲义(第二版)》,本文为读后总结要点。
=========================================
静态成员不能直接访问非静态成员。
当系统加载类或者创建类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。成员变量放置在堆内存中。
局部变量定义后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。保存在其所在方法的栈内存中。
栈内存中的变量无须系统垃圾回收,随方法或代码块的运行结束而结束。
局部变量的作用范围越小,它在内存中停留的时间就越短,程序运行性能就越好。能用代码块局部变量的地方,就坚决不要使用方法的局部变量。
【继承】
如果程序员没有为Java类提供任何构造函数,系统会为这个类提供一个无参数的构造器,执行体为空,不做任何事情。
一旦程序员提供了自定义的构造器,系统就不再提供默认的构造器。
Java子类不能获得父类的构造器。
不管我们是否使用super调用来执行父类构造器的初始化代码,子类构造器总会调用父类构造器一次。
【多态】
Java引用变量有两个类型:编译时类型,运行时类型。如果两者不一致,就会出现所谓的多态。
父类引用指向子类对象。
相同类型的变量调用同一方法时呈现出多种不同的行为特质,这就是多态。比如,动物都会叫,但是不同动物叫的声音不一样,这就生物多样性。
继承严重地破坏了父类的封装特性。
继承要表达的是一种“是(is-a)”的关系,而组合表达的是“有(has-a)”的关系。
初始化块在构造函数之前执行,多个初始化块按代码里的先后顺序执行。
1 { 2 System.out.println("初始化块"); 3 }
静态初始化块在类初始化时执行。
1 static { 2 System.out.println("静态初始化块"); 3 }
使用javac编译源码后,初始化块会被嵌入到每个构造器中代码的最前面。
有抽象方法的类必须定义为抽象类,抽象类不一定要有抽象方法。
==========END=========