JavaEE入门级别最全教程5--初学者必看

136 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

面向对象(多态)

多态的概念

  • 生活中的“多态”,是指 客观事物在人脑中的主观体现
  • 主观意识上的类别,与客观存在的事物,存在 is a 的关系时,即形成 多态

**举例:**主观上的类别看成狗 客观上的事物时哈士奇---->就是多态(在人脑中的不同体现)

程序中的多态

  • 父类引用指向子类对象,从而产生多种形态。
  • 二者存在直接或者简介的继承关系时,父类引用指向子类的对象,即形成多态。
  • 父类引用仅能访问父类所声明的属性和方法,不能访问子类独有的属性和方法。

对象转型

向上转型

对象由子类类型,转型为父类类型,即为向上转型

  • 向上转型是一个隐示转换,一定会转型成功 (我把哈士奇看成一条狗)。
  • 向上转型后的对象,只能访问父类中定义的成员,不能访问子类中的独有成员。

向下转换

由父类类型转为子类类型 ( 存在失败的可能性): 我把这条狗看成哈士奇->不一定 也可能是哈士奇

  • 需要进行强制类型转换,是一个显示转换。
  • 如果失败了,会出现 ClassCastException 异常。
  • 向下转型后的对象,可以访问子类中独有的成员。
public class Program {
    public static void main(String[] args) {
        // 1. 父类的引用可以指向子类的对象
        // Animal animal = new Dog();   // 这个类似 我在大街上看到一条哈士奇,但是我只把它当作一条狗
        // 2. 向上转型
        Dog dog = new Dog();
        Animal animal = dog;
        // 3. 向下转型
        HaShiQi hashiqi = (HaShiQi) dog;  // 如果说它本来就是一只哈士奇才会成功
    }
}  // 会报异常 ClassCastException 
public class Program {
    public static void main(String[] args) {
        // 1. 父类的引用可以指向子类的对象
        // Animal animal = new Dog();   // 这个类似 我在大街上看到一条哈士奇,但是我只把它当作一条狗
        // 2. 向上转型
        Dog dog = new Dog();
        Animal animal = dog;
        // 3. 向下转型
        Dog dog1 = new HaShiQi();
        HaShiQi hashiqi = (HaShiQi) dog1;  // 如果说它本来就是一只哈士奇才会成功
    }
}

instanceof关键字

进行类型检查:检查某一个对象是不是指定的类型

package com.laity.basicSyntax.day4.polymorphism.ploymorphism2;

/**
 * @author : Laity
 * @Project: JavaLaity
 * @Package com.laity.basicSyntax.day4.polymorphism.ploymorphism2
 * @date Date : 2021年11月29日 18:20
 * @Description:
 */
public class Program {
    // 需求:某动物园刚刚开业,需要录入动物信息
    // 信息:名字,年龄,如果动物是老虎还需要额外的录入老虎的性别
    // 录入系统,简化为控制台输出
    public static void main(String[] args) {
        load(new Tiger());
        load(new Wolf());
        load(new Monkey());
        load(new Lion());
        load(new QQ());
    }

    public static void load(Animal animal) {

        // 如果是老虎
        // instanceof关键字 进行类型检查:检查某一个对象是不是指定的类型
        if (animal instanceof Tiger){
            Tiger tiger =(Tiger)animal; // 向下转型
            System.out.println("老虎的名字=" + tiger.name + ",老虎的年龄=" + tiger.age+",老虎的性别="+ tiger.gender);
        }else{
            System.out.println("name=" + animal.name + ",年龄=" + animal.age);
        }
    }
}

class Animal {
    String name;
    int age;
}

class Tiger extends Animal {
    String gender;
}

class Wolf extends Animal {
    // 狼
}

class Monkey extends Animal {
    // 猴子
}

class Lion extends Animal {
} // 狮子

class QQ extends Animal {
}  // 企鹅

多态中的方法重写

当向上转型后的对象,调用父类中的方法。如果这个方法已经被子类重写了,此时调用的就是子类的重写实现!

package com.laity.basicSyntax.day4.polymorphism.ploymorphism3;

/**
 * @author : Laity
 * @Project: JavaLaity
 * @Package com.laity.basicSyntax.day4.polymorphism.ploymorphism3
 * @date Date : 2021年11月29日 19:23
 * @Description: 多态中的方法重写
 */
public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.bark();               // bark~

        Dog dog = new Dog();
        dog.bark();

        Animal animal1 = new Dog();  // 向上转型
        animal1.bark();              // Won~
        Cat cat = new Cat();
    }
}
class Animal {
    public void bark(){
        System.out.println("bark~");
    }
}
class Dog extends Animal{
    @Override
    public void bark(){
        System.out.println("Won~");
    }
}

class Cat extends Animal{
    @Override
    public void bark() {
        System.out.println("Meow~");
    }
}