黑马程序员_多态

            ------ android培训java培训、java基础学习技术总结、期待与您交流! ----------

      多态:可以理解为一个事物具有多中体现的形态
      人:男人、女人
      动物:猫、狗
      猫 mao=new 猫();
      动物 dw=new 猫();
      多态在对对象上的体现
      函数也具有多态性
      1.多态的体现
      父类的引用指向了自己的子类对象
      父类的引用也可以接收自己的子类对象
  
      main函数是程序的调用者,相当于我们的客户端。
     2. 多态的前提条件
      必须是类与类之间有关系,要么继承,要么实现。
      3.多态的好处
       多态的出现大大的 提高了代码的拓展性
    改写已经写好的类  违背了描述显示生活中事物的规律
    实现了后期拓展性
    4.多态的弊端
    提高了拓展性,但是只能使用父类引用去访问父类中的成员
    类型转型
    1.向上转型
    将子类类型自动提升为父类类型
    2.向下转型
    如果想要调用子类的特有方法时,可以把引用强制转型成子类引用
    在强制转型时,不能将父类对象强转成子类对象,或者将其他对象转成该对象
    多态至始至终都是子类对象在做变化
    如何使用子类中特有的方法
        向下转型
    多态使用的注意事项
    5.多态的应用
    6.多态成员变量的特点
    非静态函数的特点
    编译时期参阅引用变量所属的类中是否有调用方法,如果有,编译通过;
    如果没有,编译失败
    在运行时期,参阅对象所属的类是否有调用方法
    简单总结就是,成员函数在多态调用时,编译看左边,运行看右边。
    静态成员函数的特点
    无论编译和运行都参考左边(静态函数的覆盖在开发过程中不太会出现)
    静态方法不需要调用对象中的变量,被存放在静态方法区
    静态方法不参考左边的对象
    静态绑定为静态绑定
    非静态绑定为动态绑定
   
    在多态中,成员变量的特点,无论是编译还是运行,
    都参考左边(引用变量所属的类)。

    示例1如下:

abstract class Animal {
	public abstract void eat();
}

class Cat extends Animal {
	public void eat() {
		System.out.println("吃鱼");
	}

	public void catchMouse() {
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal {
	public void eat() {
		System.out.println("啃骨头");
	}

	public void kanjia() {
		System.out.println("看家");
	}
}

class Pig extends Animal {
	public void eat() {
		System.out.println("吃饲料");
	}

	public void gongdi() {
		System.out.println("拱地");
	}
}

public class DuoTaiDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal an1 = new Cat();
		Animal an2 = new Dog();
		Animal an3 = new Pig();
		function(an1);
		function(an2);
		function(an3);
	}

	public static void function(Animal an) {
		if (an instanceof Cat) {
			an.eat();
			((Cat) an).catchMouse();
		} else if (an instanceof Dog) {
			an.eat();
			((Dog) an).kanjia();
		} else if (an instanceof Pig) {
			an.eat();
			((Pig) an).gongdi();
		}
	}
}

 示例2如下:

abstract class Student{
	public abstract void study();
	public void sleep(){
		System.out.println("躺着睡!");
	}
}
class Yure extends Student{
	public void study(){
		System.out.println("基础学习!");
	}
	public void sleep(){
		System.out.println("坐着睡!");
	}
}
class Jiuye extends Student{
	public void study(){
		System.out.println("提升学习!");
	}
}
public class DuotaiDemo2 {
	public static void main(String[] args) {
		doSome(new Yure());
		doSome(new Jiuye());
	}
	public static void doSome(Student stu){
		stu.study();	
		stu.sleep();	
	}
}

 

            ------ android培训java培训、java基础学习技术总结、期待与您交流! ----------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值