多态

多态

多态可以实现java程序中的动态编译,提高可扩展性。

多态的含义是”一种定义,多种实现“,顾名思义,就是实现多功能的目的。就像"+"号,当和数字在一起时,就代表将两个数相加,当和字符串在一起时,代表将两者相连。

即同一方法可以根据发送对象的不同而采用多种不同的行为方式。

一个对象的实际类型是确定的,但可以指向对象的引用类型有很多。

多态是建立在继承的重写之上的,在子类重写父类的方法后,才会产生多态,所以只有方法有多态,属性是没有多态的。


父类引用,指向子类的类型(向上转型)

在初期实例化时,通过 A a = new A;的方式创建对象。这里的a只是指向 "="符号后面的这个A的对象,相当于用new产生了一个对象,给这个对象起一个名字叫a, 或者起任何名字。而反之a也可以用来命名其他的对象,所以,在A类产生一个子类 B类的时候,就可以通过父类直接指向子类 A a = new B; 这样这里原本指向A类对象的a就变为指向子类对象B了。

这里 A a = new B; "A"是引用类型,"B"是实际类型,在new B 的时候,实际类型是确定了的,就是创建B的对象,但引用类型就不确定了,所以可以用父类a 来指向子类 B。

显示类型转换(向下转换)

程序能执行的方法是看左边的父类A是否存在这个方法,如果这个方法被子类B重写,就调用子类B的方法,如果只存在于子类B中,则需要((B)a).方法名; 来强行转换类型。将父类转换为子类。子类为低级,父类为高级。和基本数据类型的转换相同,在低转高的时候,可以直接转换。但高转低,需要强行转换。

需要注意!!父类可以直接指向子类,但子类不能直接指向父类。


父类

package oop.Demo05;

public class Person {

   public void run(){
       System.out.println("父类");
  }
}

子类

package oop.Demo05;

public class Student extends Person{

   @Override
   public void run() {//方法重写
       System.out.println("子类");
  }
   public void name(){
       System.out.println("zilei");
  }
}

测试类

package oop;

import oop.Demo05.Person;
import oop.Demo05.Student;

public class Application {
   public static void main(String[] args) {
       Person f = new Student();//父类引用指向子类
       Student s = new Student();
       Object g = new Student();//Object是所有类的父类,所以也是父类指向子类


      ((Student)f).name();//将person强行转换为Student类型。输出结果 zilei
       s.name();//输出结果 zilei
       f.run();//由于子类重写了父类的run方法。所以输出结果 子类
       s.run();//输出结果 子类
  }
}

 

 

 

原文地址:https://www.cnblogs.com/jinweichaoyouqu/p/13997034.html