扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一、概念
创新互联专注于网站设计制作、成都网站建设、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态(概念是网上抄的,可以不看)。
简单解释:多态就是指方法或对象具有多种形态。它建立在封装和继承之上。
通俗解释:要想解释多态,我们先从创建对象说起。
Dog myDog = new Dog();
在该过程中,有一个重点就是,引用变量的类型和对象的类型必须是一样的。即myDog是Dog类型的,而后面new的对象也要是Dog类型的。
However!在多态中,引用变量的类型和new的对象的类型可以是不一样的!(父类引用指向子类对象)运用多态时,引用变量的类型可以是new出来的对象的父类类型,例如Animal是Dog的父类:
Animal[] animals = new Animal[5]; //创建一个Animal类型的数组
animal[0] = new Dog();
animal[1] = new Cat();
animal[2] = new Wolf();
animal[3] = new Hippo();
animal[4] = new Lion();
多态更强大的地方在于,参数和返回类型也可以多态。(这不就是方法的重载?)
这就表示,可以将不同的对象作为方法的参数,从而判断出使用哪种方法:
Class vet{
public void giveShot(Animal a){
a.makeNoise(); //giveShot这个方法是需要传入Animal类型的对象
}
}
class PetOwner{
public void start(){
Vet v = new Vet();
Dog d = new Dog();
Hippo h = new Hippo();
v.giveShot(d); //执行Dog的makeNoise()方法
v.giveShot(h); //执行Hippo的makeNoise()方法
}
}
public static void main(String[] args){
//方法重载体现多态。因为传入不同的参数就调用不同的sum方法。
A a = new A();
sout(a.sum(10, 20));
sout(a.sum(10, 20, 30));
//方法重写体现多态。因为对象不一样,调用不同的say方法。
B b = new B();
a.say();
b.say();
}
class B{ //父类
public void say(){
sout("B的say()方法被调用");
}
}
class A extends B{ //子类
public int sum(int n1, int n2){
return n1 + n2;
}
public int sum(int n1, int n2, int n3){
return n1 + n2 + n3;
}
public void say(){
sout("A的say()方法被调用");
}
}
二、对象体现多态对象体现多态是多态的核心。同一个父类的引用变量即可使用所有子类的方法,只需修改父类型的引用变量指向的子类实例即可。总结起来就是一句话:父类型的引用变量指向子类的实例化对象。(引用变量就是animal,实例化对象就是后面的new Dog())
Animal animal = new Dog(); //Animal类型的引用变量animal指向了Dog类型的实例。
animal.eat(); //因此这里的eat()方法调用的是Dog类型的eat()方法。
//引用变量的类型一旦确定,就不可以更改,但是指向的实例可以变换。
animal = new Cat(); //animal仍然是Animal类型的引用变量,但现在是指向了Cat类型的实例。
animal.eat(); //因此这里的eat()方法调用的是Cat类型的eat()方法。
三、多态的一个简单例子假设主人要给动物喂食物,如果不用多态,写出来的是这样的:
//给dog喂bone
public void feed(Dog dog, Bone bone){
sout(dog.getName() + "被喂了" + bone.getName())
}
//给cat喂fish
public void feed(Cat cat, Fish fish){
sout(cat.getName() + "被喂了" + fish.getName())
}
采用多态的思想是这样的:
public void feed(Animal animal, Food food){
sout("animal" + animal + "food" + food);
sout(animal.getName() + "吃" + food.getName());
}
四、多态的好处你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流