`
fuquan
  • 浏览: 26989 次
文章分类
社区版块
存档分类
最新评论

三.Java的多态性

阅读更多

3.1 多态性的含义


通过类型转换,把一个对象当作它的基类对象对待。
从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理。
测试例子:

public class Game
{
	public void play()
	{
	}
}


class Football extends Game
{
	@Override
	public void play()
	{
		System.out.println("踢足球");
		super.play();
	}
}
//...Basketball
//...Tennis
调用:
Game football = new Football();
Game basketball = new Basketball();
Game tennis = new Tennis();
football.play();
basketball.play();
tennis.play();

输出:
踢足球
打篮球
打网球


可以看出football,basketball,tennis都是Game类型的,而且他们都调用play()这个方法,但是有不用的输出,这就是多态性,
由于多态性,一个父类的引用变量可以指向不同的子类对象,并且在运行时根据父类引用变量所指向对象的实际类型执行相应的子类方法。
在java中,多态性是依靠动态绑定实现的,即Java虚拟机在运行时确定要调用哪一个同名方法。
所以一个父类的引用变量可以指向不同的子类对象,并且在运行时根据所指向对象的实际类型执行相应的子类方法。
正是如此,所以上例中的对象对同样的消息(paly()方法),做出不同的响应。


动态分为2中:
(1) 编译时多态:编译时动态重载
(2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖


3.2 重写Overriding和重载Overloading



方法的重写和重载是Java多态性的不同表现。


重写Overriding
重写是父类与子类之间多态性的一种表现,子类定义的方法与父类中的方法拥有相同的名称和参数,这就是重写,也成为覆盖。
重载Overloading
重载是一个类中多态性的一种表现,即一个类中可以有同名的方法,只要他们的参数不同。


注意:
* 子类方法不能缩小父类方法的访问权限
  * 子类方法不能抛出比父类方法更多的异常
  * 子类可以定义和父类的静态方法同名的静态方法,Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。
  * 父类的非静态方法不能被子类覆盖为静态方法
  * 父类的私有(private)方法不能被子类覆盖
  * 父类的非抽象方法可以被覆盖为抽象方法


3.3 向上转型和向下转型



(1)向上转型:
通过将子类对象赋值给父类对象引用变量来实现动态方法调用。也就是向上转型,向上转型是自动的。
如:
Game football = new Football();


(2)向下转型:
向下转型不是自动的,需要强制转换。
Game game = new Football();
Football football = (Football) game;//向下转型
football.play();
因为game的实际类型是Football,所以这样的向下转型是安全的。
而如果:
Game game = new Game();
Football football = (Football) game;
则会报错ClassCastException,父类是不能强制转换为子类的,因为子类有的方法父类可能没有。
简单点说,足球是一个运动项目,但是运动项目不等于就是足球。


为什么需要向下转型?
public class Game
{
}


class Football extends Game
{
	public void play()
	{
		System.out.println("踢足球");
	}
}



假如这样调用:
Game game = new Football();
game.play();
错误:The method play() is undefined for the type Game
play()在Game这个类中并没有定义,因为game是Game类型的。


3.4 Java中强制的多态



强制多态隐式的将参数按某种方法,转换成编译器认为正确的类型以避免错误。
2.0 + 2.0
将两个double的操作数相加;Java中特别声明了这种用法。
2.0 + 2
将double和int的操作数相加。Java中没有明确定义这种运算。编译器隐式的将第二个操作数转换为double型,并作double型的加法。
2.0 + "2"
将double与一个String相加。Java中同样没有定义这样的操作。所以,编译器将 double转换成String类型,并将他们做串联。





  



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics