一直都有听说这本书,朋友也都建议去认真看一看,可每次看到那么厚的一本书,就又随手丢到了一边。一转眼就来到了2018年,兜兜转转又捡起了这本书,想要突破现状,唯有一睹。。。
初读此书,或有所获。趁着这段假期,计划好好的阅读一下,顺便在此留下自己的一些感悟和总结,记录是一个好的习惯,它会记录我们的生活,成为人生的一个印记!对于书中的内容我不会总结的很详细,只是对一些自己之前不是很熟悉或者很重要的内容做一下总结。
初读,略有所获
java.lang 是一个特定类,它会自动被导入到每一个java文件中。
equals()方法:如果在自己编写的类中,使用equals()方法对类进行比较时,需要使这个类覆盖equals()方法;
否则,equals()方法默认比较的是对象的引用。
java解释器运行过程:
- 找出环境变量CLASSPAT
- CLASSPAT用作查找.class文件的根目录
- 解释器获取包的名称并将每个句点替换成反斜杠,以从CLASSPAT根中产生一个路径名称(例如:package foo.bar.baz变成foo\bar\baz或foo/bar/baz或其他,这一切取决于操作系统)
- 得到的路径会与CLASSPAT中各个不同的项进行连接,解释器就在这些目录中查找与你所要创建的类名称相关的.class文件
访问权限控制:
访问控制符 同一个类 同一个包 不同包中的子类 不同包中的非子类 public(公共的) true true true true protected(受保护的) true true true \ 无访问控制符(默认的) true true \ \ private(私有的) true \ \ \
多态
作用:消除类型之间的耦合关系
java中的所有方法都是通过动态绑定实现多态的,static方法和final方法(private方法属于final方法)除外,只有普通方法的调用才可以是多态的。构造器并不具有多态性(它们实际上是static方法,只不过该static声明是隐式的)。
class StaticSuper{
public static String staticGet(){
return "Base staticGet()";
}
public String dynamicGet(){
return "Base dynamicGet()";
}
}
class StaticSub extends StaticSuper{
public static String staticGet(){
return "Derived staticGet()";
}
public String dynamicGet(){
return "Derived dynamicGet()";
}
}
public class StaticPolymorphism{
public static void mian(String[] args){
StaticSuper sup = new StaticSub();
System.out.println(sup.staticGet());
System.out.println(sup.dynamicGet());
}
}
答案:
Base staticGet()
Derived dynamicGet()
复杂对象调用构造器的顺序:
- 调用基类构造器。这个步骤会不断地反复递归下去,首先是构造这种层次的根,然后是下一层导出类,等等,直到最底层的导出类;
- 按声明顺序调用成员的初始化方法;
- 调用导出类构造器的主体。
class Meal{
Meal(){
print("Meal()");
}
}
class Bread{
Bread(){
print("Bread()");
}
}
class Cheese{
Cheese(){
print("Cheese()");
}
}
class Lettuce{
Lettuce(){
print("Lettuce()");
}
}
class Lunch extends Meal{
Lunch(){
print("Lunch()");
}
}
class PortableLunch extends Lunch{
PortableLunch(){
print("PortableLunch()");
}
}
public class Sandwich extends PortableLunch{
priate Bread b = new Bread();
priate Cheese b = new Cheese();
priate Lettuce b = new Lettuce();
public Sandwich(){
print("Sandwich()");
}
public static void main(String[] args){
new Sandwich();
}
}
答案:
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()
享元设计模式
- 核心概念:若一个系统里要多次调用一个创建复杂的对象,那么就共享一个拷贝的对象,而不必每次都去创建一个新对象。这样既节省了内存,又减小了JVM的压力。
- 目的:能够提高系统的性能。
- 角色:抽象享元—主要用于定义共享对象的业务需求;具体享元—具体的实现;享元工厂—用于创建具体的享元,维护相同的享元对象,维护一个列表。