——多态

本文详细介绍了面向对象编程中多态的概念,包括表现形式、前提条件、好处与弊端,并通过实例讲解了如何在代码中使用多态,以及多态在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

----
多态概述
多态:可以理解为事物存在的多种体现形态。
如:人分为男人和女人。
动物:猫、狗。
猫 x = new 猫();
动物 x = new 猫();
学习多态主要围绕:
1.多态的表现形式。
父类的引用指向了自己的子类对象。
父类的引用接收了自己的子类对象。
2.多态的前提。
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提,存在覆盖。
3.多态的好处。
提高了程序的扩展性。
4.多态的应用。
5.弊端:
提高了扩展性,但是只能用父类的引用访问父类中的成员。
6.多态出现的代码中的特点(多态使用的注意事项)。
代码体现:

描述动物。定义动物类,由于描述的不是具体动物,所以方法具有不确定性,故定义为抽象。

abstract class Animal
{
	 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 gondi(){
		System.out.println("拱地");
	}
}
class DuotaiDemo
{
	public static void main(String[] args){
//		Cat c = new Cat();
//		c.eat();
//		Dog d = new Dog();
//		d.eat();
//		Animal a = new Animal();
//		a.eat();
		function(new Cat());
		function(new Dog());
		function(new Pig());
	}
	public static void function(Animal a){
		a.eat();
	}
}

如何使用子类的特有方法:

class DuoTaiDemo
{
	public static void main(String[] args){
		Animal a = new Cat();//类型提升,向上转型。
		a.eat();//但是不能使用子类的特有方法。
		//如何使用子类特有方法呢?
		//可以强制将父类的引用转换成子类类型。
		Cat c = (Cat)a;//向下转型
		c.CatchMouse();
		//下面这种转型是不对的。我们转的是父类的引用,不可以将父类的对象转型。
		//我们可以转换的是父类的引用指向的自己的子类对象时,可以被提升,也可以被强制转换。
		//多态自始至终都是子类对象在变化
		Animal a = new Animal();
		Cat  c = (Cat)a;
	}
	public static void function(Animal a){
		a.eat();//instanceof用来判断所属类型,然后可以使用所属类型的特有方法。
		if(a instanceof Cat){
			Cat c = (Cat)a;
			c.CatchMouse();
		}
		else if(a instanceof Dog){
			Dog d = (Dog)a;
			d.kanjia();
		}
	}
}

4.多态的应用:
基础班:学习、睡觉。
高级班:学习、睡觉。
对这两类事物进行抽取,

abstract class Student
{
	public abstract void study();
	public void sleep(){
		System.out.println("躺着睡");
	}
}
class BAaseStudent extends Student
{
	public void study(){
		System.out.println("base study");
	}
	public void sleep(){
		System.out.println("坐着睡");
	}
}
class AdvStudent extends Student
{
	public void study(){
		System.out.println("adv study");
	}
}
class DoStudent
{
	public void doSome(Student stu){
		stu.sleep();
		stu.study();
	}
}
class DuotaiTest
{
	public static void main(String[] args){
//		BaseStudent bs = new BaseStudent();
//		bs.sleep();
//		bs.study();
//		AdvStudent as = new AdvStudent();
//		as.sleep();
//		as.study();
		DoStudent ds = new DoStudent();
		ds.doSome(new BaseStudent());
		ds.doSome(new AdvStudent());
	}
}

多态中(父类引用指向子类对象)成员函数(非静态)的特点:
如果子类静态覆盖父类静态方法,运行时调用的还是父类中的静态方法)不常见但是要知道(与静态的加载方式有关)。
在编译时,参阅引用型变量所属的类中是否有调用的方法,如果有则编译通过,如果没有则编译失败,如代码中的方式2
因为父类中没有Method3方法,所以编译失败。
在运行时:参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态中调用时,编译时期看左边(即父类(引用)中有没有调用的方法),
运行看右边(即子类对象中是否有调用的方法)。

多态中成员变量的特点:无论编译还是运行,都是参阅的引用型变量所属的类(左边)。即父类和子类中出现重名变量时,
在多态的情况下,调用的变量值是父类中的值,

class Fu
{
	public void Method1(){
		System.out.println("method_1");
	}
	public void Method2(){
		System.out.println("method_2");
	}
}
class Zi extends Fu
{
	public void Method1(){
		System.out.println("method_1");
	}
	public void Method3(){
		System.out.println("method_3");
	}
}
class DuoTaiDemo5
{
	public static void main(String[] args){
		//方式2 多态
		Fu f = new Zi();
		f.Method1();
		f.Method2();
		//f.Method3();因为父类中没有这个方法。编译失败
		//方式1
//		Zi z = new Zi();
//		z.Method1();
//		z.Method2();
//		z.Method3();
	}
}

多态的应用,主板以及PCI接口实例体会多态。

/*接口  多态 本实例重点研读
需求:
电脑运行实例  基于主板*/
interface PCI{
	public void open();
	public void close();
}//定义一个主板,可以调用PCI
class MainBoard{
	public void run(){
		System.out.println("mainboard run");
	}
	public void usePCI(PCI p){//接口型引用指向自己的子类对象。
		if(p!=null){
			p.open();
			p.close();
		}
	}
}//电脑的各个模块实现了PCI
class NetCard implements PCI{
	public void open(){
		System.out.println("netcard open");
	}
	public void close(){
		System.out.println("netcard close");
	}
}
class SoundCard implements PCI{
	public void open(){
		System.out.println("soundcard open");
	}
	public void close(){
		System.out.println("soundcard close");
	}
}
class  DuotaiDemo1{
	public static void main(String[] args) {
		MainBoard mb=new MainBoard();
		mb.run();
		mb.usePCI(null);
		mb.usePCI(new NetCard());
		mb.usePCI(new SoundCard());
	}
}

Object类:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 
object:是所有对象的直接或者间接父类,超类
该类中定义的是所有对象都具备的功能,下面演示一个方法equals。

class Demo{  //extends object
	private int num;
	Demo(int num){
		this.num=num;
	}
	public boolean equals(Object obj){//覆盖父类中的方法
		if(!(obj instanceof Demo))//instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。
			return false;
		Demo d=(Demo)obj;//向下转型
		return this.num==d.num;
	}
}
class Person{
}
class ObjectDemo {
	public static void main(String[] args) {
		Demo d1=new Demo(5);
		Demo d2=new Demo(6);
		Person p=new Person();
		System.out.println(d1.equals(p));
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值