16.多态

1.什么是多态

生活中的多态:同一种事物,由于条件的不同,产生的结果也不同。

多态:同一个引用类型,使用不同的实例而执行不同的操作。

1.1 认识多态

1、多态的通常含义是指能够呈现出不同的形式或者形态;

2、在程序设计中,多态意味着一个特定类型的变量可以引用不同类型的对象,并且自动的调用引用的对象的方法,也就是说,根据不同的引用的对象的类型,执行不同的操作;

3、方法重写是实现多态的基础

4、多态意味着在一次方法调用中根据包含的对象的实际类型(即实际的子类对象)来决定应该调用哪个方法,而不是由用来存储对象引用的变量的类型决定的。

当调用一个方法时,为了实现多态的操作,这个方法既是在父类中声明过的,也必须是在子类中重写过的方法。

1.2 向上转型

什么是向上转型:子类向父类的转换称为向上转型,即:父类的引用对象指向子类对象,是自动类型转换

语法格式:父类名  父类对象=new 子类型();

注:

此时通过父类引用变量调用的方法是子类覆盖或继承了父类的方法,并不是父类的方法;

此时通过父类引用变量无法调用子类特有的方法。

1.3 向下转型

概念:将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型,是强制类型转换。

语法格式:子类型  引用变量名=(子类型)父类引用变量;

1.4 instanceof运算符

1、在向下转型的过程中,如果不是转换为真实子类类型,会出现类型转换异常ClassCastException)。

2、在Java中提供了instanceof运算符类进行类型的判断。

3、使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类有继承关系,否则会出现编译错误。

4、instanceof通常和强制类型转换结合使用。

1.5 多态的优势

->可替换性:多态对已存在的代码具有可替换性。

-->可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特征的运行和操作。实际上新加子类更容易获得多态功能。

-->接口性:多态是父类向子类提供了一个共同接口,由子类来具体实现。

-->灵活性:多态在应用中体现了灵活多样的操作,提高了使用效率。

-->简化性:多态简化了应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

2.抽象方法和抽象类

2.1 抽象方法

在Java中,当一个类的方法被abstract关键字修饰时,这个方法称之为抽象方法。

语法格式:访问修饰符 abstract 返回值类型 方法名(参数列表);

访问修饰符,参数列表根据需要可写可不写。

特点:

1.抽象方法没有方法体;

2.抽象方法所在的类必须定义为抽象类;

3.抽象方法在子类中必须要重写,如果这个子类不重写这个抽象方法,则这个子类要定义为抽象类。

注:

private关键字不能用来修饰抽象方法;

abstract修饰符不能和final修饰符一起使用。

2.2 抽象类

在Java中,当一个类被abstract关键字修饰时,该类称之为抽象类。

语法格式:abstract  class 类名{

                代码

}

说明:

抽象类需要用修饰符abstract修饰,普通类不需要。

1.普通类可以实例化,抽象类不能被实例化。

2.抽象类中可以有抽象方法也可以没有抽象方法,可以有普通方法也可以没有普通方法。

3.抽象类中可以包含普通类包含的一切成员。

当一个类实例化没有意义时,就可以把这个类定义为抽象类。

3.多态的举例说明

需求:使用多态实现主人领养动物并带动物看病的功能,狗有特有的吃方法,企鹅有特有的游泳方法。

1.编写父类

//编写父类
public class Animal {
	private String name;
	private int health;
	private int love;

	public Animal() {

	}

	public Animal(String name, int health, int love) {
		this.name = name;
		this.health = health;
		this.love = love;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getHealth() {
		return health;
	}

	public void setHealth(int health) {
		this.health = health;
	}

	public int getLove() {
		return love;
	}

	public void setLove(int love) {
		this.love = love;
	}
	
	public void toHospital(){
		System.out.println("去看病");
	}
}

2.编写子类

//编写子类Dog,通过关键字extends继承父类Animal
public class Dog extends Animal {
	// 声明品种属性,这个属性是Dog类特有的
	private String strain;

	public Dog() {
		super();// 表示调用父类Animal类的无参构造方法
	}

	public Dog(String name, int health, int love, String strain) {
		super(name, health, love);// 表示调用父类Animal类中的有参构造方法
		this.strain = strain;
	}

	public String getStrain() {
		return strain;
	}

	public void setStrain(String strain) {
		this.strain = strain;
	}

	//Dog类重写的toHospital()看病方法
	public void toHospital() {
		System.out.println("打针");
		this.setHealth(80);
	}
	//Dog类特有的eat()方法
	public void eat() {
		System.out.println("狗喜欢吃骨头");
	}
}
//编写子类Penguin类,继承父类Animal类
public class Penguin extends Animal {
	
	// Penguin类特有属性
	private String sex;
	// 无参构造方法
	public Penguin() {
		super();
	}
	// 有参构造方法
	public Penguin(String name, int health, int love, String sex) {
		super(name, health, love);
		this.sex = sex;
	}
	//sex读写方法
	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	@Override
	//Penguin类重写的toHospital()看病方法
	public void toHospital() {
		System.out.println("打针,吃药");
		this.setHealth(90);
	}
	//Penguin类特有的swimming()方法
	public void swimming(){
		System.out.println("企鹅会仰泳");
	}
}

3.编写主人类,定义看病方法

//编写主人类,在这个类中定义看病方法
public class Master {
	//定义看病方法
	public void cure(Animal animal){
		//如果animal的健康值低于60,就去看病
		if(animal.getHealth()<60){
			animal.toHospital();
		}
	}
}

4.进行测试

public class Test {

	public static void main(String[] args) {
		// 创建主人类对象
		Master master = new Master();

		// 向上转型:父类引用指向子类的实例(对象),即子类向上转型了
		// 父类引用animal指向子类Dog类对象
		Animal animal = new Dog("富贵", 30, 98, "金毛");
		System.out.println("看病前健康值:" + animal.getHealth());

		// 调用看病方法,此时的animal指向Dog类,进而调用Dog类的看病方法toHospital()方法
		master.cure(animal);
		System.out.println("看病后健康值:" + animal.getHealth());
		// 但是父类引用不能调用子类的特有方法和属性
		// animal.eat();
		// animal.getStrain();
		
		// 向下转型:子类的引用(对象名)指向父类引用(对象名),即父类向下转型,需要强制类型转换
		Dog dog = (Dog) animal;
		dog.eat();// 调用Dog类的特有方法eat()方法
		System.out.println("狗的品种:" + dog.getStrain());

		System.out.println("----------------");
		
		// 父类引用指向子类Penguin类对象
		animal = new Penguin("qq", 40, 99, "公");
		System.out.println("看病前健康值:" + animal.getHealth());
		// 调用看病方法,此时的animal指向Penguin类,进而调用Penguin类的看病方法toHospital()方法
		master.cure(animal);
		System.out.println("看病后健康值:" + animal.getHealth());
		//下面两行代码在编写时不会报错,但是运行会报错,因为此时的父类引用指向的是子类Penguin类对象,向下转型时却没有转换成其指向的子类
		/*Dog dog1=(Dog)animal;//ClassCastException类型转换异常,父类引用没有转换成其指向的子类
		dog1.eat();*/
		
		/*由此可见:
		 * 在向下转型的时候,有可能转换错误,没有转换成其指向的子类,这时候会报ClassCastException异常
		 * 我们可以在转型之前使用instanceof关键字进行判断父类引用指向了哪个子类对象 
		 */
		if(animal instanceof Dog){
			Dog dog1=(Dog)animal;
			dog1.eat();
		}else if(animal instanceof Penguin){
			Penguin pe1=(Penguin)animal;
			pe1.swimming();
		}
	}
}
根据JavaJavaScript,mysql,c语言,vue3,回答下列问题 1.什么是面向对象编程? 2.Java中的集合包括什么? 3.spring boot三个架构? mapper的作用 4.Mybatis mapper.xml的配置映射 5.Radis 数据结构 6.Redis数据一致性问题 7.Mysql 数据结构 char和varchar的区别 8.Vue生命周期,钩子函数,响应式变量,npm,常用的element -ui 9.springboot常用注解有哪些 10.Nnginx 11.Rocketmq消息延迟 12.Mybatis用法 13.Arralist用过哪些api 14.遍历集合有哪几种 15.MySQL数据类型用过哪些 16.Date和datetime的区别 17.Git常见命令 18.Html标签通常有哪些 css 19.数据采集与分析用的哪个库 20.可视化用的什么技术 21.拦截器 22.常见异常 23.事务 24.组件通信,父组件如何给子组件传递信息 25.路由组件 26.反射 27.线程池,多线程 28.什么是注解(标记) 29.Aop 30.Git 31.idea常用插件 32.什么是反向代理 33.第三方接口 34.Lombok用法 35.Vue3常用的api 36.vue3的常用生命周期 37.Vue router 38.遍历数组的方法 39.Foreach和map的区别(有返回值) 40.Radis数据类型? 41.多态 42.Hashmap遍历方式 43.Springboot配置文件的相关知识 44.前端三件套 45.数据库与其外键的主要内容 46.常见表的关系 47.若依框架 48.Nginx相关内容与配置文件 49.Linux命令 50.后端接口怎么定义的 51.前端如何搭建 52.数据库常见的相关命令语句 53.数据库表设计 54.V-if 55.V-show
04-28
<think>好的,我需要处理用户关于多种IT技术的详细解释和使用方法的请求。首先,我要确保回答结构清晰,分点列出每个技术点,同时遵循用户给出的系统级指令,比如正确使用LaTeX格式、生成相关问题等。 用户提到的技术非常多,涉及JavaJavaScript、MySQL、C语言、Vue3、SpringBoot、Mybatis、Redis、Vue生命周期、Spring注解、Nginx、RocketMQ、数据结构、事务、组件通信、路由、反射、多线程、注解、AOP、Git、IDEA插件、反向代理、第三方接口、Lombok、Vue3 API、Vue路由、遍历数组、Redis数据类型、多态、HashMap遍历、SpringBoot配置、前端三件套、数据库设计、V-if和V-show。我需要逐一解释这些技术,但要注意不要过于冗长,保持每个部分的简洁明了。 首先,我需要确认每个技术点的核心概念和常见用法。例如,Java的多线程可以通过实现Runnable接口或继承Thread类;Vue生命周期包括created、mounted等钩子函数;Spring注解如@Autowired用于依赖注入。同时,需要确保技术细节的准确性,比如在解释数据结构时,提到栈和队列的区别;在数据库设计时,强调范式和索引的重要性。 接下来,生成相关问题时要覆盖各个技术点,并考虑用户可能感兴趣的进阶问题,比如性能优化、常见问题解决方案、技术对比等。例如,如何优化SpringBoot应用性能?V-if和V-show的使用场景区别是什么? 还需要注意引用用户提供的参考内容,但根据系统指令,引用标识需自然添加。不过用户提供的引用似乎主要是关于SpringBoot和Vue的项目搭建,可能在这些部分适当引用,但大部分技术点需要依靠自己的知识库来回答。 最后,检查LaTeX格式是否正确,所有行内公式用$...$,独立公式用$$...$$,例如在解释多态时,可能需要用代码示例而非数学公式,但如果有涉及算法复杂度的地方,比如快速排序的时间复杂度O(n log n),需要用LaTeX格式化。同时确保中文回答,语法正确,避免任何Markdown格式错误。 现在开始组织内容,分技术点进行简明扼要的解释,每个部分保持一两句话,然后生成相关问题。需要确保覆盖用户提到的所有技术,但不要遗漏。如果某些技术关联紧密,可以合并解释,比如前端三件套(HTML、CSS、JavaScript)可以一起说明。对于像Spring注解和AOP这样的Spring相关技术,可以分组讨论。同样,Vue3相关的内容如Vue路由、生命周期、API等也可以集中讲解。 需要特别注意用户提到的“事务”部分,要区分数据库事务和Spring事务管理的不同应用场景。反射在Java中的应用,比如动态代理,可以结合Spring AOP简要说明。Redis数据类型如String、List、Hash等需要列并简要说明用途。 在生成问题时,要确保每个主要技术点都有相关问题,帮助用户深入探索。例如,关于多线程的问题可以涉及线程池配置,HashMap遍历的方法比较,或者SpringBoot配置的多环境管理。 总结来说,回答需要结构清晰,分点明确,涵盖所有提到的技术,同时生成的问题要具有针对性和实用性,引导用户进一步学习。</think>### 多种IT技术详解与使用方法 #### 1. **Java** - **核心特性**:面向对象、跨平台(JVM)、多线程(`Thread`类与`Runnable`接口)、反射(动态加载类)[^1]。 - **注解**:如`@Override`标记方法重写,`@Autowired`实现Spring依赖注入。 - **多态**:父类引用指向子类对象,例如: ```java Animal dog = new Dog(); dog.sound(); // 调用Dog类的实现 ``` #### 2. **JavaScript** - **作用**:前端交互逻辑实现,支持事件驱动和异步编程(Promise)。 - **遍历数组**: ```javascript [1,2,3].forEach(item => console.log(item)); ``` #### 3. **MySQL** - **事务**:通过`BEGIN; COMMIT; ROLLBACK;`保证ACID特性,Spring中通过`@Transactional`注解管理[^1]。 - **数据库设计**:遵循三范式,合理使用索引(如B+树结构)提升查询效率。 #### 4. **C语言** - **特点**:面向过程,指针操作直接内存,适用于系统级开发。 - **数据结构**:链表、栈(后进先出)与队列(先进先出)的实现。 #### 5. **Vue3** - **生命周期**:`setup()`替代`created`/`mounted`,组合式API提高代码复用性。 - **组件通信**:`props`父传子,`emit`子传父,`provide/inject`跨层级传递。 - **指令**:`v-if`(条件渲染,操作DOM)与`v-show`(CSS切换显示)。 #### 6. **SpringBoot** - **配置**:`application.yml`支持多环境配置(`spring.profiles.active=dev`)。 - **AOP**:通过`@Aspect`实现日志记录或事务管理,基于动态代理模式[^1]。 #### 7. **Mybatis** - **作用**:ORM框架,通过XML或注解映射SQL语句,如`@Select("SELECT * FROM user")`。 #### 8. **Redis** - **数据类型**:String(缓存)、Hash(存储对象)、List(消息队列)、Set(去重集合)。 #### 9. **Nginx** - **反向代理**:配置`proxy_pass`转发请求,实现负载均衡。 ```nginx location / { proxy_pass http://backend_server; } ``` #### 10. **Git** - **核心命令**:`git commit`提交代码,`git rebase`合并分支历史,`git cherry-pick`选择性提交。 #### 11. **其他技术** - **RocketMQ**:分布式消息队列,支持事务消息和顺序消息。 - **IDEA插件**:Lombok通过`@Data`自动生成Getter/Setter[^1]。 - **前端三件套**:HTML(结构)、CSS(样式)、JavaScript(行为)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值