java 多态

拜拜、爱过 提交于 2020-02-12 21:12:18

java 多态

多态是实现代码重用的一种机制。

  • 重载:调用一系列具有相同名称的方法,这些方法可根据传入参数的不同而得到不同的处理结果,这属于静态多态,在代码编译阶段就确定下来。
  • 动态多态:在程序运行阶段才能体现出来。简称为多态。
  • 多态存在的前提:1.要有继承关系;2.子类要重写父类方法;3.父类引用指向子类。
  • 向上转型:父类对象通过子类对象实例化。
  • 向下转型:父类对象转换为子类对象,但必须强制转换。
//一、向上转型:
class Animal {
	int age = 10;
	public void eat() {
		System.out.println("动物吃东西");
	}
	public void shout() {
		System.out.println("动物在叫");
	}
	public static void run() {
		System.out.println("动物在跑");
	}
}
class Dog extends Animal {//满足了:1.要有继承关系
	String name = "dog"; 
	public void eat() {//满足了:2.子类要重写父类方法
		System.out.println("dog is eating");
	}
	public static void run() {
		System.out.println("dog is running");
	}
	public void watchDoor() {
		System.out.println("dog is watching door");
	}
}
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal a1 = new Dog();//向上转型,满足了:3.父类引用指向子类。
		a1.eat();//输出:dog is eating
		a1.shout();//输出:动物在叫
		a1.run();//输出:动物在跑
		System.out.println(a1.age);//输出:10
        Animal a2 = new Dog();
        a2.watchDoor();//错误,对于子类中存在而父类中不存在的方法,该引用是不能使用的。
        System.out.println(a1.name);//错误,指向子类的父类引用只能访问父类中拥有的方法和属性。
	}
}

由以上代码可以看到向上转型之后,多态的特点:

  • 指向子类的父类引用只能访问父类中拥有的方法和属性。
  • 对于子类中存在而父类中不存在的方法,该引用是不能使用的。
  • 如果子类重写了父类中的某些方法,调用这些方法时,使用的是子类中定义的这些方法。但是如果父类的方法是stasic的,子类是不能够重写父类的这个stasic方法的。

如果想要a1访问子类独有的方法和属性,可以通过向下转型实现:

//二、向下转型:
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal a1 = new Dog();
		Dog d1 = (Dog) a1;//强制类型转换父类对象为子类对象
		d1.eat();//dog is eating
		d1.shout();//动物在叫
		d1.run();//dog is running
        //访问子类独有的方法和属性,此时访问的是子类中的run方法。
		System.out.println(d1.age);//10
		d1.watchDoor();//dog is watching door
        //访问子类独有的方法和属性
		System.out.println(d1.name);//dog
	}

}

向下转型的特点:

  • 可以访问子类和父类中的成员变量和方法。
  • 如果子类没有父类中相应的成员变量或者方法,则调用父类的。
  • 如果子类有父类中相应的成员变量或者方法,则调用子类的。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!