多态

    java实现多态有三要素:
        1、要有继承关系
        2、要有方法的重写
            子类可以不重写父类中的方法,但是重写了会更好的体现子类的特点
        3、要有父类的引用指向子类对象
点击查看代码
class Animal2{
    String name;
    int age;

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

    public void sleep(){
        System.out.println("睡");
    }
}

class Dog2 extends Animal2{
    @Override
    public void eat(){
        System.out.println("🐕吃🥩");
    }

    @Override
    public void sleep(){
        System.out.println("🐕侧着睡");
    }
}

class Cat2 extends Animal2{
    @Override
    public void eat(){
        System.out.println("🐱吃🐟");
    }

    @Override
    public void sleep(){
        System.out.println("🐱蜷着睡");
    }
}


public class DuoTaiDemo1 {
    public static void main(String[] args) {
        //要有父类的引用指向子类对象
        Animal2 a1 = new Dog2(); // 类与类之间的多态

//        Dog2 d1 = new Cat2();
    }
}
    多态访问成员的特点:
        成员变量:编译看左,运行看左。
        成员方法:编译看左,运行看右。
        静态成员方法:编译看左,运行看左。
点击查看代码
class Fu10 {
    int a = 10;

    public void fun1() {
        System.out.println("好好学习,天天向上!");
    }

    public static void show1() {
        System.out.println("这是父类中的静态方法show1");
    }

}

class Zi10 extends Fu10 {
    int a = 20;

    @Override
    public void fun1() {
        System.out.println("在数加科技里好好学习!");
    }

    //    public void fun1() {
//        System.out.println("在数加科技里好好学习!");
//    }

    public static void show1() {
        System.out.println("这是子类中的静态方法show1");
    }
}

public class DuoTaiDemo2 {
    public static void main(String[] args) {
        Fu10 f = new Zi10();
        System.out.println(f.a);
        f.fun1();
        f.show1();
    }
}
    多态的好处:
        1、提高了程序的维护性(由继承保证)
        2、提高了程序的扩展性(由多态保证)
         构建一个父类工具包
点击查看代码
class AnimalTool{
    public static void useAnimal(Animal animal){ // Animal animal = new Cat()
        animal.eat();
        animal.sleep();
    }
}


class Demo{
    public static void main(String[] args) {
        //现在我想养一只🐕
        Dog d1 = new Dog();
        AnimalTool.useAnimal(d1); // new Dog()


        Cat c1 = new Cat();
        AnimalTool.useAnimal(c1); // new Cat()
    }
}
在多态中取得子类其他方法(非需要重写的方法)
      向下转型
      格式: 子类类名 变量名 = (子类类名)要转型的变量名;
点击查看代码
class Fu1{
    public void fun1(){
        System.out.println("好好学习,天天向上!");
    }
}

class Zi1 extends Fu1{
    @Override
    public void fun1() {
        System.out.println("李刚现在在数加好好学习,天天向上!");
    }

    public void show1(){
        System.out.println("李刚现在没有睡觉...");
    }
}

class Demo1 extends Fu1{

}

public class DuoTaiDemo2 {
    public static void main(String[] args) {
        Fu1 f1 = new Zi1();
        f1.fun1();
//        f1.show1();
        //向下转型
        //格式: 子类类名 变量名 = (子类类名)要转型的变量名;
        Zi1 z1 = (Zi1)f1;
        z1.show1();
        //并不是任意两个类型之间都可以做向下转型,只有实际内存对象类型与要转的类型一样
//        Demo1 d1 = (Demo1) f1; //ClassCastException

    }
}

不同地方饮食文化不同的案例
点击查看代码
/*
        不同地方饮食文化不同的案例
        Person
            eat()
        SouthPerson
            eat()
        NorthPerson
            eat()


 */
class Person{
    public void eat(){
        System.out.println("吃");
    }
}

class SouthPerson extends Person{
    @Override
    public void eat() {
        System.out.println("南方人吃🍚");
    }

    public void daMaJiang(){
        System.out.println("南方人喜欢打麻将");
    }
}

class NorthPerson extends Person{
    @Override
    public void eat() {
        System.out.println("北方人是🍜");
    }

    public void shuaiJiao(){
        System.out.println("北方人喜欢🤼‍");
    }
}


public class DuoTaiTest {
    public static void main(String[] args) {
        Person p1 = new SouthPerson();
        p1.eat();
//        p1.daMaJiang();
        System.out.println("-------------------");
        SouthPerson sp = (SouthPerson) p1;
        sp.eat();
        sp.daMaJiang();
    }
}

posted @ 2024-09-25 20:25  wang_jun  阅读(31)  评论(0)    收藏  举报