多态
什么是多态?
对象在不同的时刻表现出来的不同的状态
多态的前提条件是什么?
要有继承或者实现这种关系
要有方法的重写
要有父类引用指向子类对象
多态的代码体现?
class Fu {
public void print() {
System.out.println("Fu");
}
}
class Zi extends Fu {//要有继承关系
public void print() {//要有方法的重写
Systme.out.println("Zi");
}
}
class Demo {
public static void main(String[] args) {
Fu fu = new Zi();//父类引用指向子类对象
fu.print();
}
}
多态间子父类之间成员变量的关系?
父类中有一个成员变量,子类中有一个成员变量
如果这两个变量的名字都不相同的话
例:
class Fu {
int i = 1;
}
class Zi extends Fu {
int j = 2;
}
class Demo {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.i);//1
System.out.println(fu.j);//编译报错
}
}
如果这两个变量的名字都相同的话
例:
class Fu {
int i = 1;
}
class Zi extends Fu {
int i = 2;
}
class Demo {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.i);//1
System.out.println(fu.i);//1
}
}
通过两个小案例分析出,父类引用不能使用子类特有的成员变量,如果使用,就会编译报错
口诀:编译看左边,运行看左边
多态间子父类之间成员方法的关系?
父类中有一个成员方法,子类中有一个成员方法
如果这两个方法的名字都不相同的话
例:
class Fu {
public void printFu() {
System.out.println("Fu");
}
}
class Zi extends Fu {
public void printZi() {
System.out.println("Zi");
}
}
class Demo {
public static void main(String[] args) {
Fu fu = new Zi();
fu.printFu();//Fu
fu.printZi();//编译报错
}
}
如果这两个方法的名字相同的话
例:
class Fu {
public void print() {
System.out.println("Fu");
}
}
class Zi extends Fu {
public void print() {
System.out.println("Zi");
}
}
class Demo {
public static void main(String[] args) {
Fu fu = new Zi();
fu.print();//Zi
fu.print();//Zi
}
}
通过这两个小案例,我们可以分析出,父类引用不能使用子类特有的成员方法,但可以使用子类重写的方法和父类特有的方法
口诀:编译看左边,运行看右边
向上转型和向下转型
Fu fu = new Zi();(向上转型)
Zi zi = (Zi)fu;(向下转型)
向下转型解决了什么问题?
解决了父类引用不能使用子类里特有的成员变量和成员方法
向下转型的弊端?
转不好容易报错,在运行的时候会报错,ClassCastException 类型转换异常
|
|