黑马程序员__多态

                ------- android培训java培训、期待与您交流! ----------

   在java的继承体系当中,还有一个非常重要的知识点就是多态。多太的前提当然是继承

只有在继承关系的基础上才会有多态的出现。

  所谓多态,它的实质就是指当系统A访问系统B时,系统B可以通过多种实现方式来提供

服务,而这一切对系统A是透明的。在java中多态的体现为一个引用类型的变量可以指向

不同的类型的实例,如果把引用变量转换为父类类型,则称为向上转型。同时,在进行引

用变量的类型转换时,会受到各种限制,而且在通过引用变量访问它所引用的实例的静态

属性,静态方法,实例属性,实例方法,以及从父类中继承的方法和属性时,java虚拟机

会采用不同的绑定机制。

   java语言允许某个类的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换

以下代码演示:

Animal an= new Pig();
Pig() P=(Pig)an;//向下转型,一般来说需要强制转换
creature cr=an;//向上转型,不需要强制转换

 

在程序中运用多态时,我们应当注意以下几点:

(1)对于一个引用类型的变量,java编译器将会按照它声明的类型来处理,例如在下面的代码

当中:

class A{
}
class Bextends A{
String x=null;
void show(){
system.out.println("类B");

}
public static void main(String[] args){
A a= new B();
a.x="123";//编译出错,A类中没有x成员。
a.show();//编译出错,A类中没有show方法。
}
}

 

上述代码 由于在类A当中没有定义X变量以及show方法,java编译器在编译时,会检测a引用的

类型,所以编译不会通过。此时,如果仍希望调用到这个属性和方法,就必须做转型的动作:

((B)a).x="123";//编译通过
((B)a).show();//编译通过,打印"类B".


此外java编译器允许在具有直接或者是间接继承关系的类之间进行类型转换,对于向上转型,

不必使用转型,因为子类的对象也可以看做父类的对象。例如一个Pig对象是一个annimal对象,

也是一个Creature对象,也是一个Object对象。

Pig p=new Pig();
Creature Ct=p;//编译通过
Object O=p;?//编译通过

 

(2)对于一个引用类型的变量,运行时java虚拟机会按照它所实际引用的对象来处理。以下代码

编译可以通过,但运行时会发生异常。

A a=new A();
B b=(B)a;//运行时异常。


 

(3)在运行时,子类对象可以转换为父类类型,而父类的对象实际上无法转换成子类类型。因为

通俗来讲,父类拥有的成员子类肯定也有(不考虑私有类型),而子类拥有的成员父类不一定有。

 

  事实上,在运行时环境中,java虚拟机有一个动态绑定机制,以下是这个机制的具体规则:

(1)实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定。因为是在运行时由

java虚拟机动态决定的。

(2)静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上在编译阶段

做出了绑定。

(3)成员变量(包括静态变量与实例变量)与引用所声明的类型成员变量绑定,因为实际上在编译阶

段就做出了绑定。

以下代码演示动态绑定机制:

class A{
static int x=0;
int w=1;
static void show(){}
void method(){}

}
class B extends A{
int w=2;
static int x=3;
static void show(){}
void method(){}
public static void main(String[] args){
   A a=new B();
   a.show;//调用A类的show方法
  a.method;//调用B类的method方法 
  a.x=5;//调用A类的x属性
  a.w=6;//调用A类的W属性
}
}


 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值