&和|能够用做条件语句,可是是长链接,左右两边的表达式必须都执行完!这和&&和||不一样,&&和||是短链接,只要左边的表达式已经可以计算出整个表达式的结果,右边的表达式就不会执行!
java
继承、重载、多态
程序员
重载和多态不是一个概念:
函数
重载:类内的、横向的关系;两个方法名称相同,但参数不一样,返回类型能够不一样(但不能只改变返回类型),存取权限能够不一样(由于重载的两个方法之间没有更多的关系,与继承和多态无关)。
this
多态:类间(父类和子类)的、纵向的关系;继承自父类的方法并覆盖重写,方法名称相同,参数相同,返回类型相同或为该返回类型的子类(且子类保证能执行父类的一切行为),存取权限相同或更为开放。
spa
关于返回类型和存取权限的不相同状况,能够从子类的声明不能影响父类中声明的使用方式这一角度来看,由于多态的目的就是使用父类做为引用而不关心子类的实现,,因此子类的声明不能使得父类中的声明所体现的使用方式没法使用。于是,返回类型子类不能超出父类的声明,而存取权限子类不能限制父类的声明。
线程
调用method:设计
编译器根据引用类型来判断哪些method能够调用,而不是对象真正的类型。可是在调用哪一个版本时,是根据对象的真正类型寻找最近的版本。
code
为何会容许建立Object对象?
orm
由于有时候就是须要建立一个通用的对象,一个轻量化的对象,最多见的是在线程的同步化中。
对象
super、this
每一个构造函数能够选择调用super()或this(),但不能同时调用,且它们必须是构造函数的第一条语句(父类构造函数是子类构造函数执行的第一步,父类必须先于子类构造)。
格式化说明:
格式化例子:%1$,06.1f
1$:使用第1个参数(计数是1基的,即格式化字符串后面的第一个参数)做为浮点数进行格式化;
使用“,”分隔整数部分;
06:整数部分最少6个字符,不足部分用0补齐;
.1:小数点以后保留一位小数;
f:浮点数;
格式化中“<”表示重复利用以前用过的参数
java.util.Calendar:set(...)中的月份是零基的,因此0表示一月份,而且set是有延迟的。
try/catch是用来处理真正的异常,是程序员没法预测或防止的执行期失败情况,而不是程序的逻辑错误,而runtimeexception大部分都是程序的逻辑问题,属于非检查异常(unchecked,编译器不检查)。
设计原则:
面向对象设计:每一个类只要作好一件事情就好了。
因此java的输入/输出API带有链接类型的串流,表明来源与目的地之间的连接,链接串流将串流与其余串流链接起来。
通常来讲,串流要两两链接才有意义——其中一个表示链接(输入的来源或输出的目的地),另外一个表示要被调用方法(高层API,读取出真正的高层次数据类型或输出真正的高层次数据)。
好比FileOutputStream用于想文件写入字节,但咱们一般并不直接写字节,而是以对象层次的观点来写入,因此须要高层次的链接串流处理高层次的对象数据到字节流的链接。
因而这样就能够经过不一样的组合来达到最大的适应性,而没必要在一种串流类中考虑全部可能的状况(这是不可能的)。
标记接口:
Serializable接口又被成为marker或tag类的标记用接口,全部须要被序列化的类都须要声明实现该接口,而实际上没有任何方法须要被实现,只是用来标记,告诉JVM这个类能够被序列化。
而一个类被序列化时,其内部全部的成员变量也将被序列化,所以它的成员变量也必须是能被序列化的,即实现了Serializable接口。
过滤:
若是某个成员变量不须要序列化,则使用关键字transient标记一下,序列化将跳过这个变量。
指向不变性:
序列化会区分两个变量指向的对象是否相同,若是序列化时两个变量指向同一个对象,则反序列化时这两个变量依然指向同一个对象。
父类与子类:
不可序列化的父类(非final)能够有可序列化子类,可是当对象被反序列化时,父类的构造函数将和建立新的对象同样执行(可序列化类的构造函数不会被执行),属于该不可序列化父类及其祖先类的成员变量将被构造函数初始化,可是被可序列化子类重载的成员变量将按照子类中的定义(是否transient)进行序列化和反序列化。
static:
静态变量不会被序列化,反序列化后静态变量会维持类中本来的样子,而非存储时的值。
序列化版本serialVersionUID:
在类中显式地保存这个ID,则能够保证可序列化的类在演化后依然保持相同的ID,从而在经历了不损坏序列化的演化后该类依然可以反序列化以前序列化的数据(新加的变量将使用默认值)。
在方法参数中使用万用字符?时,编译器会阻止任何可能破坏引用参数所指集合的行为,即只读不可写:
class ChildClass extends SuperClass { ... } public void f(List<? extends SuperClass> list) { list.get(0); // ok list.add(new ChildClass()); // wrong } 这样却是能够: public <T extends SuperClass> void f(List<T> list) { list.get(0); // ok list.add((T) new ChildClass()); }