多态性
多态机制是面向对象技术的精华之一,它是建立在继承基础上的.所谓多态,子类的对象可以代替父类的对象使用.
多态的使用eg
Public class Test{
Public staticvoid main(String[] args){
Person p=new Student();
System.out.println(p getlnfo());
}
}
1. 一个对象只能属于一种确定的数据类型,该类型自对象创建直至销毁不能改变。
2. 一个引用类型变量可能引用(指向)多种不同数据类型的对象以既可以引用其声明类型的对象,也可以引用其声明类型的对象。Object是所有类的父类。
注意:由于父类对象未包含子类中添加的成员,因而功能比较弱,也就无法替代子类对象使用。
多态性使用举例2
public class Test{
public voidshow(Person p){
System.out.println(p.getInfo());
}
public staticvoid main(String[] args){
Personp=new Person();
Students=new Student();
Testt=new Test();
t.show(p); p t.show(s); p
}
}
}
注意:show方法既可以处理Person类型的数据,也可以处理Student类型的数据,乃至未来定义的任何Person子类类型的数据,这样就不必为相关的每一种类型单独声明一个处理方法,提高了代码的通用性。
在多态情况下,一个引用类型的变量如果声明为父类的类型,但实际引用的是子类对象,则该变量就不能访问子类中添加的属性和方法
的情况在多态对象造型
下,由于对象以其父类的身份出现,对子类中新添加成员的访问受到限制,有时我们可能需要恢复一个对象的本来面目—造型(Casting),以发挥其全部潜力。
例5.9 多态性示例4。
Public class Test{
public voidcast(Person p){
//System.out.println(p.getSchool());非法
Studentst=(Student)p; //造型
System.out.println(st.getSchool()); //正确
}
}
注意:
¯ 从子类到父类的类型转换可以自动进行;
µ 在多态的情况下,从父类到子类转换必须通过造型(强制类型转换)实现;
µ 无继承关系的引用类型间的转换是非法的。
¯ instanceof运算符
再看例5.9中Test类的cast方法:
public voidcast(Person p){
//System.out.println(p.getSchool());非法
Studentst=(Student)p; //造型
System.out.println(st.getSchool()); //正确
}
调用方法时如果实参是子类Student的对象,则造型是正确的,若实参是父类Person的对象,则造型失败!
if(p instanceofStudent){
Student st=(Student)p;st.getSchool();
}
多态是建立在继承基础上的。父类引用指向了子类对象
子类的对象可以代替父类的对象的使用。在类的继承中,子类在父类的基础上进行扩充和改造。
多态中成员方法的特点:在编译时,看引用类型的类是否有此方法:在运行时,看对象所在的类是否有调用的方法.(动态绑定)
编译看左边,运行看右边..多态中成员变量的特点:编译和运行都看左边.
静态初始化块
1当创建java对象时,,系统总是先调用该类里定义的初始化块;
2如果一个类里定义了两个普通初始化块,则前边定义的初始化块先执行,后面定义的后执行.
3初始化块虽然也是java类里的一种成员,但他没有名字,也就没有标识,因此无法通过类,对象来调用初始化块;
4初始化块只能在创建对象时自动执行而且在执行构造方法之前执行
注意:初始块和声明实例属性时所指定的初始值都是该实例的初始化代码,它们的执行顺序与源程序中排列顺序相同。
初始化块和构造方法的不同:初始化块是一段固定的执行代码,它不能接受任何参数。因此初始化块对同一个类内的属性所进行的初始化处理完全相同。
用法:如果多个构造方法里有相同的初始化代码,这些代码无需接受参数,那就可以把他们放在初始化块中定义。能更好的提高初始化块的复用,提高整个应用的可维护性。
创建一个Java对象时,不仅会执行该类的初始化块和构造方法,系统会先执行其父类的初始化块和构造方法。
¯静态初始化块
如果定义初始化块时使用了static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块。
µ静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行,因此静态初始块总是比普通初始化块先执行。
µ静态初始块属于类的静态成员,用于对类属性执行初始化处理,不能对实例属性进行初始化处理。
µ系统在类初始化阶段执行静态初始化时,不仅会执行本类的静态初始化块,还会一直上溯到Object类(如果它包含静态初始化块)。经过这个过程,才完成了对类的初始化过程。
µ:静态初始块和声明静态属性时所指定的初始值都是该类的初始化代码,它们的执行顺序与源程序中排列顺序相同