java代码如何实现多态 java代码如何实现多态运行
Java运行时多态性的实现
运行时多态性是面向对象程序设计代码重用的一个最强大机制 动态性的概念也可以被说成 一个接口 多个方法 Java实现运行时多态性的基础是动态方法调度 它是一种在运行时而不是在编译期调用重载方法的机制 下面就继承和接口实现两方面谈谈java运行时多态性的实现
创新互联建站-专业网站定制、快速模板网站建设、高性价比城中网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式城中网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖城中地区。费用合理售后完善,十多年实体公司更值得信赖。
一 通过继承中超类对象引用变量引用子类对象来实现
举例说明
//定义超类superA
class superA
{
int i =
void fun()
{
System out println( This is superA )
}
}
//定义superA的子类subB
class subB extends superA
{
int m =
void fun()
{
System out println( This is subB )
}
}
//定义superA的子类subC
class subC extends superA
{
int n =
void fun()
{
System out println( This is subC )
}
}
class Test
{
public static void main(String[] args)
{
superA a
subB b = new subB()
subC c = new subC()
a=b
a fun() ( )
a=c
a fun() ( )
}
}
运行结果为
This is subB
This is subC
上述代码中subB和subC是超类superA的子类 我们在类Test中声明了 个引用变量a b c 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用 也许有人会问 为什么( )和( )不输出 This is superA java 的这种机制遵循一个原则 当超类对象引用变量引用子类对象时 被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法 但是这个被调用的方法必须是在超类中定义过的 也就是说被子类覆盖的方法
所以 不要被上例中( )和( )所迷惑 虽然写成a fun() 但是由于( )中的a被b赋值 指向了子类subB的一个实例 因而( )所调用的fun()实际上是子类subB的成员方法fun() 它覆盖了超类superA的成员方法fun() 同样( )调用的是子类subC的成员方法fun()
另外 如果子类继承的超类是一个抽象类 虽然抽象类不能通过new操作符实例化 但是可以创建抽象类的对象引用指向子类对象 以实现运行时多态性 具体的实现方法同上例
不过 抽象类的子类必须覆盖实现超类中的所有的抽象方法 否则子类必须被abstract修饰符修饰 当然也就不能被实例化了
二 通过接口类型变量引用实现接口的类的对象来实现
接口的灵活性就在于 规定一个类必须做什么 而不管你如何做 我们可以定义一个接口类型的引用变量来引用实现接口的类的实例 当这个引用调用方法时 它会根据实际引用的类的实例来判断具体调用哪个方法 这和上述的超类对象引用访问子类对象的机制相似
举例说明
//定义接口InterA
interface InterA
{
void fun()
}
//实现接口InterA的类B
class B implements InterA
{
public void fun()
{
System out println( This is B )
}
}
//实现接口InterA的类C
class C implements InterA
{
public void fun()
{
System out println( This is C )
}
}
class Test
{
public static void main(String[] args)
{
InterA a
a= new B()
a fun()
a = new C()
a fun()
}
}
输出结果为
This is B
This is C
上例中类B和类C是实现接口InterA的两个类 分别实现了接口的方法fun() 通过将类B和类C的实例赋给接口引用a而实现了方法在运行时的动态绑定 充分利用了 一个接口 多个方法 展示了Java的动态多态性
需要注意的一点是 Java在利用接口变量调用其实现类的对象的方法时 该方法必须已经在接口中被声明 而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配
lishixinzhi/Article/program/Java/hx/201311/26085
Java程序如何实现多态
多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短时间是不可能的,比如说接口,没有几年工作经验你根本不可能真正理解什么是接口,甚至有的人工作四,五年也没搞明白什么是接口,不要花太多时间去搞这些不容易搞懂的问题.
重载的特性,方法名相同.返回类型,传入方法的参数不同(包括个数和类型).
重写的特性,方法名相同,返回类型,参数均相同,必须发生在子类.
1.Java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。
Animal animal=new Dog(); //引用变量animal引用一个Animal子类Dog的实例
Dog dog=(Dog)animal; //向下转型,把Animal类型转换为Dog类型
Creature creature=animal; //向上转型,把Animal类型转换为 Creature类型
animal=new Cat(); //引用变量animal引用另一个Animal子类Cat的实例
注:Creature这里指的是生物。
2.如果把引用变量转换为子类类型,称为向下转型,如果把引用变量转换为父类类型,称为向上转型。
3.在进行引用变量的类型转换时,会受到各种限制。而且在通过引用变量访问它所引用的实例的静态属性、静态方法、实例属性、实例方法,以及从父类中继承的方法和属性时,Java虚拟机会采用不同的绑定机制。
4.成员变量、静态方法按照引用变量声明的类型静态绑定;实例方法按照引用变量引用的实例动态绑定。
例如,对于以下这段代码:
Fathers f=new Sons();
System.out.println(“f.var=”+f.var);
System.out.println(“f.staticVar=”+f.staticVar);
f.method();
f.staticMethod();
运行时将会输出如下结果:
f.var=FatherVar
f.staticVar=StaticFaterVar
Son method
Static Father method
class Fathers{
String var="FatherVar";
static String staticVar="StaticFatherVar";
void method(){System.out.println("Father method");}
static void staticMethod(){System.out.println("Static Father method");}
}
class Sons extends Fathers{
String var="SonVar";
static String staticVar="StaticSonVar";
void method(){System.out.println("Son method");}
static void staticMethod(){System.out.println("Static Son method");}
String sonVar=null;
void sonMethod(){}
}
java的多态怎么实现?
实现多态的三个条件(前提条件,向上转型、向下转型)
1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法。(多态下会调用子类重写后的方法)
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)
向上转型 Student person = new Student()
将一个父类的引用指向一个子类对象,成为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法此时通过父类引用变量无法调用子类特有的方法。
向下转型 Student stu = (Student)person;
将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为父类引用指向的真实子类类型,,否则将出现ClassCastException,不是任意的强制转换
向下转型时可以结合使用instanceof运算符进行强制类型转换,比如出现转换异常---ClassCastException
分享文章:java代码如何实现多态 java代码如何实现多态运行
文章URL:http://scyanting.com/article/ddseipe.html