特征四----多态
方法重载(overload)
问题提出:编写一个类,可以接受两个证书,返回两个数种较大的数?
如果要求可以接受两个float型的书,返回较大数
如果要求接受三个int型的数,返回最大数
package com.panhui;
public classdemo9_20_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ABCa= newABC();
System.out.println(ABC.getMax(2,3));
}
}
class ABC
{
//返回较大的整数
//注意:方法要设置成静态的,这样才能被共用。
public static int getMax(int i,int j)
{
if(i > j)
{
return i;
}
else
{
return j;
}
}
//返回浮点型
public static float getMax(floata,float b)
{
if(a> b)
{
return a;
}
else
{
return b;
}
}
}
结果
如果调用的时候写成getMax(12,4.5f);那么调用的方法是下面一个。因为会自动有低精度想高精度转。
概念
就是类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。
注意事项
1, 方法名是相同的
2, 方法的参数类型,个数,顺序至少有一项是不同的。
如果一个方法:public static float getMax(float a,float b)
另一个方法:public static float getMax(float c,float d)
那么编译器会报错,不复回上面的要求。
3, 方法返回类型可以不同
如果只是返回的类型不一样,是不可以构成重载。
4, 方法的修饰符可以不同
如果只是控制访问符不一样的话,也是不可以构成重载。
方法覆盖(overwrite)
既然子类可以继承父类的属性和方法,这样可以提高的代码的复用性。
那么,如果有三个类,猫,狗,猪,父类是动物,然后继承
问题:怎么解决子类和父类方法的异同。
理解:方法覆盖就是,子类重新写一个方法,不用父类的方法,类名可以和父类的方法相同,(细节不深究)。
如下代码:
package com.panhui;
public classdemo9_20_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一只猫
Catcat1= newCat();
cat1.cry();
//创建一只狗
Dogdog1= newDog();
dog1.cry();
}
}
//动物类
class Animal
{
intage;
String name;
//都会叫,
publicvoidcry()
{
System.out.println("我是动物,不知道怎么叫唤!");
}
}
// 猫类
class Cat
{
//覆盖父类
public void cry()
{
System.out.println("猫猫叫");
}
}
//狗类
class Dog
{
public void cry()
{
System.out.println("狗狗叫");
}
}
结果:
注意事项:
1, 子类的方法的返回类型,参数,方法名称,要和父类方法的返回类型,参数,方法名称完全一样,否则编译出错
2, 子类方法不能缩小父类方法的访问权限
正题:多态
理解:指向通过指向父类的指针,来调用在不同子类中实现的方法。
主人喂食,调用不同类中的方法体现出,喂的哪个动物,喂的是什么食物。
package com.panhui;
public classdemo9_20_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
Catcat = new Cat();
cat.cry();
Dogdog = new Dog();
dog.cry();
//多态的体现。取决于等号的右边。
Animalan = new Cat();
an.cry();
an= new Dog();
an.cry();*/
Mastermaster= newMaster();
master.feed(new Dog(),new Bone());
master.feed(new Cat(),new Fish());
}
}
class Master
{
//给动物喂食,使用多态,方法就可以用一个就行了
public void feed(Animal an,Food f)
{
an.eat();
f.showname();
}
}
class Food
{
Stringname;
public void showname()
{
}
}
class Fish extends Food
{
public void showname()
{
System.out.println("鱼");
}
}
class Bone extends Food
{
public void showname()
{
System.out.println("骨头");
}
}
//动物类Animal
class Animal
{
private int age;
private String name;
publicString getName() {
return name;
}
public void eat() {
// TODO Auto-generated method stub
}
public void setName(String name) {
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age) {
this.age = age;
}
//动物会叫
public void cry()
{
System.out.print("不知道怎么叫!");
}
}
//
class Cat extendsAnimal
{
//猫自己叫
public void cry()
{
System.out.print("猫猫叫!");
}
public void eat()
{
System.out.print("猫吃鱼!");
}
}
class Dog extendsAnimal
{
//猫自己叫
public void cry()
{
System.out.print("狗狗叫!");
}
public void eat()
{
System.out.print("狗吃骨头!");
}
}
结果
多态的注意事项
java 允许父类的引用变量引用它的子类的实例
Animal animal =new Cat();