Java中的多态(for myself)

我记得这是大学上课的时候考试最爱考的题目.Java的多态.

多态

Java引用变量时有两个类型: 一个是编译时类型,一个是运行时类型.
编译时类型由申明该变量时使用的类型决定
运行时类型由实际赋值给该变量的对象决定的
当编译时的类型和运行时的类型不一样,这就可能出现多态

如下面一段代码:

/*************************************************************************
    > File Name: SubClass.java
    > Author: Chicho 
    > Created Time: 2016年09月26日 星期一 19时11分45秒
 ************************************************************************/

class BaseClass
{
    public int book = 6;

    public void base()
    {
        System.out.println("This method is base in the father,only father");
    }

    public void test()
    {
        System.out.println("parent test method");
    }
}


public class SubClass extends BaseClass
{
    public String book = "the book variant in subcalss is Hebe";

    public void test()
    {
        System.out.println("subclass test method");
    }

    public void sub()
    {
        System.out.println("a normal method in subclass");
    }

    public static void main(String[] args)
    {
        BaseClass bc = new BaseClass();
        System.out.println("***********************************");
        System.out.println("print the book variant in BaseClass");
        System.out.println(bc.book);
        bc.base();
        bc.test();


        System.out.println("***********************************");
        SubClass sc = new SubClass();
        System.out.println("Print the book variant in SubClass");
        System.out.println(sc.book);
        System.out.println("child invoke parent");
        System.out.println("invoke base method");
        sc.base();
        System.out.println("test method");
        sc.test();
        System.out.println("sub method");
        sc.sub();

        System.out.println("***********************************");
        BaseClass subBc = new SubClass();
        System.out.println("-----ploymophic------");
        System.out.println(subBc.book);
        subBc.base();
        subBc.test();
    } 
}

这段代码的运行结果如下所示:
这里写图片描述

在这里唯一比较特殊的是第三段代码.
第三个测试的时候,我们声明了一个BaseClass的变量,这个变量在编译的时候已经被定为BaseClass,之后运行的时候变为SubClass.

在Java中子类是一种特殊的父类,Java允许把一个子类对象直接赋值个一个父类的引用.

我们在声明一个类的变量的时候其实得到的是一个引用类型的变量,这个引用类型相当于C语言中的指针,在Java中我们把这个应用类型的变量放在栈内存中.
Java允许把一个子类对象直接赋值给一个父类的引用变量,无需任何类型转换,这种形式被称为向上转型(upcasting),向上转型由系统自动完成的.

这里要说明一下,java中的多态体现在方法上,不是体现在字段Field上.

在这里我们定义的BaseClass 这个subBC变量,它调用了子类重写的父类的方法,这个时候会变现出子类的特性,不会变现出父类的特性.也就是说被重写的方法,在向上转型的时候会表现出多态.

内存中的替换细节如下图所示:

这里写图片描述

多态只针对方法method(function)不针对字段.



你必需非常努力才,可以看起来毫不费力。

这里写图片描述

有个人曾经对我说过一句话:

你说你的QQ签名是focus on security!

那我就想问你你每天为这句话做了多少事情

你为信息安全做了多少事情

不要遇到一点事情就想着求别人帮助,自己解决会更有意义。

所以,我现在其实根本不开心,但是我只想看看自己非常努力之后会到什么境地!!





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值