java基础--多态

来源:互联网 发布:北京注册公司 知乎 编辑:程序博客网 时间:2024/06/17 00:28

多态:就是指一个引用在不同情况下的多种状态。

也可以这样理解:多态是通过父类的指针,来调用不同子类中实现的方法。


具体栗子:

1、父类: Animal

public class Animal {
public void cry(){

System.out.println("叫");
}
}


2、两个子类:Dog 和Cat

Dog:

public class Dog extends Animal{
public void cry() {
System.out.println("汪汪叫");
}
}


Cat::

public class Cat extends Animal{
public void cry() {
System.out.println("喵喵叫");
}

}


3、测试类:

public class Test {
public static void main(String[] args) {
Animal an=new Cat();
an.cry();               //打印喵喵叫
an=new Dog();  
an.cry();     //打印汪汪叫“”
}
}


Dog和Cat都是Animal的子类,但是通过重写Animal的方法,Dog和Cat的cry()方法的内容都是不一样的。

在调用cry()的方法时,会根据是cat或者还是dog从而产生不同的结果。这就是多态度的体现。


如上:可以得出多态的三个条件:

Java实现多态有三个必要条件:继承、重写、向上转型。

         继承:在多态中必须存在有继承关系的子类和父类。

         重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

         向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

      只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。


再举一个复杂一点的例子:


1、再新增一个Food的父类:


public class Food {
public void eat(){


}
}


2、两个子类:Fish和Bone


public class Fish extends Food{
public void eat() {
System.out.println("吃鱼");
}
}


public class Bone extends Food{
public void eat() {
System.out.println("吃骨头");
}
}


3、People 类,有一个feed() ,喂食动物的方法:


public class People {
public void feed(Animal an,Food food){
an.cry();
food.eat();
}
}


4、测试类:

public class Test {
public static void main(String[] args) {
People p=new People();
Animal an=new Cat();
Food food=new Fish();

an=new Dog();
food=new Bone();
p.feed(an, food);  //此处,可以根据自己需要填写不同的动物和不同的食物来喂养动物。
}
}


抽象类和抽象方法:


抽象类:用abstract来修饰一个类时,这个类就是抽象类

抽象方法:用abstract来修饰一个方法时,这个类就是抽象方法


抽象类注意事项:


1、抽象类不能被实例化


2、抽象类不一定要包含abstract方法,也就是说,抽象类可以没有abstract方法


3、一旦类中有abstract方法,则这个类必须声明为abstract


4、抽象方法不能有主体


如上例子:我们可以看到父类: Animal中的cry()方法被Cat和Dog重写,没有被直接使用过。所以可以将Animal

的cry()方法修改为抽象方法,Animal则为抽象类:修改为如下:


publicabstract  class Animal {

abstract public void cry();  //此处不能有主体

}