java基础---多态

Posted 流着眼泪奔跑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础---多态相关的知识,希望对你有一定的参考价值。

1.什么是多态?

同一个引用类型,使用不同的实例而执行不同操作(父类引用,子类对象)

2.如何实现多态

1-使用多态实现思路

2-编写父类

3-编写子类,子类重写父类方法

运行时,使用父类的类型,子类的对象

向上转型 Pet pet = new Dog(); 自动类型转换

注意:实现多态的两个要素:子类重写父类方法、使用父类的类型

3.实现多态的两种形式

使用父类作为方法形参实现多态

使用父类作为方法返回值实现多态

4.使用父类作为方法形参实现多态

举例:

public class Master{

/*

 * 1.首先在父类提取子类的共同的方法  抽取方法

 * 2.使用多态实现

 *  

 */  

public void feed(Pet pet){

  pet.eat();

}

}

 

 

package text;

public abstract class Pet {

 

/*宠物类*/

private String name;

private int love;

private int health;

 

//默认访问权限

int num;

 

/*

 * get.set

 *

 * */

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getLove() {

return love;

}

public void setLove(int love) {

this.love = love;

}

public int getHealth() {

return health;

}

public void setHealth(int health) {

this.health = health;

}

 

 

 /*

  *

  * 带参数的方法

  *

  * */

public Pet(String name, int love, int health) {

super();

this.name = name;

this.love = love;

this.health = health;

}

 

 

/*

 *

 *

 * 不带参数的方法

 *

 * */

public Pet() {

super();

// TODO Auto-generated constructor stub

}

 

//重写

@Override

public String toString() {

return "Pet [name=" + name + ", love=" + love + ", health=" + health

+ ", num=" + num + "]";

}

//抽象方法

public abstract void print();

 

    //多态

public abstract void eat();

 

}

 

 

package text;

public class Dog extends Pet{

 

private String strain;

/*

 * get.set

 *

 * */

public String getStrain() {

return strain;

}

 

public void setStrain(String strain) {

this.strain = strain;

}

/*

  *

  * 带参数的方法

  *

  * */

public Dog(String name, int love, int health, String strain) {

super(name, love, health);

this.strain = strain;

}

/*

  *

  * 不带参数的方法

  *

  * */

public Dog() {

super();

System.out.println(super.num);  //默认访问权限

// TODO Auto-generated constructor stub

}

//重写

public void print() {

System.out.println("name="+super.getName()+"love="+super.getLove()+"health="+super.getHealth()+"strain="+strain);

}

 

//多态

@Override

public void eat(){

System.out.println("dog eat...");

super.setHealth(getHealth()+3);

}

}

 

 

 

package text;

public class Test {

public static void main(String[] args) {

 

 

//多态

    

    Dog d=new Dog("00",100, 60, "金毛");

    Master m=new Master();

    m.feed(d);

    System.out.println("dog="+d.getHealth());   

}

 

 

}

 

6. 使用父类作为方法返回值实现多态

 

举例:

 

package text2;

public class Master{

public Pet getPet(String typeId){

 Pet p=null;

if (typeId.equals("dog")) {

  p=new Dog("dd",10,10,"金毛");

}else if(typeId.equals("penguin")){

  p=new Penguin();

}

    return p;

  }

}

 

 

package text2;

public class Dog extends Pet{

private String strain;

 

 

/*

 * get.set

 *

 * */

public String getStrain() {

return strain;

}

 

public void setStrain(String strain) {

this.strain = strain;

}

/*

  *

  * 带参数的方法

  *

  * */

public Dog(String name, int love, int health, String strain) {

super(name, love, health);

this.strain = strain;

}

 

 

/*

  *

  * 不带参数的方法

  *

  * */

public Dog() {

super();

System.out.println(super.num);  //默认访问权限

// TODO Auto-generated constructor stub

}

   

//重写

public void print() {

System.out.println("name="+super.getName()+"love="+super.getLove()+"health="+super.getHealth()+"strain="+strain);

}

 

   @Override

   public void eat() {

// TODO Auto-generated method stub

System.out.println("dog eat...");

   }

}

 

 

package text2;

public abstract class Pet {

/*宠物类*/

private String name;

private int love;

private int health;

 

//默认访问权限

int num;

 

/*

 * get.set

 *

 * */

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getLove() {

return love;

}

public void setLove(int love) {

this.love = love;

}

public int getHealth() {

return health;

}

public void setHealth(int health) {

this.health = health;

}

 

 

 /*

  *

  * 带参数的方法

  *

  * */

public Pet(String name, int love, int health) {

super();

this.name = name;

this.love = love;

this.health = health;

System.out.println("父类有参的构造方法");

}

 

 

/*

 *

 *

 * 不带参数的方法

 *

 * */

public Pet() {

super();

System.out.println("父类无参的构造方法");

// TODO Auto-generated constructor stub

}

 

 

//重写

@Override

public String toString() {

return "Pet [name=" + name + ", love=" + love + ", health=" + health

+ ", num=" + num + "]";

}

//抽象方法

public abstract void print();

 

    //多态

public abstract void eat();

 

}

 

 

 

package text2;

public class Penguin extends Pet{

private String gender;

/*

 * get.set

 *

 * */

public String getGender() {

return gender;

}

 

public void setGender(String gender) {

this.gender = gender;

}

 

/*

  *

  * 带参数的方法

  *

  * */

public Penguin(String name, int love, int health, String gender) {

super(name, love, health);

this.gender = gender;

}

 

/*

  *

  * 不带参数的方法

  *

  * */

public Penguin() {

super();

// TODO Auto-generated constructor stub

}

//重写

@Override

public void print() {

System.out.println("name="+super.getName()+"love="+super.getLove()+"health="+super.getHealth()+"strain="+gender);

 

}

 

@Override

public void eat(){

System.out.println("penguin eat...");

 

}

 

}

 

 

 

 

 

 

 

package text2;

public class Test {

public static void main(String[] args) {

 

    

      /*

   * 多态的第二重实现

   * 父类作为返回值

   *  

   */

      Master m=new Master();

      Pet p=m.getPet("dog");

      p.eat();

     }

}

 

7.多态的高级转低级(父类到子类的转换)

 

package test3;

public class Master{

 

public void feed(Pet pet){

/*

 * 主人和宠物玩耍

 * 多态的高级转低级

 * a instanceof b

 * */

 

public void play(Pet pet){

if (pet instanceof Dog) {

Dog d=(Dog) pet;

d.catchingFlyingDisks();

}else if(pet instanceof Penguin){

Penguin p=(Penguin) pet;

p.swimming();

 

}

}

 

}

 

package test3;

public class Dog extends Pet{

private String strain;

/*

 * get.set

 *

 * */

public String getStrain() {

return strain;

}

 

public void setStrain(String strain) {

this.strain = strain;

}

/*

  *

  * 带参数的方法

  *

  * */

public Dog(String name, int love, int health, String strain) {

super(name, love, health);

this.strain = strain;

}

 

 

/*

  *

  * 不带参数的方法

  *

  * */

public Dog() {

super();

System.out.println(super.num);  //默认访问权限

// TODO Auto-generated constructor stub

}

//重写

@Override

public void print() { System.out.println("name="+super.getName()+"love="+super.getLove()+"health="+super.getHealth()+"strain="+strain);

}

 

//多态

@Override

public void eat(){

System.out.println("dog eat...");

super.setHealth(getHealth()+3);

}

 

/*

 *  玩飞盘

 * 狗狗的健康值-10

 * 可爱值 +5

 *

 */

 

public void catchingFlyingDisks(){

System.out.println("狗狗和主人玩劫飞盘的游戏");

super.setHealth(super.getHealth()-10);

super.setLove(super.getLove()+5);

}

 

}

 

package test3;

public class Penguin extends Pet{

private String gender;

/*

 * get.set

 *

 * */

public String getGender() {

return gender;

}

 

public void setGender(String gender) {

this.gender = gender;

}

 

/*

  *

  * 带参数的方法

  *

  * */

public Penguin(String name, int love, int health, String gender) {

super(name, love, health);

this.gender = gender;

}

 

/*

  *

  * 不带参数的方法

  *

  * */

public Penguin() {

super();

// TODO Auto-generated constructor stub

}

//重写

@Override

public void print() {

System.out.println("name="+super.getName()+"love="+super.getLove()+"health="+super.getHealth()+"strain="+gender);

 

}

 

@Override

public void eat(){

System.out.println("penguin eat...");

super.setHealth(super.getHealth()+3);

}

 

/*

 *

 * 游泳

 *

 * */

public void swimming(){

System.out.println("企鹅和主人一起游泳");

super.setHealth(super.getHealth()-20);

super.setLove(super.getLove());

 

}

}

 

 

package test3;

public abstract class Pet {

 

/*宠物类*/

private String name;

private int love;

private int health;

 

//默认访问权限

int num;

 

/*

 * get.set

 *

 * */

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getLove() {

return love;

}

public void setLove(int love) {

this.love = love;

}

public int getHealth() {

return health;

}

public void setHealth(int health) {

this.health = health;

}

 

 

 /*

  *

  * 带参数的方法

  *

  * */

public Pet(String name, int love, int health) {

super();

this.name = name;

this.love = love;

this.health = health;

 

}

 

 

/*

 *

 *

 * 不带参数的方法

 *

 * */

public Pet() {

super();

 

// TODO Auto-generated constructor stub

}

 

 

 

 

 

 

/*

 *

 * 打印print

 *

 * */

 

/*public void print(){

System.out.println("name="+name+"love"+love+"health"+health);

}* / 

@Override

public String toString() {

return "Pet [name=" + name + ", love=" + love + ", health=" + health

+ ", num=" + num + "]";

}

/*抽象方法*/

public abstract void print();

 

    //多态

public abstract void eat();

 

}

 

 

package test3;

public class Test {

public static void main(String[] args) {

    Master m=new Master();

    Pet p1=new Dog("aa",100,100,"土狗");

    Pet p2=new Penguin("q",30,30,"");

    m.play(p1);

    System.out.println(p1.toString());

}

}

心得:public void play(Pet pet)   实现父转子的一个实现

    主人有一个独特的方法-玩,宠物有独特的方法游泳、接飞盘。主人可以和狗狗玩或者企鹅玩,但是它们属于子类中定义的,不是父类中定义的也不是子类重写父类的,不能够直接调用,需要把pet转为dog/penguin

8.总结

1-多态可以减少类中代码量,可以提高代码的可扩展性和可维护性

2-向上转型——子类转换为父类,自动进行类型转换

3-向下转型——父类转换为子类,结合instanceof运算符进行强制类型转换

4-实现多态的两种方式

使用父类作为方法形参实现多态

使用父类作为方法返回值实现多态

 

练习:租车

训练要点:

1.多态的使用

2.使用父类类型作为方法参数

需求说明:

1.在前面汽车租赁系统的基础上,实现计算多种车辆总租金的

功能

2.现在有客户租用

2辆宝马

1辆别克商务舱

1辆金龙(34)座

5天共多少租金?

 

package two;

public abstract class MotorVehicle {

private String no;

private String brand;

private String color;

private String mileage;

 

public MotorVehicle(String no, String brand, String color, String mileage) {

super();

this.no = no;

this.brand = brand;

this.color = color;

this.mileage = mileage;

}

 

 

public MotorVehicle() {

super();

// TODO Auto-generated constructor stub

}

 

 

public String getNo() {

return no;

}

public void setNo(String no) {

this.no = no;

}

public String getBrand() {

return brand;

}

public void setBrand(String brand) {

this.brand = brand;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public String getMileage() {

return mileage;

}

public void setMileage(String mileage) {

this.mileage = mileage;

}

 

/*

 * 計算租賃價格、

 * */

public abstract double calcRent(int days);

 

 

   }

 

 

package two;

public final class Bus extends MotorVehicle{

private int  seatCount;

public int getSeatCount() {

return seatCount;

}

 

public void setSeatCount(int seatCount) {

this.seatCount = seatCount;

}

 

public Bus(String no, String brand, String color, String mileage,

int seatCount) {

super(no, brand, color, mileage);

this.seatCount = seatCount;

}

 

public Bus() {

super();

// TODO Auto-generated constructor stub

}

 

 

    /*

     *

     * 客车租赁价格

     *

     *

     * */

@Override

public double calcRent(int days) {

        double rent=0;

        int seat=this.seatCount;

        if(seat<16) {

         rent=800*days;

        }else {

         rent=1500*days;

        }

return rent;

}

}

 

 

 

 

package two;

/*

 * 小轿车

 * final不可以被继承

 *

 * */

 

public final class  Car extends MotorVehicle{

private String type;

public String getType() {

return type;

}

 

public void setType(String type) {

this.type = type;

}

 

public Car(String no, String brand, String color, String mileage,

String type) {

super(no, brand, color, mileage);

this.type = type;

}

 

public Car() {

super();

// TODO Auto-generated constructor stub

}

 

/*

 * 小轎車租賃方法

 * */

@Override

public double calcRent(int days) {

        double rent=0;

        String type=this.type;

        if(type.equals("550i")) {

         rent=500*days;

        }else if(type.equals("別克商務艙GL8")) {

         rent=600*days;

        }else if(type.equals("別克林蔭大道")) {

         rent=300*days;

        }

return rent;

}

}

 

 

 

 

 

package two;

/*

 * 客戶類

 * */

public class Customer {

 

 private String name;

 private String no;

public Customer(String name, String no) {

super();

this.name = name;

this.no = no;

}

public Customer() {

super();

// TODO Auto-generated constructor stub

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getNo() {

return no;

}

public void setNo(String no) {

this.no = no;

}

/*

 * 計算客戶租車縂租金

 * */

public double calcTotalRent(MotorVehicle[] motos,int days) {

  double rent=0;

  for (int i = 0; i < motos.length; i++) {

        rent+=motos[i].calcRent(days);

  }

  return rent;

}

}

 

 

package two;

public class Test {

    public static void main(String[] args) {

     MotorVehicle[] motos=new MotorVehicle[5];

     motos[0]=new Car("A12345","宝马","red","5w","550i");

     motos[1]=new Car("A12346","别克","red","10w","550i");

     motos[2]=new Car("A12347","别克","red","15w","550i");

     motos[3]=new Bus("A12348","金龙","red","5w",20);

     motos[4]=new Truck("A12349","金杯","red","5w",10);

    

     int days=10;

     Customer c=new Customer();

     double rent=c.calcTotalRent(motos, days);

        System.out.println("5辆车的总租金"+rent);

}

}

 

 

 

心得:  先写一个父类,之后写俩个子类

然后写一个客户类customer,写入计算总租金的方法

      Carbus分别写入各自的计算方法。

 

练习:购置新车

1.训练要点:

使用父类作为方法形参实现多态

使用多态增强系统的扩展性和可维护性

2.需求说明:

新购置了卡车,根据吨位,租金每吨每天50

对系统进行扩展,计算汽车租赁的总租金

 

 

package two;

public class Truck extends MotorVehicle {

 

private  int ton;

 

public int getTon() {

return ton;

}

 

public void setTon(int ton) {

this.ton = ton;

}

 

public Truck(String no, String brand, String color, String mileage, int ton) {

super(no, brand, color, mileage);

this.ton = ton;

}

 

 

@Override

public double calcRent(int days) {

double rent=0;

rent=50*days*days*this.ton;

return rent;

}

}

练习:披萨

package lx1;

//披薩

public abstract class Pizza {

 

 private String name;

 private double price;

 private String size;

public Pizza(String name, double price, String size) {

super();

this.name = name;

this.price = price;

this.size = size;

}

public Pizza() {

super();

// TODO Auto-generated constructor stub

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

public String getSize() {

return size;

}

public void setSize(String size) {

this.size = size;

}

//製作

public abstract  void make();

}

 

 

 

package lx1;

 

public class BaconPizza extends Pizza {

 

  private String kilo;

 

public BaconPizza(String name, double price, String size, String kilo) {

super(name, price, size);

this.kilo = kilo;

}

 

public BaconPizza() {

super();

// TODO Auto-generated constructor stub

}

 

public String getKilo() {

return kilo;

}

 

 

public void setKilo(String kilo) {

this.kilo = kilo;

}

 

@Override

public void make() {

// TODO Auto-generated method stub

System.out.println("name="+super.getName());

System.out.println("price="+super.getPrice());

System.out.println("size="+super.getSize());

System.out.println("kilo="+kilo);

}

}

 

 

 

package lx1;

 

public class SeafoodPizza extends Pizza {

 

 private String ingredient;

 

public SeafoodPizza(String name, double price, String size, String ingredient) {

super(name, price, size);

this.ingredient = ingredient;

}

 

public SeafoodPizza() {

super();

// TODO Auto-generated constructor stub

}

 

public String getIngredient() {

return ingredient;

}

 

public void setIngredient(String ingredient) {

this.ingredient = ingredient;

}

 

@Override

public void make() {

// TODO Auto-generated method stub

System.out.println("name="+super.getName());

System.out.println("price="+super.getPrice());

System.out.println("size="+super.getSize());

System.out.println("ingredient="+ingredient);

}

}

 

 

 

 

package lx1;

public class PizzaFactory {

 /*

  *

  * 工厂

  *

  * */

public void makePizza(Pizza pizza) {

pizza.make();

}

}

 

 

 

package lx1;

public class Test {

public static void main(String[] args) {

  PizzaFactory pf=new PizzaFactory();

  Pizza baconpizza=new BaconPizza("培根", 100, "9", "500g");

  Pizza seafoodpizza=new SeafoodPizza("海鲜", 100, "9", "蝦仁 鱿鱼卷 墨鱼");

  pf.makePizza(baconpizza);

  System.out.println("***************");

  pf.makePizza(seafoodpizza);

  

}

}

以上是关于java基础---多态的主要内容,如果未能解决你的问题,请参考以下文章

Java基础12 类型转换与多态

Java基础——类的多态

阿花宝宝 Java基础笔记 之 多态

Java基础十一--多态

阿花宝宝 Java基础笔记 之 多态区分

java基础多态