欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面向对象---多态

程序员文章站 2024-03-17 16:04:22
...

多态:

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

比如:人:男人,女人

多态的体现:

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

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


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");
	}
}



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



面向对象---多态