转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6480258.html
第三章:操作符
1:基本数据类型的比较用 ==、!=,引用类型的==、!=是针对地址的比较。适用于所有对象(引用类型)的比较函数是equals()。
2:短路:判断条件只需有一条使得判别式为真或为假,余下的就不会再执行。比如:1||a op b,读取到1时即可判定为真,后面的不再进行执行。
3:移位运算只能作用于int数据类型。其他类型要转为int才能进行移位。
4:类型转换:低——>高,自动对齐;高——>低,强制转换。
5:浮点数转换为int默认截尾(即直接去除小数部分),要四舍五入的话需要用到round()函数。
第五章:初始化与清理
1:以基本类型的参数不同进行重载的函数,在调用时容易由于数据类型的向上转换而造成混淆。在调用参数为基本数据类型的函数时,定义时所用参数的类型大于等于实际参数类型的函数都会被调用。比如:f(int i)、f(float i)、f(double i),在调用时传 f(5),则以上三个函数都被执行。所以,为了避免混淆,一般在实际调用时对参数进行窄化处理,显式声明数据类型。
2:不能以返回值区分重载方法:编译器根据代码语境来进行重载方法的选择,但如果调用函数时只是在单独一行调用而没有赋值号,则无法区分所处环境需要什么返回类型,也就无法进行相应的调用了。
3:默认构造器:如果自定义的类中没有构造函数,编译器会自动创建。而如果进行了构造函数的重载,则默认构造函数也需要自己定义。
4:在构造函数中调用另一个构造函数,只需用 this.(参数) 即可。注意,这一句必须位于所定义的构造函数的最顶行。
5:static方法没有this指针,因为static没有特定的对象,所以没有this调用。
6:Java垃圾回收器只会回收new关键字分配内存的对象,并且只有在内存不够时才进行垃圾回收。那么在某些对象使用完后如果想要手动清楚,可以在对象的类中定义finalize()函数进行销毁操作。在使用完对象后调用finalize()方法即可。否则,存储空间不够话容易造成内存泄漏。
7:垃圾回收器的工作:
1)引用计数法:每个对象有一个引用计数器,每当有一处引用执行该对象时就加一。当某个对象的引用计数为0时,就释放这个对象。
2)停止—复制法:先暂停程序的运行,然后将所有存活的对象复制到另一个堆,那么没有被复制的就是垃圾。
3)标记—清扫法:遍历所有引用,每当找到一个存活的对象就给对象一个标记。在全部标记完成后,清理动作才开始,没有标记的对象全部被释放。
8:类的每一个基本数据类型的成员都会有有一个初始值,默认为0;引用类型默认为null。当然,进行了初始化赋值则除外。
9:enum类型的一个使用:用于switch(enum)—case ENUM_X。
第六章:访问权限控制
1:根据包路径唯一确定类。
2:一个java源文件成为一个编译单元,一个编译单元内只能有一个public类。处于编译单元内的非public类主要为主public类提供支持,对包外是不可见的。
3:在导入了不同包中的同名类时,需要用 完整的包路径.类名 来指定使用那个类。
4:使用自己创建的工具类库(jar包):自己定义工具类,放入一个包中——把包路径添加到ClassPath下——在使用时,import包,创建对象调用方法即可。一切工具包都是从ClassPath根目录开始查询的,所以必须配置到ClassPath下。
5:Java访问权限修饰词:
6:类的访问权限:
第七章:复用类
1:代码复用的方法有两种:组合、继承。
2:惰性初始化:在需要使用对象时才进行对象的初始化。
3:Java不支持多继承,但可以纵向“多层继承”。如: B extends A,C extends B,D extends C。而在创建D时,是按A-B-C-D的顺序执行构造函数的。
4:导出类构造函数中调用基类构造函数,只需用 super(参数) 即可。//区分重载构造函数中调用别的构造函数:this.(参数)
5:代理:用组合包含一个类对象,然后定义一系列public方法供外界调用时,方法内部其实是用组合的对象调用其方法来实现的。这样做的目的是,不让外界访问到组合的私有类对象,起到保护作用。
6:析构子类:在子类中自定义了类似与析构函数的方法时,切记要在子类的“析构函数”中调用父类的“析构函数”,否则子类对象销毁了而它指向的父类对象还在。因为创建子类时,是先创建它的父类再创建子类对象的(因为子类创建时需要调用父类的方法)。
7:向上转型:用基类指向导出类对象,然后调用被导出类重写了的方法,但不能调用导出类新增的方法。
8:final关键字:
1)用final修饰的基本数据类型变量值不可以被改变;而final修饰的引用对象,其指向不能被改变,但是指向的对象的内容是可变的。
2)函数的参数列表中,用final修饰的参数在函数中不能被修改。这在匿名内部类的使用时尤其有用,匿名内部类只可以使用函数所传内容但不能修改他们。
3)final修饰方法:则继承该类的导出类中不能重写该方法。(类中private的方法都隐式地被指定为final的,所以子类中也无法覆盖它。也就是说,在子类中非private的方法才能被覆盖)
4)final修饰类:被final修饰的类不允许被继承。
9:所有的static代码在类加载时按照代码顺序依次初始化,而且只会初始化一次。只有就一直存在于内存中供调用。
10:执行顺序:
1)编译器加载类时执行:由父—>子顺序,按代码顺序把static代码依次加载到内存并进行初始化操作(赋值、计算、输出等);
2)在子类被创建时执行:由父—>子顺序执行构造函数,调用相应方法;
第八章:多态
1:多态,也叫动态绑定,后期绑定,运行时绑定;
2:再论向上转型的使用:基类提供调用的规范定义,导出类进行具体的实现。向上转型根据子类类型进行相应的方法调用;
3:多态运行时分析方法:对于导出类运行时调用的到底是父类的成员、方法还是子类的,如何分析?我们可以把父类中的成员、函数复制到子类代码中去,然后把与子类同名的非private内容去掉(因为被子类中的同名内容覆盖了。而private的相当于没复制过来,此时子类中同名的内容相当于新增的),剩下的就是父类中在子类仅存的内容。然后根据运行时调用的成员、函数是属于父类部分还是子类部分即可进行相应调用并得出结果。
4:父类中static修饰的方法在子类中不会被覆盖。所以子类对象调用时执行的是父类中该静态方法的代码。
5:再论对象的清理:如果手动定义类对象的清理工作,我们需要在子类的“析构函数”中也调用父类的“析构函数”来清除子类引用的父类对象。但是如果创建子类时通过传递一个父类对象进来而进行的子类创建,那么有可能一个父类对象被多个子类对象引用,这样的话子类的“析构函数”就不是单纯的清除引用的父类对象了,而是改变父类对象的引用计数器并调用父类的“析构函数”。而父类的“析构函数”先检查引用计数器,为0才进行父类对象的清楚。
6:协变返回类型:导出类中覆盖基类的方法时,返回类型可以是基类中同名方法的返回类型的子类。比如:A中f()返回X;B继承A重写f()返回Y,Y是X的子类。
7:纯继承:导出类只重写了基类定义的方法,而没有增加任何内容。
8:运行时类型识别(RTTI):
第九章:接口
原文:http://www.cnblogs.com/ygj0930/p/6480258.html