
第一章 对象导论第二章 一切都是对象前两章是从宏观来介绍面向对象编程相关的内容挺有意思可多看几遍。笔记从第三章开始:第三章 操作符别名现象赋值对象引用会发生什么将一个对象赋值给另一个对象实际上是将引用从一个地方复制到另一个地方。若想保持两个对象彼此独立不建议直接操作对象内的域。容易导致混乱且违背了面向对象程序设计的原则。解决方案深克隆https://blog.csdn.net/DeMonliuhui/article/details/54572908https://blog.csdn.net/nishuishenhan/article/details/4693710https://blog.csdn.net/qq_28081081/article/details/80455150和equals1对于比较的是值是否相等如果作用于基本数据类型的变量则直接比较其存储的 “值”是否相等如果作用于引用类型的变量则比较的是所指向的对象的地址2对于equals方法注意equals方法不能作用于基本数据类型的变量equals继承Object类比较的是是否是同一个对象如果没有对equals方法进行重写则比较的是引用类型的变量所指向的对象的地址诸如String、Date等类对equals方法进行了重写的话比较的是所指向的对象的内容。intx10;inty10;String str1newString(abc);String str2newString(abc);System.out.println(xy);// 输出trueSystem.out.println(str1str2);// 输出falseString str1newString(abc);String str2newString(abc);System.out.println(str1.equals(str2));//输出trueSystem.out.println(str1str2);//输出false上述str1和str2都是在堆内存中创建了对象new了String s1abc;String s2abc;System.out.println(s1.equals(s2));//输出trueSystem.out.println(s1s2);//输出true为什么第二个会是true呢涉及到了内存中的常量池常量池属于方法区的一部分当运行到s1创建对象时如果常量池中没有就在常量池中创建一个对象abc,第二次创建的时候就直接使用所以两次创建的对象其实是同一个对象它们的地址值相等。第五章 初始化与清理数据初始化顺序类加载时静态只执行一次父类——静态变量父类——静态初始化块子类——静态变量子类——静态初始化块类创建时每次创建类执行父类——变量父类——初始化块父类——构造器子类——变量子类——初始化块子类——构造器第六章 访问权限控制JAVA解释器运行过程加载包过程首先找出环境变量CLASSPATHCLASSPATH包含一个或多个目录用作查找.class文件的根目录。从根目录开始解释器获取包的名称并将每个句点替换成反斜杠以从CLASSPATH根中产生一个路径名称于是package foo.bar.baz会变成foo\bar\baz或foo/bar/baz或者其他这一切取决于操作系统。得到的路径会与CLASSPATH中的各个不同的项相连接解释器就在这些目录中查找与你所要创建的类名称相关的.class文件。解释器还会去查找某些涉及java解释器所在位置的标准目录。private构造器构造器私有化谁也无法创建该类的对象别人该怎样使用这个类呢1、创建一个static方法创建一个新的对象并返回一个对它的引用。如果想在返回引用前做一些额外的工作或者记录到底创建了多少个对象此种做法可行。classSundae{privateSundae(){}publicstaticSundaemakeASundae(){returnnewSundae();}}2、单例模式singletonclassSoup2{privateSoup2(){}privatestaticSoup2 ps1newSoup2();publicstaticSoup2access(){returnps1;}}Soup2类的对象是作为Soup2的一个static private 成员而创建的所以有且仅有一个而且除非是通过public方法access()否则是无法访问到它的。第七章 复用类在组合和继承之间选择组合想在新类中使用现有类的功能而非是它的接口has-a有一个继承使用某个现有类并开发它的特殊版本 is-a是一个到底该用组合还使用继承问一问自己是否需要从新类向基类进行向上转型。如果必须向上转型则继承是必须的但如果不需要则应当好好考虑自己是否需要继承。其它private保留“更改底层实现”的权利。然后通过protected方法来控制类的继承者的访问权限第八章 多态多态编译器一直不知道对象的类型但是方法调用机制能找到正确的方法体并加以调用。1、只有非private方法才可以被覆盖2、只有普通方法的调用可以使多态的3、如果某个方法是静态的它的行为就不具有多态性。静态方法是与类而并非单个的对象相关联的4、父类一个变量子类一个同名变量不会覆盖父类的Super supnew Sub();sup.field变量还是父类的sup的普通方法是子类的因为任何域访问操作都将由编译器解析因此不是多态的。