Java 面向对象编程中的多态

文章类别 in java
  • 啥么是java面向对象的多态咧?
  • java面向对象的多态有啥么特点呢?
  • java面向对象的多态有啥弊端,怎么办?
  • 多态可以给我带来什么好处不?

java面向对象的多态

多态就是呢,某种事物在不同时刻的表现出来的不同状态! 比如说:动物,可以表现为狗,猪,牛等等!

多态的前提是:

  • 有继承关系(比如:狗 extends 动物)
  • 有方法的重写(比如:狗重写了动物的方法)
  • 父类引用指向子类对象(比如:动物 dw = new 狗)

代码体现:

//父类
public class Animal {

    public void eat()
    {
        System.out.println("吃啥呢?");
    }

}

//子类
public class Dog extends Animal {

        @Override
        public void eat() {
            // TODO Auto-generated method stub
            System.out.println("I  am  dog , 你懂的");
        }

}

测试类:
public class MainDemo {

    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
    }


}

输出结果:

I  am  dog , 你懂的

以上就是一个简单的多态实现过程:Dog继承了Animal,然后重写了eat方法,然后Animal将引用指向了Dog,调用eat方法,结果打印出的Dog的eat方法里面的内容。

那么java面向对象的多态的特点是啥?

//添加一个年龄的属性
public class Animal {

    public int age = 100;

    public void eat()
    {
        System.out.println("吃啥呢?");
    }

}


//子类也添加一个年龄的属性,并且自己添加一个特有的功能
public class Dog extends Animal {

        public int age = 10;

        @Override
        public void eat() {
            // TODO Auto-generated method stub
            System.out.println("I  am  dog , 你懂的");
        }
        public void run()
        {
            System.out.println("我啪啪啪");
        }

}

//测试类:
public class MainDemo {

    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        System.out.println(a.age);
        a.run();

    }   
}

这时候运行你会发现:The method run() is undefined for the type Animal。

我们把a.run()注释掉再运行一次可以看到以下输出:

I  am  dog , 你懂的
100

从中发现:

  • Animal中根本就没有run功能!
  • 而age的输出的值是100,也就是父类中的age!
  • a.eat(),的输出值是(I am dog , 你懂的)也就是子类的eat()方法!

所以我们可以从中得出多态的特点:

父类引用子类对象,只对子类的重写方法有效!

这也就给多态带来了一个弊端:

父类引用子类对象,不能用子类的特有功能!,比如刚才Animal指向Dog后,用不了Dog的run方法。

那么,这时候就要用一种方法来解决,就是:强制类型转换

什么意思? 就是 Dog d = (Dog) new Animal(); 那么这样子,父类强制转化为子类对象,就可以使用子类的特有功能了!

代码体现:

public class Animal {

    public int age = 100;

    public void eat()
    {
        System.out.println("吃啥呢?");
    }

}

public class Dog extends Animal {

        private int age = 10;

        @Override
        public void eat() {
            // TODO Auto-generated method stub
            System.out.println("I  am  dog , 你懂的");
        }

        public void run()
        {
            System.out.println("我啪啪啪");
        }

}


public class MainDemo {

    public static void main(String[] args) {

        Animal a = new Dog();
        Dog d = new Dog();
        d = (Dog) a;
        d.run();

    }


}

输出结果:我啪啪啪


最后浅谈一下java面向对象的多态的好处:

提高代码的维护性!(当很多子类继承了父类,而他们的共同属性需要修改的时候,只需要修改父类中的代码就可以了,而不用对每个子类都进行修改!)

提高了代码的扩展性!(当要创建很多子类对象的时候,只需要写一个方法,并将父类对象当做参数,那么要创什么子类就传递什么子类对象就o了!)

我的相关文章

相关资料