ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多态,向上向下转型

2021-11-24 22:00:13  阅读:138  来源: 互联网

标签:子类 多态 转型 Person animal Dog new 向下 public


多态

  1. 多态的前提:继承
  2. 对象的多态:一个对象拥有多种形态,例如小明有学生形态,有人类形态
  3. 代码中体现多态性:其实就是一句话,父类引用指向子类对象
    Person p = new Student();
  4. 上句是向上转型,一旦向上转型为父类,就无法调用子类原本特有的内容
  • p就是Person类的实例对象,用p调用方法或属性 p. n 或p. add()等就是调用Person类的内容,和Student类无关
  • 特例是:若Student类重写了Person类的方法,p调用该方法相当于调用Student类的方法
public class Person {
	public int n = 0;
	public void test2() {
		System.out.println("test2_Person");
	}
}
public class Student extends Person{
	public int num = 1;
    public int age = 1
	public void test2() {
		System.out.println("test2_Student");
	} 
    public void test3(){
            System.out.println("test3")
    }
}

下述代码非常重要

public class Test2 {
	public static void main(String[] args) {
		Person p = new Student(); // 向上转型
		p.test2();      // 子类重写了父类方法,所以调用的是子类方法
            p.test3();      // 错误,p不可以调用Student类的方法
		System.out.println(p.n);   //属性不可被重写,所以调用的是父类属性
        	System.out.println(p.age); //报错,Person类和Object类没该属性
    }
}

使用多态的好处

举例:

  1. 有一父类Employee员工类, n个子类讲师类,助教类,教授类等
  2. Employee有抽象方法work(),每个子类都重写work()
  3. 创建每个对象:
Employee one  = new Teacher();
Employee two  = new Assiatant();
Employee three  = new Professor();
  1. 带来了统一性,每个对象都相当于一个类实例化来的,而且还有其特有的work方法
  2. 无论"="右边new的时候换成哪个子类对象,等号左边调用方法,属性都不会变化
  3. 每个对象都统一起来了,他们除了work之外都有相通的属性方法,比如身高,体重,专业等

上下转型

  1. 向上转型:其实就是多态写法,向上转型一定是安全的,
    父类名称 对象名 = new 子类名称();
  2. 向下转型:还原向上转型
    子类名称 对象名 = (子类名称)父类对象;
Animal animal = new Dog();
if (animal instanceof Dog){   // 看清大小写
    Dog dog = (Dog) animal;
}
  1. 前提:
  • 向上转型,只有向上转型后才可以使用向下转型
  • 向下转型使用的子类名必须是向上转型的子类名
  1. 切记:下述代码错误
Animal animal = new Animal();
Dog dog = (Dog) animal; // 报错

Animal animal = new Cat();
Dog dog = (Dog) animal; // 报错
  1. 为什么要向下转型:当使用多态(向上转型)后,需要调用子类特有的方法
  2. 转型需要配合 instanceof 使用

向上向下转型有什么意义?

  • 当传入的参数不知道是什么类时,可以用最底层父类修饰:
public static void giveMeAPet(Animal animal){
    if (animal instanceof Dog){
        Dog dog = (Dog) animal;
        dog.watchHouse;
    }
    if (animal instanceof Cat){
        Cat cat = (Cat) animal;
        cat.catchMouse;
    }
}

构造方法用private修饰:

  • 多用于单例模式
  • 要实现单例,还需要:
private static Person person = new Person();
public static Single getInstance() {
	return single;
}

标签:子类,多态,转型,Person,animal,Dog,new,向下,public
来源: https://www.cnblogs.com/640shuo/p/15600413.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有