java基础<多态>

多态概念

一、概念
多态:可以理解为事物存在的多种体现形态。

     人:男人,女人     动物:猫,狗

    猫 x=new 猫();  动物 x=new 猫();

从这4个方面来学习多态

1.多态的体现
父类的引用指向了自己的子类对象(即,父类的引用接收了自己的子类对象)
2.多态的前提
必须是类与类之间有关系,要么继承,要么实现。
3.多态的利弊
利:多态的出现大大的提高了程序的扩展性。
弊:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
4.多态的应用

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

多态的扩展性

一、代码
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("拱地");
	}
}


--------------------------------------------------------

class DuoTaiDemo
{
	public static void main(String[] args) 
	{
		//Cat c=new Cat();
		//c.eat();
		//Dog d=new Dog();
		//d.eat();
		function1(new Cat());
		function1(new Dog());
		function1(new Pig());
	}
/*
	public static void function(Cat c)
	{
		c.eat();
	}

	public static void function(Dog d)
	{
		d.eat();
	}

	public static void function(Pig p)
	{
		p.eat();
	}
*/
	public static void function1(Animal a)
	{
		a.eat();
	}
}

多态的转型

一、代码
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("拱地");
	}
}


--------------------------------------------------------

class DuoTaiDemo2
{
	public static void main(String[] args) 
	{
		Animal a=new Cat();//类型提升。(向上转型)
		a.eat();
		//如果想要调用猫的特有方法时,如何操作?
		Cat c=(Cat)a;//向下转型
		c.catchMouse();
		//千万不要出现:将父类对象转换成子类类型。
		//能转换的是:父类引用指向了自己的子类对象时,该引用可以向下转型
		//多态自始至终都是子类对象在做着变化。


		function(new Cat());
		function(new Dog());
	}

	public static void function(Animal a)
	{
		a.eat();

		if(a instanceof Cat)
			Cat c=(Cat)a;
			c.catchMouse();
	}
}

多态成员的特点

一、概述

在多态中,成员方法的特点:
在编译时期:参阅引用型变量所属的类中,是否有调用的方法,如果有,编译通过,如果没有,编译失败。
在运行时期:参阅对象所属的类中,是否有调用的方法。
简单总结:成员函数,在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)

在多态中,静态成员的特点:
无论编译和运行,都参考左边

二、代码
class Fu
{
	int num=6;

	void method1()
	{
		System.out.println("fu method1");
	}
	
	
	void method2()
	{
		System.out.println("fu method2");
	}

	static void method4()
	{
		System.out.println("fu method4");
	}


}

class Zi extends Fu
{
	int num=5;
	void method1()
	{
		System.out.println("Zi method1");
	}

	void method3()
	{
		System.out.println("Zi method3");
	}

	static void method4()
	{
		System.out.println("Zi method4");
	}


}

class DuoTaiDemo3
{
	public static void main(String[] args)
	{
		Fu f=new Zi();

		System.out.println(f.num);//输出6

		Zi z=new Zi();

		System.out.println(z.num);//输出5

		f.method1();
		f.method2();
		//f.method3();//会编译失败,因为Fu类中没有method3()方法。
		f.method4();//调用父类的静态方法。

	}
}

多态的示例

一、代码(主板示例)
interface PCI
{
	abstract void run();
	abstract void close();
}

class MainBord
{
	public void mainRun()
	{
		System.out.println("主板运行");
	}

	public void useCard(PCI p)
	{
		if(p!=null)
		{
			p.run();
			p.close();
		}
	}
}

class NetCard implements PCI
{
	public void run()
	{
		System.out.println("网卡运行");
	}

	public void close()
	{
		System.out.println("网卡关闭");
	}
}



class MainbordDuotaiDemo 
{
	public static void main(String[] args) 
	{
		MainBord mb=new MainBord();
		mb.mainRun();
		mb.useCard(new NetCard());
	}
}
二、读取数据库示例




<think>好的,我现在需要帮助用户理解Java中的多态。用户之前已经询问过变量调用,现在转向另一个基础概念,可能是在系统学习Java基础知识。首先,我应该回顾多态的定义,确保自己理解准确。多态指的是同一操作作用于不同对象,可以有不同的解释,产生不同的执行结果。这通常通过方法重写和重载来实现,但用户可能更关注的是运行时多态,即通过继承和接口实现的多态。 接下来,我需要考虑用户的需求。用户可能刚开始学习Java,对多态的概念还不清楚,或者想巩固已有的知识。需要分步骤解释,结构清晰。首先定义多态,然后说明实现方式,接着是具体示例,可能还要包括注意事项和常见问题。 用户之前的回答结构是分点解析,带有代码示例和公式,所以这次也应该保持类似的结构。例如,分成基本概念、实现方式、代码示例、应用场景、注意事项等部分。需要注意的是,用户可能对重载和重写的区别有疑问,或者对向上转型和向下转型不太理解,这些都需要涵盖进去。 另外,用户之前的回复中提到了变量类型和作用域,所以可能需要将多态与之前的内容联系起来,比如多态如何影响方法的调用,变量引用的类型与实际对象类型的关系。同时,要避免过于深入复杂的细节,保持基础知识的讲解,适合初学者的水平。 需要检查是否有常见的误区,例如认为多态只与方法重写有关,而忽略重载,或者对动态绑定的机制不清楚。因此,在解释时,要明确区分编译时多态(重载)和运行时多态(重写),以及它们的不同之处。 代码示例部分,应该选择简单明了的例子,比如动物类的继承结构,展示不同子类对象调用相同方法时的不同表现。同时,可以加入向上转型和向下转型的例子,说明如何安全地进行类型转换,避免ClassCastException。 还要考虑用户可能遇到的错误,比如没有正确使用@Override注解导致的意外行为,或者试图调用子类特有方法时出现的编译错误。这些实际问题能帮助用户更好地理解和应用多态。 最后,总结多态的优势,如提高代码扩展性和可维护性,并强调设计原则,如开闭原则,与多态的关系。这有助于用户理解多态在实际开发中的价值,而不仅仅是语法层面的知识。 需要确保语言简洁,避免术语堆砌,用通俗易懂的中文解释概念,同时保持专业性。检查是否有遗漏的部分,比如多态的三个必要条件:继承、重写和父类引用指向子类对象,这些是否在回答中明确提到。另外,动态绑定机制是理解运行时多态的关键,需要简要说明。 可能还需要对比其他面向对象特性,如封装和继承,帮助用户构建完整的知识体系。但根据用户的问题,重点应放在多态上,所以简要提及即可。 最后,整理思路,确保回答结构符合用户之前的格式,分点清晰,代码示例正确,公式或图表辅助理解。例如,用表格总结多态类型,或用公式表示方法调用的绑定过程。同时,注意使用中文标点和正确的排版,提升可读性。</think># Java多态核心解析(四维剖析) ## 一、多态本质公式 $$ \text{多态} = \text{继承} \times \text{重写} + \text{向上转型} $$ - 动态绑定机制:$ \text{编译看左} \cap \text{运行看右} $ ## 二、多态类型矩阵 $$ \begin{array}{|c|c|c|} \hline \text{类型} & \text{实现方式} & \text{绑定时机} \\ \hline \text{编译时多态} & \text{方法重载} & \text{静态绑定} \\ \text{运行时多态} & \text{方法重写} & \text{动态绑定} \\ \hline \end{array} $$ ## 三、运行时多态实现流程 ### 1. 基础实现框架 ```java // 父类定义 class Animal { void sound() { System.out.println("动物发声"); } } // 子类重写 class Cat extends Animal { @Override void sound() { System.out.println("喵喵叫"); } } class Dog extends Animal { @Override void sound() { System.out.println("汪汪叫"); } } ``` ### 2. 多态调用演示 ```java public class Test { public static void main(String[] args) { Animal[] animals = { new Cat(), // 向上转型 new Dog(), // 向上转型 new Animal() }; for(Animal a : animals) { a.sound(); // 动态绑定 } } } ``` 输出结果: ``` 喵喵叫 汪汪叫 动物发声 ``` ## 四、多态技术要素 1. **继承关系**:必须存在父类-子类继承结构 2. **方法重写**:子类必须重写父类方法(@Override验证) 3. **向上转型**:父类引用指向子类对象(例:$Animal\ a = new\ Cat();$) ## 五、多态应用场景 1. **参数统一化**: ```java void makeSound(Animal animal) { animal.sound(); // 接受任意Animal子类对象 } ``` 2. **容器存储异构对象**: ```java List<Animal> zoo = new ArrayList<>(); zoo.add(new Cat()); zoo.add(new Dog()); ``` 3. **工厂模式核心**:通过父类返回具体子类实例 ## 六、类型转换操作 ### 1. 向下转型验证 ```java Animal a = new Cat(); if(a instanceof Cat) { // 类型检查 Cat c = (Cat)a; // 安全转型 c.catchMouse(); // 调用子类特有方法 } ``` ### 2. 转型异常防护 ```java try { Dog d = (Dog)a; // 错误转型 } catch(ClassCastException e) { System.out.println("类型转换异常"); } ``` ## 七、方法绑定机制 1. **静态成员方法**: $$ \text{变量声明类型} \rightarrow \text{决定调用方法} $$ 2. **实例成员方法**: $$ \text{实际对象类型} \rightarrow \text{决定调用方法} $$ ## 八、多态限制说明 1. **变量访问**:只能访问父类声明成员 ```java class Parent { int x = 10; } class Child extends Parent { int x = 20; } Parent p = new Child(); System.out.println(p.x); // 输出10(访问父类字段) ``` 2. **静态方法**:不支持多态调用 ```java class Parent { static void test(){} } class Child extends Parent { static void test(){} } Parent p = new Child(); p.test(); // 调用Parent.test() ``` ## 九、设计模式应用 ### 模板方法模式 ```java abstract class Game { // 固定流程 final void play() { // final防止重写 initialize(); start(); end(); } abstract void initialize(); // 抽象方法 abstract void start(); void end() { // 默认实现 System.out.println("游戏结束"); } } class Chess extends Game { @Override void initialize() { System.out.println("摆棋盘"); } @Override void start() { System.out.println("开始下棋"); } } ``` ## 十、开发实践建议 1. **多态三不要**: - 避免在构造器中调用可重写方法 - 不要滥用instanceof判断类型 - 谨慎使用强制类型转换 2. **设计原则**: - 开闭原则(对扩展开放,对修改关闭) - 里氏替换原则(子类可替换父类) 关键理解公式: $$ \text{多态优势} = \frac{\text{代码扩展性}}{\text{修改成本}} \times \text{系统灵活性} $$ 通过多态机制,可以实现不同对象对同一消息的差异化响应,这是面向对象设计实现"高内聚、低耦合"的重要技术手段。建议结合接口多态进行延伸学习,掌握更复杂的多态应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值