Java的多态
这个笔记想写的原因是在自学接口的过程中,找关于接口的题目的时候找到了这样一道题目:
interface InterfaceA {
String S = "good ";
void f();
}
abstract class ClassA {
abstract void g();
}
class ClassB extends ClassA implements InterfaceA {
void g() {
System.out.print(S);
}
public void f() {
System.out.print(" "+ S);
}
}
public class Test {
public static void main(String[] args) {
ClassA a = new ClassB();
InterfaceA b = new ClassB();
a.g();
b.f();
}
}
题目要求是问这些代码输出是什么,输出当然是俩good,但是我看到了这样一行代码:
InterfaceA b = new ClassB();
这让我不解,事先没有学到多态,教学书上写的太少了,多态我只在目录上看到俩字,我就翻了翻别的书籍,详细看了下多态。
Java的多态用这样的代码可以让人比较好理解:
package kkc;
//多态
public class BaseClass {
public int book = 6;
public void base() {
System.out.println("父类的普通方法");
}
public void test() {
System.out.println("父类被覆盖的方法");
}
public void tes() {
System.out.println("父类的");
}
}
package kkc;
public class SubClass extends BaseClass {
public String book = "轻量级java";
public void test () {
System.out.println("子类覆盖父类的方法");
}
public void sub() {
System.out.println("子类的普通方法");
}
public void tes() {
System.out.println("父类");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BaseClass bc = new BaseClass();
System.out.println(bc.book);
bc.base();
bc.test();
System.out.println("-------------------------------------------------------------------------");
SubClass sc = new SubClass();
System.out.println(sc.book);
sc.base();
sc.test();
System.out.println("-------------------------------------------------------------------------");
/*BaseClass是编译时类型,而SubClass是运行时类型,
* 因此输出ploymophicBc.book时是用的BaseClass的引用变量book
* 又因为SubClass中没有重写base方法,因此用的也是父级的BaseClass的base方法
* 但是重写了test的方法,因此调用了SubClass类中的test方法
* 所以可以看出,产生多态的时候,根据运行时类型,调用的是运行时类型的被重写过的方法
* 但是运行时类型有而编译时类型没有的方法运行不出来,会报错;
*/
BaseClass ploymophicBc = new SubClass();
System.out.println(ploymophicBc.book);
ploymophicBc.base();
ploymophicBc.test();
ploymophicBc.tes();
}
运行结果:
6
父类的普通方法
父类被覆盖的方法
-------------------------------------------------------------------------
轻量级java
父类的普通方法
子类覆盖父类的方法
-------------------------------------------------------------------------
6
父类的普通方法
子类覆盖父类的方法
父类