多态
引用变量在编译阶段只能调用编译时类型所具有的方法,但运行时执行他运行时所具有的而方法。因此在编写java代码时,引用变量只能调用声明该变量时所用类里包含的方法。例如,通过Object p = new Person()定义一个变量p,这个p只能调用Object里面的方法而不能调用Person里面的方法。
强制类型转换
进行强制类型转换时需要注意:
1 基本类型转换只能在数值类型之间进行,包括整数型、字符型和浮点型。数值型和布尔型之间不能进行类型转换。
2 引用类型之间的转换只能是在具有继承关系的两个类型之间进行,否则会出现编译错误。
当把一个子类对象赋值给父类引用变量时,被称为向上转换,这种转换总是可以成功的。当把一个父类实例转换成子类类型时,这个对象必须是子类实例才行(即编译时是父类类型,而运行时类型是子类类型,否则将在运行时引发ClassCastExcept异常)
Instanceof运算符
Instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类,用于判断前面的对象是否是后边的类,或者其子类、实现类的实例。如果是,返回true,否则返回false。
Instanceof运算符前面的操作数的编译时类型要么与后边的类相同要么与后面的类具有继承关系,否则会引起编译错误。
public static void main(String[] args)
{
//声明hello时使用Object类,则hello的编译类型是Object,
//Object是所有类的父类 , 但hello变量的实际类型是String
Object hello = "Hello";
//String是Object类的子类,可以进行instanceof运算。返回true。
System.out.println("字符串是否是Object类的实例:"
+ (hello instanceof Object));
//返回true。
System.out.println("字符串是否是String类的实例:"
+ (hello instanceof String));
//Math是Object类的子类,可以进行instanceof运算。返回false。
System.out.println("字符串是否是Math类的实例:"
+ (hello instanceof Math));
//String实现了Comparable接口,所以返回true。
System.out.println("字符串是否是Comparable接口的实例:"
+ (hello instanceof Comparable));
String a = "Hello";
//String类既不是Math类,也不是Math类的父类,
//所以下面代码编译无法通过
System.out.println("字符串是否是Math类的实例:"
+ (a instanceof Math));
}
初始化块
初始化块是java类里面可以出现的第四种成员(前面一次有成员变量 方法和构造器)
初始化块和构造器作用非常相似,它是构造器的补充,。初始化块总是在构造器之前执行,与构造器不同的是初始化块是一段固定执行的代码,不接受任何参数。因此初始化块对同一个类的所有对象所进行的初始化处理完全相同。
所以如果有一段初始化处理代码对所有的对象完全相同,且不需要接受任何参数,就可以把这段初始化处理代码提取到初始化块中。这样可以更好的提高初始化代码的复用,提高整个应用的可维护性。