多态:
子类重写父类方法
1)位置:子类和父类中有同名的方法
2)方法名相同,返回类型和修饰符相同,参数列表相同
方法体不同
多态的优势和应用场合
多态:同一个引用类型,使用不同的实例而执行不同的操作
方法重载也是多态的一种体现.
人的不同肤色不是多态
多态的终极目标:
为了实现统一调用。
多态的两种方式:
多态一:
父类普通类 方法a()
子类普通继承父类 方法a()
多态二:
父类的抽象类 方法是抽象方法a()
子类普通实现 抽象类 重写了抽象方法a()
instanceof 用来判断一个对象是否属于一个类或者实现了一个接口
简单工厂:
通过工厂类 创建子类对象 保存到父类的类型中
■多态可以减少类中代码量
·可以提高代码的可扩展性和可维护性
■向上转型一子类转换为父类,
·自动进行类型转换
■向下转型一父类转换为子类,
·结合instanceof运算符进行强制类型转换
例子:
父类:Pet
package cn.javaoppDay01; public abstract class Pet {
public String name;
public int health=;
public int love=;
public Pet(String name) {
super();
this.name = name;
}
public void print(){
System.out.println("我的名字是"+this.name+"健康值"+this.health+"亲密度"+this.love);
}
public abstract void eat();
}
package cn.javaoppDay01; 狗狗类:Dog
public class Dog extends Pet { public Dog(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void eat() { }
public void catchingFlyDisc(){
System.out.println("狗狗"+super.name+"正在接飞盘");
super.health =super.health-;
super.love =super.love+;
System.out.println("狗狗的健康值为:"+this.health+",亲密值为:"+this.love); } }
package cn.javaoppDay01; public class Penguin extends Pet{
企鹅类:Penguin
public Penguin(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void eat() { }
public void swimming(){
System.out.println("企鹅"+super.name+"正在游泳");
super.health =super.health-;
super.love =super.love+;
System.out.println("企鹅的健康值为:"+this.health+",亲密值为:"+this.love); } }
测试类:
package cn.javaoppDay01; public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub Dog dog=new Dog("啊啊");
dog.catchingFlyDisc();
Penguin penguin=new Penguin("哈哈");
penguin.swimming();
} }
instanceof运算符的使用
作用:用来判断一个对象是否属于一个类或者实现一个接口
类型转换比较
1.
子类转换父类
向上转型
自动转换
2.
父类转换子类
向下转型
使用isntanceof用作比较判定
子类 对象名 = (子类)父类;
使用子类对象
例子:
父类:
/**
*父类 宠物类
*/
public class Pet {
public void eat(){
System.out.println("pet正在吃");
}
}
Cat:猫类
public class Cat extends Pet {
public void eat(){
System.out.println("猫吃猫粮");
} public void ball(){
System.out.println("猫玩球");
}
}
子类:
狗狗类 :
/**
*子类:狗狗类
*/
public class Dog extends Pet{
public void eat(){
System.out.println("狗狗吃狗粮");
} public void catchFlyDisk(){
System.out.println("狗狗玩飞盘");
}
}
子类:
企鹅类:
/** *企鹅类
*/
public class Penguin extends Pet{
public void eat(){
System.out.println("企鹅吃鱼");
} public void swiming(){
System.out.println("企鹅游泳");
}
主人类
/**
*主人类
*/
public class Master { public void feed(Pet pet){
pet.eat();
} //领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换
public Pet getPet(int typeid){
Pet pet=null;
if(typeid==){
pet=new Dog();
}
else if(typeid==){
pet=new Penguin();
}
else if(typeid==)
{
pet=new Cat();
}
return pet;
}
//主人和宠物玩耍的行为
public void play(Pet pet){
if (pet instanceof Dog) {
Dog dog=(Dog)pet;//向下转型
dog.catchFlyDisk();
}else if(pet instanceof Penguin){
Penguin peng=(Penguin)pet;
peng.swiming();
}else if(pet instanceof Cat){
Cat cat=(Cat)pet;
cat.ball();
} } }
测试类:
public class Test { /**
*
*/
public static void main(String[] args) {
//多态的形式1
Dog dog=new Dog(); Penguin peng=new Penguin(); Cat cat=new Cat();
Master ms=new Master();
ms.feed(dog);
ms.feed(peng);
ms.feed(cat); //多态的形式2:父类做类型,子类实例化
Pet pet=new Dog();//自动转换
pet.eat(); //调用领养宠物 形式3:父类作为方法的返回类型
System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) ");
Scanner input=new Scanner(System.in);
int xz=input.nextInt();
Master dx=new Master();
Pet pets=dx.getPet(xz);
pets.eat(); dx.play(dog); } }