黑马程序员——java基础——面向对象的多态

android培训java培训期待与您交流!

因为多态的应用比较多所以整理一下我对多态的学习。

多态:同一个对象(事物),在不同时刻体现出来的不同状态。

举例:

猫是猫,猫也是动物的子类。

多态的前提:父类的引用类型变量指向了子类的对象,或者是接口的引用类型变量指向了实现类的对象。

1:要有继承关系。

2:要有方法重写。

动物 d = new 猫();
d.eat();
动物 d = new 狗();
d.eat();

3:要有父类引用指向子类对象。
父 f =  new 子();

多态中的成员访问特点:

1:成员变量
编译看左边,运行看左边。

2:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。

3:成员方法
编译看左边,运行看右边。

4:静态方法
编译看左边,运行看左边。

注意:由于成员方法存在方法重写,所以它运行看右边。

多态的好处

提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)

多态的弊端

不能访问子类特有功能

继承关系下的多态代码:
class Animal
{
	String name;//名字
	String color;//颜色
	public Animal(){  //无参构造<span style="font-family: Arial, Helvetica, sans-serif;">函数</span>

	} 
	public Animal(String name,String color){   <span style="font-family: Arial, Helvetica, sans-serif;">//带两个参数的构造函数</span>

		this.name=name;
		this.color=color;
	}

	public void eat(){
		System.out.println(name+"在吃东西");
	}
}
class Dog extends Animal{

	public Dog(String name,String color){
		super(name,color);
	}
	public void run(){
		System.out.println(name+"四只腿跑的飞快");
	}
}
class Fish extends Animal{

	public Fish(String name,String color){
		super(name,color);
	}
	public void run(){
		System.out.println(name+"在水里游来游去");
	}
}<pre name="code" class="java">public class Test1 
{
	public static void main(String[] args) 
	{
		Animal a1=new Dog("哈士奇","白色");
		Dog d=(Dog)a1;
		d.eat();
		d.run();

		Animal a2=new Fish("鲤鱼","白色");
		a2.eat();
	}

}
 
 
继承关系下的多态内存图:

接口实现关系下的多态代码

//定义人的接口
interface Person
{	
	//定义人吃饭的方法
	public abstract void eat();
}

class Teacher implements Person{
	String name; //姓名
	int age;	//年龄
	public Teacher(){
	}
	public Teacher(String name,int age){
		this.name=name;
		this.age=age;
	}
	public void eat(){
		System.out.println(name+"在家里吃着美味的午饭");<span style="white-space:pre">	</span><span style="font-family: Arial, Helvetica, sans-serif;">//实现接口的抽象方法</span>

	}
}

class Student implements Person
{
	String name; //姓名
	int age;	//年龄
	public Student(){
	}
	public Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	public void eat(){
		System.out.println(name+"在外面吃着地沟油饭菜"); //实现接口的抽象方法
	}
}

public class Test2 
{
	public static void main(String[] args) 
	{
		Person p1=new Teacher("张老师",34);  //接口的引用类型变量指向了实现类的对象
		p1.eat();

		Person p2=new Student("李同学",24); //<span style="font-family: Arial, Helvetica, sans-serif;">接口的引用类型变量指向了实现类的对象</span>

		p2.eat();
	}
}

接口实现关系下的多态内存图


多态的应用场景:
1:多态可以作为形参,接受范围更广的对象,避免函数重载过度使用。
2:多态可以作为返回值类型


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值