浅谈Java的多态

Java是面向对象的语言,面向对象的三大特性:封装,继承和多态
今天我们来谈谈多态

  • 多态:顾名思义,就是多种形态,是指子类的多种形态
  • 多态分为向上转型和向下转型,我们先介绍向上转型

多态之向上转型

  • 我们经常说:老虎是动物,狗是动物,学生是人,老师是人,这其实也是一种多态
    我们来看这样的例子:
class Person{
	void show() {
		System.out.println("我是人!");
	}
}
class Student extends Person {
	void show() {
		System.out.println("我是学生!");
	}
}
class Teacher extends Person{
	void show() {
		System.out.println("我是老师!");
	}
}
public class DuoTaiDemo {

	public static void main(String[] args) {
		Person person = new Teacher();
		person.show();
		Person p ;
		Student s= new Student();
		p = s;
		p.show();
			
	}
}
  • 这个例子中,父类为:Person,子类Student,Teacher 都重写了父类的show()方法
  • 在主函数中,我们new了一个Teacher对象,并将Teacher对象赋值给父类的引用变量,这时就说,子类的对象是父类对象引用变量的上转型对象
  • 结果为:
    在这里插入图片描述

向上转型的注意事项

  • 上转型对象不能操作子类新增的成员
    例如在上面的例子中,在子类Student中增加新方法:
void study() {
		System.out.println("I'm study!");
	}

主函数中,上转型对象person调用study方法

person.study();//报红

此时编译器报错,The method study() is undefined for the type Person
**修改方案:**将上转型对象强制转回去,转成子类:将person.study();改为((Student) person).study();
,此处的语法类似于基本数据类型的强制类型转换 byte x = (byte)123

  • 上转型对象调用的是子类重写的方法
    上述例子中,上转型对象person.show()就是调用子类的重写方法

向上转型的作用

  • 上转型的作用:利于扩展,提高代码的复用性
    下面的例子可能不是很恰当
abstract class Animal{
	abstract void eat();
}
class Dog1 extends Animal{
	public void eat() {
		System.out.println("啃骨头");
	}
	void lookHome() {
		System.out.println("看家");
	}
}

 class Cat extends Animal{
	public void eat(){
		System.out.println("吃鱼");
	}
	void catchMouse() {
		System.out.println("抓老鼠");
	}
}
public class Test1 {

	public static void main(String[] args) {
		Dog1 d = new Dog1();
		d.eat();
		Dog1 d2 = new Dog1();
		d2.eat();
		Cat c1 = new Cat();
		c1.eat();
	}
}

抽象类Animal有一个抽象方法:eat(),子类,Dog,Cat重写抽象方法,在主类中,多次定义Dog类对象,调用eat方法
假如我有五个狗,五个猫,就得写10次对象.eat(),代码过于冗长

  • 解决方法:在主类中添加public static void method(Animal a) { a.eat(); }
    使用method(d1); method(d2)调用ea()方法,主类的代码如下:
public class Test1 {

	public static void main(String[] args) {
		Dog1 d = new Dog1();
		method(d);
		Dog1 d2 = new Dog1();
		method(d2);
		Cat c1 = new Cat();
		method(c1);
	}
	public static void method(Animal a) //利用多态的向上转型
	{
		a.eat();
	}
}

此时的method()方法就利用的多态的向上转型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值