黑马程序员技术交流社区
标题: 对象及其三大特征(下) [打印本页]
作者: 与梦逆风而行 时间: 2014-11-29 21:05
标题: 对象及其三大特征(下)
本帖最后由 与梦逆风而行 于 2014-11-29 21:18 编辑
多态1.多态性在继承关系中,一个子类对象不仅具有其本身类所具有的形态,还具有其父类对象所具有的形态,成该对象具有多种形态,这种关系叫做多态
JAVA引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋值给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,这就是多态。
与方法不同的是,对象的Field则不具备多态性。
引用变量在编译时只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法,因此,编写JAVA代码时,引用变量只能调用声明该变量时所用类里的方法,例如:Object p = new Person();
代码定义了一个变量p,则这个p只能调用Object类的方法,而不能调用person类里定义的方法。
通过引用变量来访问其包含的实例Field时,系统会试图访问它编译时类型所定义的Field,而不是它运行时类型所定义的Field。
举例
class BaseClass
{
public int book=6;
public void base(){
System.out.println("父类的普通方法");
}
public void test(){
System.out.println("父类的被覆盖的方法");
}
}
public classSubClass extends BaseClass
{
//重新定义一个book实例Field,隐藏父类的book实例Field
public String book="轻量级JAVA";
public void test(){
System.out.println("子类的覆盖父类的方法");
}
public void sub(){
System.out.println("子类的普通方法");
}
public static void main(String[] args){
//下面编译时类型和运行时类型完全一样,不存在多态
BaseClass b = new BaseClass();
System.out.println(b.book);
//下面两次调用将执行BaseClass方法
b.base();
b.test();
//下面编译时类型和运行时类型不一样,多态发生
BaseClass p = new SubClass();
//输出6-----表明访问的是父类的Field
System.out.println(p.book);
//下面调用将执行从父类继承到的base方法
p.base();
//下面调用将执行当前类的test方法
p.test();
//因为p的编译时类型是BaseClass
//BaseClass没有提供sub方法,所以下面的代码编译时会出现错误
//p.sub();
}
}
2.引用变量的强制类型转换强制类型转换时需要注意:
1.基本数据类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括整数型,字符型和浮点型,但数值型和布尔类型之间不能进行类型转换。
2.引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行转换。如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,运行时类型为子类类型),否则将在运行时引发ClassCastException异常。
3.面试题/*
*1.使用创建对象时候new先在堆内存中进行内存空间的分配,并对结构进行初始化
*2.初始化父类的对象super
*3.实例代码块
*4.初始化子类的对象,执行构造方法
*/
class Father{
int a = 1;
Father(){ //----------------------(1)
show(); //---------------------(2)将执行(3)的结果 son 0
}
void show(){
System.out.println("father"+a);
}
}
class Son extendsFather{
Son(){
super();
System.out.println("-----------------------");
show(); //---------------------------------------(4)son 10
}
int a = 10;
/*
int a = 10;
int a; //创建对象,内存空间分配时完成的
//初始化super
a = 10; //父类对象创建完毕后做的
*/
void show(){
System.out.println("son"+a);//----------------(3) son 0
}
}
public classDemo1{
public static void main(String[] args){
Father f = new Son();
}
}
Java的子类不能获得父类的构造器?但子类构造器里可以调用父类构造器的初始代码块。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |