本文已参与「新人创作礼」活动,一起开启掘金创作之路。
面向对象(多态)
多态的概念
- 生活中的“多态”,是指 客观事物在人脑中的主观体现
- 主观意识上的类别,与客观存在的事物,存在 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~");
}
}