java的继承与多态

来源:互联网 发布:qq三国js点智力 编辑:程序博客网 时间:2024/05/22 06:31

java多态

所谓的java多态就是指编译时类型与运行时类型不一致的情况,分为向上转型,与向下转型,具体讲解目录如下:

  1. java多态之向上转型
  2. Java多态之向下转型
  3. 关于继承的一些细节
  4. java—多态不包括哪些部分

  • java多态
    • 写在前面的话
      • 变量不具有多态静态即类变量类方法也不具有多态
      • 另外静态变量和方法的重写实际上是语法糖遵守语法规则但是与重写一点关系也没有
      • 变量不具有多态
      • 调用的是谁的方法即子类是否重写了没重写就是调用父类的重写了就是子类重写后的该方法操纵的就是谁的变量
      • 编译时类型是AAa调用的就是A类的变量向上转型也不好使
    • java多态之向上转型
    • java多态之向下转型
    • 关于继承的一些细节


写在前面的话

变量不具有多态,静态(即类变量类方法)也不具有多态

另外静态变量和方法的重写实际上是语法糖,遵守语法规则但是与重写一点关系也没有

变量不具有多态!!!

1.调用的是谁的方法(即子类是否重写了,没重写就是调用父类的,重写了就是子类重写后的)该方法操纵的就是谁的变量!!!

2.编译时类型是A,A.a调用的就是A类的变量!!!向上转型也不好使!!!


java多态之向上转型

向上转型,就是将子类对象转成为父类对象,比如这样

father s = new kid();//必须具有父子关系

这样的做法其实就是让子类对象穿上了父类的外衣,即编译时类型为父类(因为声明是父类),运行时类型是子类(真实的类型是子类),这样做会导致这个对象无法使用父类没有声明的变量和方法,其他跟正常的子类对象一样,即如果自己重写了会使用自己重写的,如果没有就使用父类的。

优点:要是没有优点,只增加局限性,那就没有意义了,这么做可以在写方法的时候参数比较灵活,可以直接父类形参(向上转型发生),不必要每个子类写一个,简单,简洁。
缺点:缺点就是,子类自己扩展的方法和变量无法使用了,解决办法就是向下转型


java多态之向下转型

可以这么说,没有向上转型就没有向下转型,向下转型完全是为了弥补向上转型的缺点而存在的。所谓向下转型,就是将披着父类衣服的子类还原成原本的子类,即强制类型转换,但是这个强转是有条件的,必须是披着父类衣服的子类的脱衣动作才被允许,否则会出错,编译错误。看下例子:


father s = new kid();kid h = null;if(s instanceof kid) {            h = (kid)s;//必须使用另一个变量指向他,使用自己是不行的            s = (kid)s;//比如这就是无效的        }

instanceof 关键字的使用条件是编译时前者是后者的子类或者后者自身

关于继承的一些细节

继承也成派生,子类可以重写父类的变量,方法,其中方法重写遵守“两同两小一大”原则
两同:参数列表和方法名
两小:抛出异常,返回值
一大:权限

注意:仅仅是方法遵守,变量不遵守,变量重写实际上是部分覆盖,调用子类的方法时子类方法操作子类重写后的变量,但是如果子类调用了一个自己未重写的方法(即父类的方法),父类方法调用的变量则是父类的变量
例子如下:

package newTest2;public class Kid extends Father {    public String sa = "sa";     public void haha() {     System.out.println("kid haha");     }     public void ah() {         System.out.println("11");     }//  public void ha1() {//      System.out.println(sa);//  }    public static void main(String[] args) {        Father t = new Kid();        Kid s = null;        if (t instanceof Father) {//          t = (Kid)t;            s = (Kid)t;        }        t.haha();        t.ha1();        System.out.println(t.sa);//这里说明变量是不参与多态的,输出的是父类的        s.haha();        s.ha1();//输出的是父类的sa变量,因为调用的是父类的方法,自己没有重写        System.out.println(s.sa);//这里说明变量是不参与多态的,输出的是子类的    }}

package newTest2;public class Father  {    public int sa = 4;    public void ha1() {        System.out.println(sa);    }    public void haha() {        System.out.println("father haha");    }}

结果如下:

kid haha//披着父类外衣的子类4//由于没有重写,调用的是父类方法,父类方法使用的是父类的变量而不是子类重写的4//说明变量不参与多态,编译时类型是谁,就使用谁的变量,穿父类衣服,这里是父类变量kid haha//子类4//由于没有重写,调用的是父类方法,父类方法使用的是父类的变量而不是子类重写的sa//说明变量不参与多态,编译时类型是谁,就使用谁的变量,这是子类调用,这里是子类变量

这里使用了向上转型,向下转型,展示了变量不多态。

原创粉丝点击