多态:一个对象的多种状态。例如,老王可以是老师,儿子,父亲等等身份。
几个知识点:
1、当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的非静态成员变量;当父类和子类具有相同的静态成员变量,那么在多态下访问的是父类的静态成员变量。所以:父类和子类具有相同的成员变量,多态下访问的是父类的成员变量。
2、当父类和子类具有相同的非静态方法(就是被子类重写的父类非静态方法),多态下访问的是子类的非静态成员方法。
3、当父类和子类具有相同的静态方法(就是被子类重写的父类静态方法),多态下访问的是父类的静态成员方法。
多态的前提:类与类之间有关系,继承或者实现。
多态的弊端:提高了扩展性,但是只能使用父类引用指向父类成员。
案例一:使用父类调用子类特有的方法
在这里需要注意类型转换:子类-->父类:自动转换 父类-->强制转换
父类Father:
public class Father {
void method1(){
System.out.println("这是父类的方法1");
}
void method2(){
System.out.println("这是父类的方法2");
}
}
子类Son:
public class Son extends Father{
//重载父类的method1()方法
void method1(){
System.out.println("这是子类的方法1");
}
void method3(){
System.out.println("这是子类的方法3");
}
}
测试:
public static void main(String[] args){
Father f = new Son();
f.method1(); //这是子类的方法1
f.method2(); //这是父类的方法2
//f.method3(); //编译报错
//类型转换 子类-->父类:自动转换 父类-->:强制转换
Son s = (Son)f;
s.method3(); //这是子类的方法3
}
运行结果:
案例二:使用多态作为形参,执行该动物下特有的方法
Animal类:
public class Animal {
String color;
Animal(){
}
Animal(String color){
this.color = color;
}
void run(){
System.out.println("跑跑");
}
}
Dog类:
public class Dog extends Animal{
Dog() {
}
Dog(String color){
super(color);
}
void run(){
System.out.println("狗儿跑跑");
}
void protectHome(){
System.out.println("狗儿会看家");
}
}
Fish类:
public class Fish extends Animal{
Fish() {
}
Fish(String color){
super(color);
}
void run(){
System.out.println("鱼儿跑");
}
void swim(){
System.out.println("鱼儿会游泳");
}
}
Bird类:
public class Bird extends Animal{
Bird(){
}
Bird(String color){
super(color);
}
void run(){
System.out.println("鸟儿跑");
}
void fly(){
System.out.println("鸟儿会飞");
}
}
测试:
public class AnimalTest {
public static void main(String[] args){
//Animal的多态体现:Dog Fish Bird
doSomething(new Dog()); //狗儿会看家
doSomething(new Fish()); //鱼儿会游泳
doSomething(new Bird()); //鸟儿会飞
}
//多态作为形式参数 Animal的多态体现:Dog Fish Bird
public static void doSomething(Animal a){
if(a instanceof Dog){
//如果是狗类,则将多态形式下的Animal转换Dog
Dog d = (Dog)a;
d.protectHome();
}else if(a instanceof Fish){
//如果是鱼类,则将多态下的Animal转换为Fish
Fish f = (Fish)a;
f.swim();
}else if(a instanceof Bird){
//如果是鸟类,则将多态下的Animal转换为Bird
Bird b = (Bird)a;
b.fly();
}else{
System.out.println("over");
}
}
}
运行结果: