c#和Java中的多态

多态:让一个对象表现出多种类型,写出通用的代码,最大限度的屏蔽各个子类之间的差异性。

c#举例:

 1 将父类的方法标记为虚方法 ,使用关键字 virtual,这个函数可以被子类重新写一个遍。
 2
 3        //真的鸭子嘎嘎叫 木头鸭子吱吱叫 橡皮鸭子唧唧叫
 4        RealDuck dk = new RealDuck();
 5        MuDark mk = new MuDark();
 6        XpDark xk = new XpDark();
 7        RealDuck [] dks = { dk,mk,xk};
 8        for (int i = 0; i < dks.Length; i++)
 9       {
10            dks[i].Jiao();
11            //调用的仍然是父类的方法,因为表现出来的类型是父类的,所以只能调用父类的方法,但是这个函数在
12            //子类中被重写了,所以此时就不再调用自己的了,而调用重新写的方法,具体调用哪个子类重写的方法,
13            //取决于dks[i]装的是谁的对象.
14        }
15
16     public class RealDuck
17     {
18         public virtual void Bark()
19         {
20             Console.WriteLine("真的鸭子嘎嘎叫");
21         }
22     }
23      public class MuDuck : RealDuck
24     {
25         public override void Bark()
26         {
27             Console.WriteLine("木头鸭子吱吱叫");
28         }
29     }
30        public class XPDuck : RealDuck
31     {
32         public override void Bark()
33         {
34             Console.WriteLine("橡皮鸭子唧唧叫");
35         }
36     }
37
38
39 //如果不用虚方法,则必须使用里氏转换法
40 如:   for(int i = 0; i < dks.Length; i++)
41        {
42             if(dks[i] is MuDark)
43             {
44                 (MuDark)dks[i].Jiao;
45             }
46         }
47
48 关于虚方法需要注意以下几点:
49 1.虚方法在父类中必须有实现,哪怕是空实现(这点和抽象方法以及接口中的方法不同)
50 2.虚方法子类可以重写(override),也可以不重写

Java多态举例:

多态要注意 的细节:
	1.  多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
	2.  多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
	3.  多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
	4.  多态情况下,不能访问子类特有的成员。
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。
编译看左边,运行不一定看右边。
编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。
/*
多态的应用:
  1. 多态用于形参类型的时候,可以接收更多类型的数据 。
  2. 多态用于返回值类型的时候,可以返回更多类型的数据。

多态的好处: 提高了代码的拓展性。

需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。
*/

//图形类
abstract class MyShape{

    public abstract void getArea();

    public abstract void getLength();
}

class Circle extends MyShape{

    public static final double PI = 3.14;

    double r;

    public Circle(double r){
        this.r =r ;
    }

    public  void getArea(){
        System.out.println("圆形的面积:"+ PI*r*r);
    }

    public  void getLength(){
        System.out.println("圆形的周长:"+ 2*PI*r);
    }
}

class Rect  extends MyShape{

    int width;

    int height;

    public Rect(int width , int height){
        this.width = width;
        this.height = height;
    }

    public  void getArea(){
        System.out.println("矩形的面积:"+ width*height);
    }

    public  void getLength(){
        System.out.println("矩形的周长:"+ 2*(width+height));
    }
}

class Demo {

    public static void main(String[] args)
    {
        /*
        //System.out.println("Hello World!");
        Circle c = new Circle(4.0);
        print(c);

        Rect r = new Rect(3,4);
        print(r);
        */
        MyShape m = getShape(0); //调用了使用多态的方法,定义的变量类型要与返回值类型一致。
        m.getArea();
        m.getLength();
    }

    //需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。
    public static void print(MyShape s){ // MyShpe s = new Circle(4.0);
        s.getArea();
        s.getLength();
    }

    // 需求2: 定义一个函数可以返回任意类型的图形对象。
    public static MyShape  getShape(int i){
        if (i==0){
            return new Circle(4.0);
        }else{
            return new Rect(3,4);
        }
    }

}

原文地址:https://www.cnblogs.com/qicao/p/8934104.html

时间: 2024-08-04 19:28:44

c#和Java中的多态的相关文章

java中实现多态的机制是什么?

多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次深入Java核心,一起学习Java中多态性的实现. “polymorphism(多态)”一词来自希腊语,意为“多种形式”.多数Java程序员把多态看作对象的一种能力,使其能调用正确的方法版本.尽管如此,这种面向实现的观点导致了多态的神奇功能,胜于仅仅把多态看成纯粹的概念. Java中的多态总是子类型

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Parent{ } class Child extends Parent{ int num = 4; } */ /* 样例3: class Parent{ void show(){ System.out.println("Parent Show!"); } } class Child exten

简述JDBC原理 + 在JAVA中异常是什么 + throws 与 throw 区别 + 简单解释以下JAVA中的多态

JDBC原理: 加:加载驱动 链:创建连接 预:创建预编译 执:执行SQL语句(查询需要处理结果级) 释:关闭链接: DBC中定义了一些接口:  1.驱动管理:  DriverManager  2.连接接口  Connection  DatabasemetaData  3.语句对象接口  Statement  PreparedStatement  CallableStatement  4.结果集接口  ResultSet  ResultSetMetaData JDBC只定义接口,具体实现由各个数

java中对于多态的理解

面向对象: 类:具体的对象抽象而来,可以抽象的表示一类具有相同特征和行为的对象 对象:是由类的实例化而来,对象是类的一个实例 java中关于多态的理解 打个比方 父亲person有行为这个方法,里面包括几个动作:吃饭,睡觉,走路 父亲有三个儿子,三个儿子都继承了父亲的行为方法,所以三个儿子都有吃饭,睡觉,走路这些动作,但是三个儿子又分别有自己的动作--大儿子A会弹吉他,二儿子B会唱歌,三儿子C会打鼓 ... 1.Person person = new A(); 不是父类对象指向子类引用而是父类引

Java中实现多态的机制

一,多态定义: 多态就是指一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定. 一,实现多态的机制 java中实现多态的机制是依靠父类或接口的引用指向子类.从而实现了一个对象多种形态的特性.其中父类的引用是在程序运行时动态的指向具体的实例,调用该引用的方法时,不是根据引用变量的类型中定义的方法来运行,而是根据具体的实例的方法. 三,条件 Java实现多态有三个必要条件:继承.重写.向上转型 原文地址:https://www.cn

java中的多态

多态是什么 1:在面向对象的程序设计中,多态是继继承和封装之后的第三大特征. 2:base类和导出类中有相同方法时,先调导出类的方法. 3:多态的作用是消除base类和导出类的耦合: 多态产生的条件 1 存在继承关系 2子类重写base类方法 3base类的引用指向子类 class Aa{ public void f(){ System.out.println("A.f()"); } } class B extends Aa{ public void f(){//子类重写base类方法

JAVA笔记整理(六),JAVA中的多态

JAVA引用变量有两个类型:一个是编译时类型,一个运行时类型 编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定.如果编译时类型和运行时类型不一样,就形成了多态. 因为子类其实是一个特殊的父类,因为JAVA允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,称为向上转型,由系统自动完成. 当把一个子类对象直接赋给父类引用变量后,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量.调用同

Java中,多态的实现有哪些要求?实现多态的关键技术?

多态指的是允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).实现多态的方法是动态绑定( Dynamic Binding),动态绑定指的是在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 在Java语言中, Override(覆盖.重写)是实现多态的关键技术,在子类中定义与父类相同的方法,同时有自己不同于父类的实现,在使用的时候可以用父类的引用指向不同的子类,从而在运行时决定调用哪个子类的方法. 多态的实现有

Java中的多态的一些体现,重写和包装类

1.异构数组 多态的表现 和double直接可以把int转换接受 int a=3;double b=a; Animal dog=new Dog();//实例化一个Dog对象 修改前面注意 向上转换向下转换 //类型还原 instanceof 判断属性类型,为避免类型转换异常,可以判断使用. d instanceof Dog,判断d是不是Dog类型,如果是完成强制转换Dog d=(Dog)dog; 属于同一父类的,不同子类: Animal 是Dog Cut 的父类 Animal dog=new D