面向对象---多态

多态:

可以理解为事物存在的多种体现形态。

比如:人:男人,女人

多态的体现:

父类的引用指向了自己的子类对象。

父类的引用也可以接受自己的对象


public class Demo44 {

	public static void main(String[] args){
//		Cat1 cat=new Cat1();
//		cat.eat();
		function(new Cat1());
		
	}
	public static void function(Animal1 a){//Animal1 cat=new Cat();父类的引用指向了自己的子类对象。
		a.eat();
	}
}

abstract class Animal1{
	abstract void eat();
}

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

class Dog1 extends Animal1{
	public void eat(){
		System.out.println("吃骨头");
	}
}

//如果想要调用猫的特有方法,如何操作?
//强制将父类的引用,转成子类类型。

public class Demo44 {

	public static void main(String[] args){
		Animal1  cat=new Cat1();//类型提升,向上转型
		function(new Cat1());
		
		//如果想要调用猫的特有方法,如何操作?
		//强制将父类的引用,转成子类类型。
		Cat1 cat1=(Cat1) cat;
		cat1.catchMouse();
		
	}
	public static void function(Animal1 a){//Animal1 cat=new Cat();
		a.eat();
	}
}

abstract class Animal1{
	abstract void eat();
}

class Cat1 extends Animal1{
	public void eat(){
		System.out.println("吃鱼");
	}
	public void catchMouse(){
		System.out.println("捉老鼠");
	}
}
下面的操作是错误的,就是经父类对象转成子类类型。
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被转换。

Animal1 a=new Animal1();
Cat1 c=(cat1)a;

注意:自始至终多态都是子类对象在做着变化。


public class Demo44 {

	public static void main(String[] args){
		function(new Cat1());	
	}
	public static void function(Animal1 a){//Animal1 cat=new Cat();
		a.eat();
		if(a instanceof Cat1){//判断a 是否是Cat1 类型的
			Cat1 c=(Cat1) a;
			c.catchMouse();
		}else if(a instanceof Dog1){//判断a 是否是Dog1 类型的
			Dog1 d=(Dog1) a;
			d.kanjia();
		}
	}
}

abstract class Animal1{
	abstract void eat();
}

class Cat1 extends Animal1{
	public void eat(){
		System.out.println("吃鱼");
	}
	public void catchMouse(){
		System.out.println("捉老鼠");
	}
}

class Dog1 extends Animal1{
	public void eat(){
		System.out.println("吃骨头");
	}
	
	public void kanjia(){
		System.out.println("看家");
	}
}

输出结果为:

吃鱼

捉老鼠


多态的前提

必须是类与类之间有关系,要么继承,要么实现。

通常还有一个前提,存在覆盖。

多态的好处

多态的出现大大的提高了代码的扩展性。

多态的弊端

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

多态的应用

需求:

1、基础班学生:

学习、睡觉

2、高级版学生

学习、睡觉

可以将这两类事物进行抽取。

public class Demo45 {
	public static void main(String[] args) {
	
//		BaseStudent bs=new BaseStudent();
//		bs.study();
//		bs.sleep();
//		AdvStudent ad=new AdvStudent();
//		ad.study();
//		ad.sleep();
		doSomething(new BaseStudent());
		doSomething(new AdvStudent());
	}
	
	public static void doSomething(Student3 s){
		s.study();
		if(s instanceof BaseStudent){
			BaseStudent b=(BaseStudent) s;
			s.sleep();
		}else if(s instanceof AdvStudent){
			AdvStudent ad=(AdvStudent) s;
			s.sleep();
		}
	}

}

abstract class Student3{
	public abstract void study();
	public abstract void sleep();
}

class BaseStudent extends Student3{
	public void study(){
		System.out.println("base study");
	}
	public void sleep(){
		System.out.println("lying sleeep");
	}
}

class AdvStudent extends Student3{
	public void study(){
		System.out.println("adv study");
	}
	public void sleep(){
		System.out.println("siting study");
	}
}

运行结果如下:

base study
lying sleeep
adv study
siting study

改进的另一种方法:

public class Demo45 {
	public static void main(String[] args) {
	
//		BaseStudent bs=new BaseStudent();
//		bs.study();
//		bs.sleep();
//		AdvStudent ad=new AdvStudent();
//		ad.study();
//		ad.sleep();
		DoStudent ds=new DoStudent();
		ds.dosome(new BaseStudent());
		ds.dosome(new AdvStudent());
	}
	
//	public static void doSomething(Student3 s){
//		s.study();
//		if(s instanceof BaseStudent){
//			BaseStudent b=(BaseStudent) s;
//			s.sleep();
//		}else if(s instanceof AdvStudent){
//			AdvStudent ad=(AdvStudent) s;
//			s.sleep();
//		}
//	}

}
class DoStudent{
	public void dosome(Student3 stu){
		stu.study();
		stu.sleep();
	}
}

abstract class Student3{
	public abstract void study();
	public abstract void sleep();
}

class BaseStudent extends Student3{
	public void study(){
		System.out.println("base study");
	}
	public void sleep(){
		System.out.println("lying sleeep");
	}
}

class AdvStudent extends Student3{
	public void study(){
		System.out.println("adv study");
	}
	public void sleep(){
		System.out.println("siting study");
	}
}



多态的出现代码中的特点(多态使用的注意事项)










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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值