如何理解Java面向对象的多态

如何理解Java面向对象的多态
       今天学了面向对象,老师用捕鱼达人的例子来为我们讲解了面向对象的运用,其中讲到了多态,现在就来讲讲怎么理解Java面向对象的多态吧。
       首先,我们先来看看多态的概念:多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。
       当然,多态在继承里面用得是比较多的,在继承里面用到的多态简单概括为一句话就是:编译时类型为父类,运行时类型为子类。语法为:父类 = new 子类;比如:你在父类定义了一个方法,如果你在子类里要调用是同一个方法,但是输出的结果和父类的不一样,这里就要用到了多态。这里我们用炮弹爆炸的方法为例:如果定义一个父类炮弹再定义一个子类炮弹来继承父类,复写父类里面的爆炸方法,但是输出不同,用代码实现如下:
父类:
public class Bollet {
	protected void boom(){
		System.out.println("boom!!");
	}
  
}
子类:
public class NormalBollet extends Bollet{
	protected void boom(){
		System.out.println("2");
	}

}
测试类:
public class Test {

	public static void main(String[] args) {
		Bollet bollet = new NormalBollet();
		bollet.boom();

	}

}
      运行结果为2,这是为什么呢?因为从上面的代码我们可以看到首先,我们定义了一个炮弹父类,里面有一个boom方法,方法里面的内容是输出“boom!!”。然后我们定义了一个普通炮弹类,也就是炮弹的子类,里面也有一个boom方法,也就是重写了父类的一个方法,可是里面的内容却是输出“2”。最后我们定义了一个测试类,专门检验代码,顾名思义,这个类里面也就只有一个main方法,里面运用了多态,父类指向子类申请对象,也就是我们之前的那个语法:父类 = new 子类,然后调用了子类里面的boom方法。猜猜结果会是什么呢?
       结果就是输出了“2”,这是为什么呢?且听我细细道来。这是因为在你申请对象时,你申请的是子类对象,相当于对父类的对象作了一个定语,可以理解为父类是子类的父类,但其本质上还是父类。我们就以上面的代码为例,上面的代码可以理解为炮弹是普通的炮弹,但其本质还是一个炮弹,这样是不是好理解一点了呢?
       但是,如果在子类里面再写一个方法,然后用上述代码去调用会出现什么样的情况呢?答案肯定是会报错的,为什么呢?因为虽然申请的是子类对象,但它本质还是一个父类啊,父类里只有其他子类共有的属性,如果是一个子类的特有属性是肯定不能用的啦!如果你实在想用那个方法就只能老老实实地用子类去申请一个子类对象了。
      我对多态的理解就是这么多,如果我有什么不对的地方欢迎指正!!!




你可能感兴趣的:(如何理解Java面向对象的多态)