多态的优点
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
多态存在的三个必要条件
继承 ,重写,父类引用指向子类对象
比如:
Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:
Test.java 文件代码:
public
class
Test
{
public
static
void
main
(
String
[
]
args
)
{
show
(
new
Cat
(
)
)
;
//
以 Cat 对象调用 show 方法
show
(
new
Dog
(
)
)
;
//
以 Dog 对象调用 show 方法
Animal
a
=
new
Cat
(
)
;
//
向上转型
a
.
eat
(
)
;
//
调用的是 Cat 的 eat
Cat
c
=
(
Cat
)
a
;
//
向下转型
c
.
work
(
)
;
//
调用的是 Cat 的 work
}
public
static
void
show
(
Animal
a
)
{
a
.
eat
(
)
;
//
类型判断
if
(
a
instanceof
Cat
)
{
//
猫做的事情
Cat
c
=
(
Cat
)
a
;
c
.
work
(
)
;
}
else
if
(
a
instanceof
Dog
)
{
//
狗做的事情
Dog
c
=
(
Dog
)
a
;
c
.
work
(
)
;
}
}
}
abstract
class
Animal
{
abstract
void
eat
(
)
;
}
class
Cat
extends
Animal
{
public
void
eat
(
)
{
System
.
out
.
println
(
"
吃鱼
"
)
;
}
public
void
work
(
)
{
System
.
out
.
println
(
"
抓老鼠
"
)
;
}
}
class
Dog
extends
Animal
{
public
void
eat
(
)
{
System
.
out
.
println
(
"
吃骨头
"
)
;
}
public
void
work
(
)
{
System
.
out
.
println
(
"
看家
"
)
;
}
}
多态的实现方式
方式一:重写
方式二:接口
1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。
方式三:抽象类和抽象方法
对于多态,可以总结以下几点:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用);
四、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中"重写"了父类中的变量,那么在编译时会报错。
五、一个方法的参数如果是一个对象类型 他可以接收他所有子类的对象
多态引用时,构造子类对象时的构造方法的调用顺序
1,先调用超类的构造方法,多重超类首先调用最远超类的方法;
2,然后再执行当前子类的构造方法;
调用时需要谨慎处理调用方法
Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:
Test.java 文件代码:
public
class
Test
{
public
static
void
main
(
String
[
]
args
)
{
show
(
new
Cat
(
)
)
;
//
以 Cat 对象调用 show 方法
show
(
new
Dog
(
)
)
;
//
以 Dog 对象调用 show 方法
Animal
a
=
new
Cat
(
)
;
//
向上转型
a
.
eat
(
)
;
//
调用的是 Cat 的 eat
Cat
c
=
(
Cat
)
a
;
//
向下转型
c
.
work
(
)
;
//
调用的是 Cat 的 work
}
public
static
void
show
(
Animal
a
)
{
a
.
eat
(
)
;
//
类型判断
if
(
a
instanceof
Cat
)
{
//
猫做的事情
Cat
c
=
(
Cat
)
a
;
c
.
work
(
)
;
}
else
if
(
a
instanceof
Dog
)
{
//
狗做的事情
Dog
c
=
(
Dog
)
a
;
c
.
work
(
)
;
}
}
}
abstract
class
Animal
{
abstract
void
eat
(
)
;
}
class
Cat
extends
Animal
{
public
void
eat
(
)
{
System
.
out
.
println
(
"
吃鱼
"
)
;
}
public
void
work
(
)
{
System
.
out
.
println
(
"
抓老鼠
"
)
;
}
}
class
Dog
extends
Animal
{
public
void
eat
(
)
{
System
.
out
.
println
(
"
吃骨头
"
)
;
}
public
void
work
(
)
{
System
.
out
.
println
(
"
看家
"
)
;
}
}