java中的多态

多态是继封装、继承之后,面向对象的第三大特性。

生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞 机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描 述的就是这样的状态。

定义

     多态: 是指同一行为,对于不同的对象具有多个不同表现形式。

     程序中多态: 是指同一方法,对于不同的对象具有不同的实现.

多态的前提:

  1. 继承或者实现【二选一】

       2. 父类引用指向子类对象【格式体现】 Fu fu = new Zi();

       3. 方法的重写【意义体现:不重写,无意义】

多态的体现:父类的引用指向它的子类的对象

    父类类型 变量名 = new 子类类型();

    变了名.方法名();

注意此时的父类类型不仅指的是集成的父类类型,也包括实现的父接口类型

多态时的成员访问特点:

    (1)多态时成员变量的访问特点:编译看左边,运行看左边。简而言之:多态的情况下,访问的是父类的成员变量

    (2)多态时非静态成员方法的访问特点:编译看左边,运行看右边,简而言之:编译的时候去父类中查找方法,运行的时候去子类中查找方法来执行

              (3)多态时静态成员方法的访问特点:编译看左边,运行看左边,简而言之:编译的时候去父类中查找方法,运行的时候去父类中查找方法来执行

注意:多态的情况下是无法访问子类独有的方法

代码示例:

public class Person {
int age = 10;
public void eat(){
System.out.println("人吃东西");
}
public static void sleep(){
System.out.println("Person类中的睡觉方法");
}
}

class Student extends Person{
int age = 20;
@Override
public void eat(){
System.out.println("学生吃东西");
}

public static void sleep(){
System.out.println("学生类中的睡觉方法");
}
public void study(){
System.out.println("学生再学习");
}
}

 public class Tets {

    public static void main(String[] args) {

Person person = new Student();//父类引用指向子类对象

//访问非静态方法:编译看左边,运行看右边
person.eat(); //应该输出“学生吃东西”
System.out.println(person.age);//访问成员变量:编译看左边,运行看左边。此时输出age=10
//访问非静态方法:编译看左边,运行看左边
person.sleep();//此时输出父类中的内容

//person.study();访问子类独有的方法报错

}
}

多态的好处:实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体 现出多态的扩展性与便利。
但有好处也有弊端,因为此时只能调用父类的共性内容,不能调用子类的特有内容。

代码示例:
public abstract class Animal {
public abstract void eat();
}

class Cat extends Animal{

@Override
public void eat() {
System.out.println("猫吃鱼");
}

public void catchMouse(){
System.out.println("猫抓老鼠");
}
}




public class Test {
public static void main(String[] args) {

Cat cat = new Cat();
Dog dog = new Dog();
     //多态的扩展性体现在,今后无论再多的子类出现,我们都不需要去编写showXXXEat方法了,直接使用showAnimalEat就可以完成

showAnimalEat(cat);
showAnimalEat(dog);

showCatEat(cat);//可以被showAnimalEat方法替代
showDogEat(dog);//可以被showAnimalEat方法替代

}
  //用父类的类型作为形参,实际调用的时候,传入子类实参。方法可以根据传入的实参类型执行特定的方法,增强代码的可扩展性
public static void showAnimalEat(Animal animal){

animal.eat();
}

public static void showCatEat(Cat cat){

cat.eat();
}

public static void showDogEat(Dog dog){

dog.eat();
}
}


class Dog extends Animal{

@Override
public void eat() {
System.out.println("狗吃骨头");
}
}


 

posted on   孤独仙林  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示