多态

多态

可以理解为一个事物的多种形态,也就是说一个子类对象既可以给子类成员赋值,也可以给父类的成员赋值。

多态的最终体现为父类的引用变量指向子类对象。

多态的前提是必须有子父类关系或者是实现接口的关系,否二无法完成多态。

在创建多态的父类引用变量调用方法时,运行的是子类重写后的方法。Person p = new Student();p.show();该方法调用的是子类重写后的方法

多态的定义格式

定义多态对象的格式:

类的定义:父类类型 对象名 = new 子类对象();

                  对象名.方法();//调用后必须是子类重写后的方法

抽象类的定义:抽象类父类类型 对象名 = new 子类对象();

                            对象名.方法();//调用后必须是子类重写后的方法

接口的定义格式:接口类型 对象名 = new 实现类对象();

                          对象名.方法();//调用后必须是子类重写后的方法

多态中成员的特点

多态中成员变量的特点:

编译时,看父类中有没有这个变量,如果有,编译成功,没有,编译失败

运行时,运行的是父类中的变量

简言之,编译运行都父类

多态中成员方法的特点:

编译时,看父类中有没有这个方法,如果有,编译成功,没有,编译失败

运行时,运行的是子类中重写后的方法。

简言之,编译看走边,运行看右边

instanceof关键字

该关键字的作用:用于引用数据类型的比较判断,创建一个多态对象,比较这个对象是不是子类对象,比如:Person p = new Student();判断这个p是不是Student对象,如果是,返回true,不是返回false,格式如下:

//创建子类的多态对象

Person p = new Student();

//判断这个P是不是Student

boolean b = p instanceof Student;

结果返回的是true

boolean b = p instanceof Teacher;

运行返回的是false

多态的转型

多态和基本数据类型一样,都需要数据的转型,但稍有区别。

向上转型(自动提升):这种情况不需要我们自己操作,它会自动进行转型,比如

Person p = new Student();

p.sleep();

他会自动转型,这种的缺点在于,只能调用他们的公共方法,子类特有的方法不能调用,这时就需要对该类型进行向下转型

向下转型(强制转换):

Person p = new Student();

Student s = (Student)p;

s.study();

这样就可以调用子类特有的学习方法了。

多态转型的案例

l  动物类

package cn.itcast.duotai;
/*
 * 定义一个抽象的动物类
 * 定义一个抽象的吃的方法
 */
public abstract class Animal {
   //定义一个抽象的吃的方法
   public abstract void eat();
}


l  猫类

package cn.itcast.duotai;
/*
 * 定义猫的类继承动物类
 * 重写父类吃的方法
 * 定义猫特有的方法
 */
public class Cat extends Animal{
   //重写父类吃的方法
   public void eat(){
      System.out.println("猫吃猫粮");
   }
   //定义猫特有的方法
   public void catchMice(){
      System.out.println("猫会抓老鼠");
   }
}


l  狗类

package cn.itcast.duotai;
/*
 * 定义狗的类继承动物类
 * 重写动物类吃的方法
 * 定义狗特有的方法
 */
public class Dog extends Animal{
   //重写动物类吃的方法
   public void eat(){
      System.out.println("狗吃狗粮");
   }
   //定义狗特有的方法
   public void lookHome(){
      System.out.println("狗会看家");
   }
}


l  测试类

package cn.itcast.duotai;
/*
 * 测试类
 * 创建猫,狗的多态对象,调用他们特有的方法
 * 将对象进行强制转换,调用猫,狗特有的方法
 */
public class Test {
   public static void main(String[] args) {
      //创建猫,狗的多态对象,调用他们特有的方法
      Animal a1 = new Cat();
      Animal a2 = new Dog();
      a1.eat();
      a2.eat();
      //将对象进行强制转换,调用猫,狗特有的方法
      Cat c = (Cat)a1;
      c.catchMice();
      Dog d = (Dog)a2;
      d.lookHome();
   }
}


案例

电脑的功能是开机,关机功能,它有USB接口,可以接入许多的外接设备,比如键盘,鼠标,将这个事物在代码中体现出来:

l  电脑类

package cn.itcast.computerDemo;
/*
 * 定义电脑类
 * 功能:打开电脑,关闭电脑,调用USB的功能
 */
public class Computer {
   //打开电脑
   public void openComputer(){
      System.out.println("开启电脑");
   }
   //关闭电脑
   public void closeComputer(){
      System.out.println("关闭电脑");
   }
   //调用USB的功能
   public void useUSB(USB usb){
      usb.open();
      usb.close();
   }
}


l  USB接口类

package cn.itcast.computerDemo;
/*
 * 定义usb接口
 * 抽象概念,打开,关闭
 */
public interface USB {
   public abstract void open();
   public abstract void close();
}


l  鼠标类

package cn.itcast.computerDemo;
/*
 * 定义鼠标类实现接口
 * 重写接口功能
 */
public class Mouse implements USB{
   public void open(){
      System.out.println("打开鼠标");
   }
   public void close(){
      System.out.println("关闭鼠标");
   }
}


l  键盘类

package cn.itcast.computerDemo;
/*
 * 定义键盘类实现接口类
 * 重写接口中的方法
 */
public class keyBoard implements USB{
   //重写接口中的方法
   public void open(){
      System.out.println("打开键盘");
   }
   public void close(){
      System.out.println("关闭键盘");
   }
}


l  测试类

package cn.itcast.computerDemo;
/*
 * 测试类
 */
public class Test {
   public static void main(String[] args) {
      //创建电脑的对象
      Computer c = new Computer();
      c.openComputer();
      //调用鼠标的功能
      c.useUSB(new Mouse());
      //调用键盘的功能
      c.useUSB(new keyBoard());
      c.closeComputer();
   }
}


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章