Java学习很多年了,但精髓难以掌握,今天就将自己真正理解的章节阐述下,今天介绍下多态。
一、多态
从字面上理解,多态就是一种类型表现为多种形态。Java中多态性分为两类。
(1)方法多态性
体现在方法重载和重写上,重载是值同一个方法名称,根据传入参数的类型、个数、顺序的不同,所调用的方法不同(说白了根据传入参数类型找对应方法)
方法的覆写,指的是子类继承父类,子类和父类有同一个方法名(类型、个数、顺序完全相同),然后子类实例化赋给父类实例化,父类实例再调用子类方法
名,如果有多个子类继承父类,方法名都相同但功能不同,这样父类可以根据同一个方法完成不同功能的实现。(意思后续根据多态语句例子再理解下)
(2)对象多态性
体现在父子类对象之间的转型上
通过赋值后,父对象就可以根据当前被赋值的不同子对象,以子对象的特性加以运作。根据多态,相同的父类信息,发送给不同的子对象,每个子对象表现出
不同的形态。如 a,b,c都继承 f ,他们四个都有move()同名不同功能的方法(如输出不同),然后 f f1; a a1 = new a(); 赋值:f1 = a1。这时候f.move()
就是a的功能方法,同理b的和c的方法都可以被f访问到。
二、程序例子
(1)多态基本概念
class Person
{
public void fun1()
{
System.out.println(“父类方法fun1()”);
}
public void fun2()
{
System.out.println("父类方法fun2()");
}
}
class Student extends Person
{
public void fun1()
{
System.out.println("子类方法fun1()");
}
public void fun3()
{
System.out.println(子类方法fun3());
}
}
public class Test
public static void main(String[] args)
{
Person p = new Student();
p.fun1();
p.fun2();
}
运行以上输出:
子类方法fun1()
父类方法fun2()
解释:Person p = new Student(); 声名一个子类对象赋值给父类对象,这就是向上转型,然后p.fun1();调用子类方法(子类和父类同名方法,子类覆写了父类方法),p.fun2(); 因为子类没有fun2()方法,所以所以直接访问父类自己的fun2()方法
(2)方法多态性
方法多态性其实就是重载。
public class Ploy
{
void sum(int i)
{
System.out.println(“数字和为: ”+i);
}
void sum(int i,int j)
{
System.out.println("数字和为: "+(i+j));
}
public static void main(String[] args)
{
Ploy p = new Ploy();
p.sum(1);
p.sum(2,2);
}
输出结果:
1
4
以上很容易理解,根据传入的参数来选择方法,然后得出对应传参的结果。
(3)使用多态
以下是多态的实例了,理解了此程序就是理解了多态。
class Animal{
public void move(){
System.out.println("动物运动");
}
}
class Fish extends Animal{
public void move(){
System.out.println("鱼儿游");
}
}
class Bird extends Animal{
public void move(){
System.out.println("鸟儿非");
}
}
class Horse extends Animal{
public void move(){
System.out.println("马儿跑");
}
}
public class TestPloy{
public static void main(String[] args){
Animal a;
Fish f = new Fish();
Bird b = new Bird();
Horse h = new Horse();
a=f;
a.move();
a=b;
a.move();
a=h;
a.move();
}
}
输出结果:
鱼儿游
鸟儿飞
马儿跑
根据以上输出结果可以看出,理解多态其实就是继承的反向的意思。继承是子类可以访问父类方法,多态是通过实例化赋值后父类访问子类同名方法。最后实现父类根据被哪个子类赋值了,输出哪个子类同名方法,看似多种形态的意思啦。
总而言之,多态条件:
1.子类继承父类
2.父子方法名都相同
3.子类实例化赋值给父类实例化
最后父类访问子类不同的方法,输出不同。yeah
标签:子类,void,多态,父类,方法,public From: https://www.cnblogs.com/yangcheng01/p/yangcheng01.html