java的继承与多态

java多态

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

  1. java多态之向上转型
  2. Java多态之向下转型
  3. 关于继承的一些细节
  4. 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//说明变量不参与多态,编译时类型是谁,就使用谁的变量,这是子类调用,这里是子类变量

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值