多态

1.多态:

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

2.实现条件:

Java实现多态有三个必要条件:继承、重写、向上转型。
     1.继承:在多态中必须存在有继承关系的子类和父类。

     2.重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

     3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

对于Java而言,它多态的实现机制遵循一个原则:

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

2.1实现形式

在Java中有两种形式可以实现多态。继承和接口。

2.2基于继承实现的多态
public class Wine {
   public void fun1(){
       System.out.println("Wine 的Fun.....");
       fun2();
   }
   
   public void fun2(){
       System.out.println("Wine 的Fun2...");
   }
}

public class JNC extends Wine{
   /**
    * @desc 子类重载父类方法
    *        父类中不存在该方法,向上转型后,父类是不能引用该方法的
    * @param a
    * @return void
    */
   public void fun1(String a){
       System.out.println("JNC 的 Fun1...");
       fun2();
   }
   
   /**
    * 子类重写父类方法
    * 指向子类的父类引用调用fun2时,必定是调用该方法
    */
   public void fun2(){
       System.out.println("JNC 的Fun2...");
   }
}

public class Test {
   public static void main(String[] args) {
       Wine a = new JNC();
       a.fun1();
   }
}
2.3基于接口实现的多态
package data;
//创建一个food接口
interface food
{
	public void getname();
	public void eat();
}
//创建一个fruit接口,继承于food接口
interface fruit extends food
{
	//此接口继承了父接口的方法
}
//创建一个meat接口,继承于food接口
interface meat extends food
{
	//此接口继承了父接口的方法
}
//ora描述的是橘子,继承于fruit接口
class ora implements fruit
{
	public void eat()
	{
		System.out.println("此方法是吃橘子的方法");
	}
	public void getname()
	{
		System.out.println("吃的水果名称为橘子");
	}
}
//hotpot类描述的是羊肉,继承于meat接口
class hotpot implements meat
{
	public void eat()
	{
		System.out.println("此方法是吃羊肉的方法");
	}
	public void getname()
	{
		System.out.println("吃的肉名称为羊肉");
	}
}
//test类描述的是实现多态接口
public class test 
{
	public static void main(String[] args)
	{
		food f1=new ora();
		f1.eat();
		f1.getname();
		food f2=new hotpot();
		f2.eat();
		f2.getname();
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值