java多态性理解

来源:互联网 发布:网络安全法发布的意义 编辑:程序博客网 时间:2024/05/20 11:47

推荐阅读:JAVA 多态 由浅及深介绍
参考文章:1.java向上转型和向下转型
2.java多态我是参考了这篇微博(评论)中对于Java多态的理解。


蹭过一个JS老师的课,老师很善于有自己总结,说起的时候总会和其他语言比对着讲。他提起java的时候,我印象很深的就是:

  1. 实例与类之间有三个关系:实例是类的实例,类是Class类的实例,反射类(Class类)是自己的实例。//思路很清晰。也很容易理解。
  2. 两个多态:接口多态,虚方法多态。//对的,在java中并没有虚方法,我对虚方法也不了解,所以特意学习了一下java中的多态。
    与之相关的有java得向上转型和向下转型。
    向上转型和向下转型: 就是一句话: 父类引用指向子类对象。
    向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法–重写。(方法名,参数都相同)

举个例子:有2个类,Father是父类,Son类继承自Father。
Father f1 = new Son();// 现在f1还是指向Son对象 // 这就叫 upcasting (向上转型)
// 现在f1引用指向一个Son对象
Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)
// 现在f1还是指向Son对象
总结:
1。父类引用指向子类对象,而子类引用不能指向父类对象。
2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。
如:Father f1 = new Son();
3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。
如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;
其中f1前面的(Son)必须加上,进行强制转换。
引用自这里

(那么在运行到底是用哪个对象中的方法呢?)


java中的多态,是由overriding(重写、覆盖)和overloading(重载)实现的。
重写就是子类重写了父类的方法,即方法签名相同。方法名和参数列表一样。
重载就是方法名一样,参数列表不同。
我是这样理解的相当于强制转换,换成某某类型。(把子类对象强制转换成父类- -父类引用指向子类对象- -,或者把父类引用指向的对象转换成子类引用。)
那么就是转换成什么类就使用什么类的方法


相关类的定义

public class A{      public String show(D obj){          return ("A and D");   }    public String show(A obj){          return ("A and A");   }   }class B extends A{   public String show(B obj){          return ("B and B");   }   public String show(A obj){          return ("B and A");   }   }class C extends B{}   class D extends B{}

测试:

A a1 = new A();          A a1 = new A();        A a2 = new B();          B b  = new B();          C c  = new C();           D d  = new D();           System.out.println(a1.show(b)); //---A and A        System.out.println(a1.show(c)); //---A and A        System.out.println(a1.show(d)); //---A and D        System.out.println(a2.show(b)); //---B and A        System.out.println(a2.show(c)); //---B and A        System.out.println(a2.show(d)); //---A and D        System.out.println(b.show(b));  //---B and B        System.out.println(b.show(c));  //---B and B        System.out.println(b.show(d));  //---A and D

这里A a2 = new B();即是向上转型,实际指向的是一个B对象。调用的是B.class中的方法而方法B继承自方法A所以实际上B中的方法有三个
(在继承中,子类中的方法应该包括子类自己的方法,重写的父类的方法,以及父类中没有被重写的其他方法。)

1.public String show(B obj){
return ("B and B");
}
2. public String show(A obj){
return ("B and A");
}
3. public String show(D obj){
return ("A and D");

有以上理解,所以:

  • a1.show(b);//a1.show(c),a1.show(d)调用A中方法,其中b,c,d都是A类实例。
  • a2.show(b);//a2.show(c),a2.show(d)向上转型为A类,调用A中两个方法,其中一个是被B重写过的方法。
    public String show(D obj){
    return ("A and D");
    }
    public String show(A obj){
    return ("B and A");
    }
    向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法–重写。(方法名,参数都相同)
  • b.show(b);//b.show(c),b.show(d)调用B中三个方法,即可。
0 0
原创粉丝点击