今天遇到一个问题,决定梳理一下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. 只能调用父类中定义的方法和变量