方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确 实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关 系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。
要理解多态性,首先要知道什么是“向上转型”。
我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过Cat cat = new Cat();
实例化一个Cat的对象,这个不难理解。但当我这样定义时:Animal an = new Cat(); 这代表什么意思呢?
3、 static 有那些特点和使用的“局限”? 从上面的分析可知,static的东西在类加载时,就分配了内存空间,即编译时就为这些成员变量的实例分配了空间。 那么在static块内和方法体内,我们能给它放一个在内存中还没有着落的变量?显然与我们先前所说的相左。static的东西,人家是在static storage中有“指定位置“的,如果我们茫然的在static的作用域中放置一个普通的变量,那么编译时JVM就毫不客气的给你个异常: non-static variable a cannot be referenced from a static context或non-static method Test() cannot be referenced from a static context(注:Test()是我试验时的一个例子),除非我在static中现场开辟空间,用new来要内存。 对于static的初始化问题,我们还是值得讨论的。现看下面的例子: //StaticInit show the static decorated initialization package com.blogchina.qb2049; public class StaticInit { static int i; int a; public StaticInit() { a=6; System.out.println("a 的初始化"+a); } public static void main(String[] args) { new StaticInit(); } static { i=5; System.out.println("i 的初始化"+i); } }运行结果如下:i 的初始化5 a 的初始化6 静态块的初始化要早于非静态的,原因就是在于这些东西是在类装载时就开始初始化了。说起static的“局限“,总结起来就是:在static的方法中仅能够调用其他的static方法和static变量;在static方法中不能以任何方式引用this或super;static变量在定义时必须进行初始化,并且初始化的时间早于非静态。还有一个局限我需要具体的说明一下,static的变量的初始化仅能一次,如下例: //Static.java, initialize only one class T1 { static int t=1; T1(int b) { t=b; } } public class Static { T1 t1=new T1(2); T1 t2=new T1(3); T1 t3=new T1(4); public Static() { System.out.println("t1: "+t1.t); System.out.println("t2: "+t2.t); System.out.println("t3: "+t3.t); } public static void main(String args[]) { new Static(); } } 运行结果为: t1: 4 t2: 4 t3: 4