今天遇到一个问题,决定梳理一下java基础多态特性。
问题如下:
public class FatherClass { public String name = "FatherClass"; } public class ChildClass extends FatherClass{ public String name = "ChildClass"; } public class Test001 { public static void main(String[] args) { FatherClass sc = new ChildClass(); //这里打印出来的是什么 System.out.println(sc.name); } }
结果:
FatherClass
原因:
多态只有方法可以重写,变量不可以重写,在调用时,还是调用的父类的变量。
因为觉得是ChildClass,所以查找原因,这也是复习多态的契机
环境:JDK1.7
Eclipse Oxygen.2 Release (4.7.2)
例子1:
public class FatherClass { public void fun() { System.out.println("I'm FatherClass fun"); } } public class ChildClass extends FatherClass{ public void fun() { System.out.println("I'm ChildClass fun"); } } public class Test002 { public static void main(String[] args) { FatherClass sc = new ChildClass(); sc.fun(); } }
结果:
I'm ChildClass fun
原因:
如果方法被重写,则调用子类的方法
例子2:
public class FatherClass { public void fun() { System.out.println("I'm FatherClass fun"); } } public class ChildClass extends FatherClass{ public void fun() { System.out.println("I'm ChildClass fun"); } public void privateMethod() { System.out.println("I'm ChildClass privateMethod"); } } public class Test002 { public static void main(String[] args) { FatherClass sc = new ChildClass(); sc.privateMethod(); } }
结果:
sc.privateMethod();这一行报错,因为父类的类型的引用不能调用父类中没有的方法
原因:
只能调用父类中定义的方法和变量
根据这两个例子,还有我遇到的第一个问题得出,多态就是父类类型指向子类对象,多态的表现方式其实就是继承,主要有四点:
1. 多态只有方法可以重写,变量不可以重写,在调用时,还是调用的父类的变量。
2. 如果方法被重写,则调用子类的方法。
3. 只能调用父类中定义的方法和变量