首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
大数据必学Java基础(一):Java体系结构、特性和优势
2
大数据必学Java基础(二):Java核心机制
3
大数据必学Java基础(三):JAVA环境准备-->JDK
4
大数据必学Java基础(四):安装notepad++,配置path环境变量
5
大数据必学Java基础(五):第一段程序
6
大数据必学Java基础(六):程序中常见问题和编译方式
7
大数据必学Java基础(七):扩展环境变量
8
大数据必学Java基础(八):简单介绍API和注释
9
大数据必学Java基础(九):JDK,JRE,JVM的区别
10
大数据必学Java基础(十):标识符和关键字
11
大数据必学Java基础(十一):变量和常量
12
大数据必学Java基础(十二):基本数据类型
13
大数据必学Java基础(十三):基本数据类型的转换
14
大数据必学Java基础(十四):Java中的运算符
15
大数据必学Java基础(十五):算术运算符
16
大数据必学Java基础(十六):赋值运算符
17
大数据必学Java基础(十七):关系运算符和逻辑运算符
18
大数据必学Java基础(十八):条件运算符和位运算符
19
大数据必学Java基础(十九):运算符总结
20
大数据必学Java基础(二十):流程控制的引入和if语句介绍
21
大数据必学Java基础(二十一):Switch多分支结构介绍
22
大数据必学Java基础(二十二):循环结构
23
大数据必学Java基础(二十三):方法的定义/调用/重载
24
大数据必学Java基础(二十四):数组的引入和学习
25
大数据必学Java基础(二十五):数组的三种初始化方式
26
大数据必学Java基础(二十六):数组的应用题
27
大数据必学Java基础(二十七):详述main方法和了解可变参数
28
大数据必学Java基础(二十八):Arrays工具类和数组的复制操作
29
大数据必学Java基础(二十九):二维数组
30
大数据必学Java基础(三十):IDEA的使用介绍
31
大数据必学Java基础(三十一):IDEA模板的使用
32
大数据必学Java基础(三十二):IDEA中的断点调试
33
大数据必学Java基础(三十三):面向对象介绍
34
大数据必学Java基础(三十四):面向对象内存分析
35
大数据必学Java基础(三十五):深入了解关键词this
36
大数据必学Java基础(三十六):深入了解关键词static
37
大数据必学Java基础(三十七):代码块讲解
38
大数据必学Java基础(三十八):包和import讲解
39
大数据必学Java基础(三十九):面向对象三大特性之一封装(Encapsulation)
40
大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)
41
大数据必学Java基础(四十一):面向对象三大特性之一多态(Polymorphism)
42
大数据必学Java基础(四十二):Final关键词讲解
43
大数据必学Java基础(四十三):抽象类和抽象方法讲解
44
大数据必学Java基础(四十四):接口讲解
45
大数据必学Java基础(四十五):JDK1.8以后的接口新增内容
46
大数据必学Java基础(四十六):内部类和面向对象项目实战
47
大数据必学Java基础(四十七):异常的讲解
48
大数据必学Java基础(四十八):包装类和日期类的讲解
49
大数据必学Java基础(四十九):Math类和Random类的讲解
50
大数据必学Java基础(五十):String类和StringBuilder类的讲解

大数据必学Java基础(四十一):面向对象三大特性之一多态(Polymorphism)

​面向对象三大特性之一多态(Polymorphism)

多态跟属性无关,多态指的是方法的多态,而不是属性的多态

一、案例代入

代码语言:javascript
复制
public class Animal {//父类:动物:
    public void shout(){
        System.out.println("我是小动物,我可以叫。。。");
    }
}

public class Cat extends Animal{
    //喊叫方法:
    public void shout(){
        System.out.println("我是小猫,可以喵喵叫");
    }
    public void scratch(){
        System.out.println("我是小猫,我可以挠人");
    }
}

public class Dog extends Animal{
    //喊叫:
    public void shout(){
        System.out.println("我是小狗,我可以汪汪叫");
    }
    public void guard(){
        System.out.println("我是小狗,我可以看家护院,保护我的小主人。。。");
    }
}

public class Pig extends Animal{
    public void shout(){
        System.out.println("我是小猪,我嗯嗯嗯的叫");
    }
    public void eat(){
        System.out.println("我是小猪,我爱吃东西。。");
    }

}

public class Girl {
    //跟猫玩耍:
    /*public void play(Cat cat){
        cat.shout();
    }*/
    //跟狗玩耍:
    /*public void play(Dog dog){
        dog.shout();
    }*/
    //跟小动物玩耍:
    public void play(Animal an){
        an.shout();
    }
}

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //具体的猫:--》猫的对象
        //Cat c = new Cat();
        //具体的小女孩:--》女孩的对象
        Girl g = new Girl();
        //小女孩跟猫玩:
        //g.play(c);
        //具体的狗---》狗的对象:
        //Dog d = new Dog();
        //小女孩跟狗玩:
        //g.play(d);
        //具体的动物:--》动物的对象:
        //Cat c = new Cat();
        //Dog d = new Dog();
        Pig p = new Pig();
        Animal an = p;
        g.play(an);
    }
}

总结:

1、先有父类,再有子类:--》继承 先有子类,再抽取父类 ----》泛化

2、什么是多态:

多态就是多种状态:同一个行为,不同的子类表现出来不同的形态。

多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为。

3、多态的好处:

为了提高代码的扩展性,符合面向对象的设计原则:开闭原则。

开闭原则:指的就是扩展是 开放的,修改是关闭的。

注意:多态可以提高扩展性,但是扩展性没有达到最好,以后我们会学习 反射

4、多态的要素:

4.1、继承:Cat extends Animal ,Pig extends Animal, Dog extends Animal

4.2、重写:子类对父类的方法shout()重写

4.3、父类引用指向子类对象:

代码语言:javascript
复制
Pig p = new Pig();
Animal an = p;

将上面的代码合为一句话:

Animal an = new Pig();

=左侧:编译期的类型

=右侧:运行期的类型

Animal an = new Pig();

g.play(an); //

代码语言:javascript
复制
public void play(Animal an){//Animal an = an = new Pig();
        an.shout();
}

上面的代码,也是多态的一种非常常见的应用场合:父类当方法的形参,然后传入的是具体的子类的对象

然后调用同一个方法,根据传入的子类的不同展现出来的效果也不同,构成了多态。

内存分析

二、向下转型,向上转型

现在我就想访问到eat()方法和weight属性:

代码语言:javascript
复制
public class Demo {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        Pig p = new Pig();
        Animal an = p;//转型:向上转型
        an.shout();

        //加入转型的代码:
        //将Animal转为Pig类型:
        Pig pig = (Pig)an ;//转型:向下转型
        pig.eat();
        pig.age = 10;
        pig.weight = 60.8;
    }
}

对应内存:

思考之前的equals方法:

三、简单工厂设计模式

不仅可以使用父类做方法的形参,还可以使用父类做方法的返回值类型,真实返回的对象可以是该类的任意一个子类对象。

简单工厂模式的实现,它是解决大量对象创建问题的一个解决方案。将创建和使用分开,工厂负责创建,使用者直接调用即可。简单工厂模式的基本要求是

  • 定义一个static方法,通过类名直接调用
  • 返回值类型是父类类型,返回的可以是其任意子类类型
  • 传入一个字符串类型的参数,工厂根据参数创建对应的子类产品
代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {
        Girl g = new Girl();

        //Cat c = new Cat();
        //Dog d = new Dog();
        //Pig p = new Pig();
        Animal an = PetStore.getAnimal("狗");

        g.play(an);
    }
}

public class PetStore {//宠物店 ---》工厂类
    //方法:提供动物
    public static Animal getAnimal(String petName){//多态的应用场合(二)
        Animal an = null;

        if("猫".equals(petName)){//petName.equals("猫") --》这样写容易发生空指针异常
            an = new Cat();
        }

        if("狗".equals(petName)){
            an = new Dog();
        }

        if("猪".equals(petName)){
            an = new Pig();
        }

        return an;
    }
}
下一篇
举报
领券