欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈Java的多态

程序员文章站 2024-02-09 18:10:22
...

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对象赋值给父类的引用变量,这时就说,子类的对象是父类对象引用变量的上转型对象
  • 结果为:
    浅谈Java的多态

向上转型的注意事项

  • 上转型对象不能操作子类新增的成员
    例如在上面的例子中,在子类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()方法就利用的多态的向上转型

相关标签: JAVA 多态