我记得这是大学上课的时候考试最爱考的题目.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!
那我就想问你你每天为这句话做了多少事情
你为信息安全做了多少事情
不要遇到一点事情就想着求别人帮助,自己解决会更有意义。
所以,我现在其实根本不开心,但是我只想看看自己非常努力之后会到什么境地!!