Java是属于面向对象编程的语言,面向对象的三大特征,封装,继承,多态。其中,多态性是建立在继承关系上的。
多态用一句话概括就是:父类引用指向子类对象。
实现多态的几种方式:
现在有两个类,Animal类和Cat类,其中Cat继承Animal。
1、直接用父类型变量接收子类对象
Animal ac = new Cat();
2、参数多态
方法参数类型是父类型,但传入子类对象,构成多态
Cat c1 = new Cat();
m1(c1);
public static void m1(Animal a){}
3、返回值多态
用父类型变量接收返回的子类对象,形成多态。
Animal a2 = m2();
public static Animal m2(){
return new Cat();//返回猫类型
}
多态之属性调用 :
我们先创建两个类,Fu和Zi,其中Zi继承Fu。
父类有两个成员变量和一个成员方法。
public class Fu {
int fu = 1;
int a = 5;
void m(){
System.out.println("父类方法");
}
}
子类中创建两个变量和两个方法
注意:a 变量和 m()方法父类也有。
public class Zi extends Fu{
int zi = 9;
int a = 7;
void m(){
System.out.println("子类方法");
}
void unique(){
System.out.println("子类特有");
}
}
用父类型变量接收子类对象,进行测试:
public class Test {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.a);
fu.m();
//fu.unique();
}
}
结果:
发现,m()是子类和父类都有的,子类重写了父类的方法。父类引用调用了子类的这个方法,因为unique()方法是子类特有方法,父类没有,不能调用。a 变量调用的也是父类中的。
给出总结:
- 1 如果调用的是父类没有的,直接报错,都访问不了
- 2 如果调用的是子类没有的,都访问父类的
- 3 如果调用的是父类和子类都有的,除了成员方法调用子类,其他的都调用父类,因为成员方法可以覆写