(java)面向对象 ---- 多态

(1)面向对象共有三个特征:封装、继承、多态

           多态存在的三个必要条件:继承、重写、父类引用指向子类对象

           现实中的事物经常会出现多种形态。如学生是人的一种,一个具体的学生张三,既是学生又是人,即出现了两种形态。java作为面向对象的语言,同样可以描述一件事物的多种形态,如一个Student类继承了Person类,一个Studen对象既是Student又是Person。

(2)多态调用的三种形式

        普通类的多态】

              Studen  s = new  Student();

              Person p  = new Student();

              一个子类对象既可以赋给它的本类类型,也可以赋给它的父类类型

       抽象类的多态

              // 抽象类Animal    子类Cat

              Animal  a =  new CAt();

       接口多态】

              接口   变量    =   new   实现类();

(3)多态中,成员特点 
   成员变量】
      编译的时候,参考父类中有没有这个变量,如果有编译成功,没有编译失败
      运行的时候,运行的是父类中的变量值
   成员方法】
     编译的时候,参考父类中有没有这个方法,如果有编译成功,没有编译失败
     运行的时候,静态方法,运行父类中的静态方法(因为静态属于类,不属于对象)非静态方法时,运行的是子类的重写方法

(4)多态的优点:

1)消除类型之间的耦合关系

2)可替换性

3)配合继承与方法重写提高了代码的复用性与扩展性

4)接口性

5)简化性

6)灵活性

(5)java程序(多态转型案例)

/*    
 *    动物类
 *     方法:eat
 */
public class Animal {
	public void eat(){
		
		System.out.println("动物吃饭");
	}
}

/*
 *    Dog类继承Animal
 *     方法:eat  work
 */
public class Dog extends Animal {
	public void eat(){
		System.out.println("小狗在吃饭");
	}
	
	public void work(){
		System.out.println("看家");
	}
}

/*
 *   Cat类继承Animal
 *   方法: eat work
 */
public class Cat extends Animal {
	public void eat(){
		System.out.println("小猫在吃饭");
	}
	public void  work(){
		System.out.println("逮老鼠");
	}
}

/*
 *    测试类
 *
 */
public class Test {

	public static void main(String[] args) {
		show(new Cat());  // 以Cat对象调用show

		Animal an = new Cat(); // 向上转型
		an.eat();              // 调用的是子类父类共有的方法,运行的是子类中的方法
		                       //an.work(); 编译不成功
		Cat c = (Cat)an;       // 向下转型
		c.eat();               // 调用的是Cat.eat()
		c.work();              // 调用的是Cat.work()
		
	}
	
	public static void show(Animal an){
		
		an.eat();
        // 关键字instanceof :用于判断一个引用类型的变量,是不是这个类型的对象
		if(an instanceof Cat){ // 猫做的work
			Cat c = (Cat)an;   // 向下转型
			c.work();
		}else if(an instanceof Dog){
			Dog d = (Dog)an;
			d.work();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_39781462/article/details/83443832