文档章节

Java-多态的学习

m
 minlian
发布于 07/29 16:11
字数 1663
阅读 29
收藏 0

多态

什么是多态

一个事物有多种呈现形态,某个需求下,当业务需要更迭时,如果需要频繁修改代码,则代码的可维护性和可扩展性比较差,使用多态进行优化

多态的使用

多态在实际使用中,需要建立继承关系(继承和方法重写是实现多态的基础),建立接口和实现类的关系

多态的使用:

形参(形式参数)、实参(实际参数)

方法定义时参数列表中的数据就是形参、在调用方法是传入的数据就是实参

1:定义方法形参(形式参数)的数据类型为父类,实际调用方法时传入子类实参

2:定义方法返回值类型为父类,外部调用该方法时使用子类对象接收返回值


多态的第一种方式:
定义方法形参(形式参数)的数据类型为父类,实际调用方法时传入子类实参

public class Pet {
	public void feed() {
		System.out.println("给宠物喂食");
	}
}
public class Cat extends Pet{
	@Override
	public void feed() {
		// TODO Auto-generated method stub
		System.out.println("给猫喂了2袋猫粮");
	}
}
public class Dog extends Pet{
	@Override
	public void feed() {
		// TODO Auto-generated method stub
		System.out.println("给狗喂了2根骨头");
	}
}
public class Master {
	private Pet pet;

	public Pet getPet() {
		return pet;
	}

	public void setPet(Pet pet) {
		this.pet = pet;
	}
	public void feed(Pet pet) {
		System.out.println("主人开始给宠物喂食");
		this.pet.feed();//定义方法形参(形式参数)的数据类型为父类
	}
	
}
public class test2 {
	public static void main(String[] args) {
		Dog dog = new Dog();
		Cat cat = new Cat();
//		dog.feed();
//		cat.feed();
		Master master = new Master();
		master.setPet(cat);//实际调用方法时传入子类实参
		master.feed();
	}
}
多态的第二种方式:
定义方法返回值类型为父类,外部调用该方法时使用子类对象接收返回值 
public class Pet {
	public void feed() {
		System.out.println("给宠物喂食");
	}
	public void show() {
		
	}
}
public class Cat extends Pet{
	@Override
	public void feed() {
		// TODO Auto-generated method stub
		System.out.println("给猫喂了2袋猫粮");
	}
	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("一只猫");
	}
}
public class Dog extends Pet{
	@Override
	public void feed() {
		// TODO Auto-generated method stub
		System.out.println("给狗喂了2根骨头");
	}
	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("一只狗");
	}
}
public class Master {
	private Pet pet;
	public Pet getPet() {
		return pet;
	}
	public void setPet(Pet pet) {
		this.pet = pet;
	}
	public void feed() {
		System.out.println("主人开始给宠物喂食");
		this.pet.feed();
	}
	public Pet buy(int money) {
		if(money==1000) {
			Dog dog = new Dog();
			return dog;//定义的是Pet,在money==1000的情况下dog即为pet
		}else if(money==800) {
			Cat cat = new Cat();
			return cat;//定义的是Pet,在money==1000的情况下cat即为pet
		}
		return null;
	}
	
}
public class test2 {
	public static void main(String[] args) {
//		Dog dog = new Dog();
//		Cat cat = new Cat();
//		dog.feed();
//		cat.feed();
		Master master = new Master();
//		master.setPet(cat);
//		master.feed();
		Dog dog2 = (Dog) master.buy(1000);
		Cat cat2 = (Cat) master.buy(800);
		dog2.show();
		cat2.show();	
	}
}

抽象方法和抽象类

由多态衍生出另外一个概念:抽象

在多态的场景下,父类方法会被子类所重写,父类的方法体是没有 任何意义的,即不需要定义父类的方法体,没有 方法体的方法叫做抽象方法

一旦某个类中定义了一个抽象方法,则必须将该类 定义为抽象类 ,抽象类不能被实例化

抽象类不能在外部通过调用构造函数的方式实例化 我们在实例化其子类的时候,会自动实例化抽象类的对象

使用abstract修饰的方法叫做抽象方法,没有方法体 使用abstract修饰的类叫做抽象类,抽象类中可以包含非抽象方法,抽象类中全部是非抽象方法也是可以的,非抽象方法中一定不能有抽象方法

只要一个类中包含抽象方法,则该类一定是抽象类

一个非抽象类继承了一个抽象类,若父类中存在抽象方法,则子类一定要对其进行重写

若子类是抽象类,实现或者不实现父类的抽象方法均可

若子类为非抽象类,必须实现父类的抽象方法

public abstract class Pet {
	//使用abstract修饰的类叫做抽象类,抽象类中可以包含非抽象方法,抽象类中全部是非抽象方法也是可以的,非抽象方法中一定不能有抽象方法 
	private int id;
	public abstract void feed();
	//使用abstract修饰的方法叫做抽象方法,没有方法体
	public abstract void show();
	public Pet() {
		System.out.println("创建了Pet对象");
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
}
public class Cat extends Pet{
	@Override
	public void feed() {
		// TODO Auto-generated method stub
		System.out.println("给猫喂了2袋猫粮");
	}
	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("一只猫");
	//一个非抽象类继承了一个抽象类,若父类中存在抽象方法,则子类一定要对其进行重写
	}
}
public class test2 {
	public static void main(String[] args) {
		Cat cat = new Cat();
		//抽象类不能在外部通过调用构造函数的方式实例化
		//我们在实例化其子类的时候,会自动实例化抽象类的对象	
		cat.setId(1);
		System.out.println(cat.getId());
		cat.feed();
		cat.show();
	}
}

案例如下: Pet饿了,Master需要为宠物喂食,使用多态/抽象实现该过程。 不同的Pet吃的东西不一样 不同的Pet吃完东西之后恢复的体力值不同 当体力值到达100时,停止喂食 每次喂食dog体力值+5,penguin体力值+3

public abstract class Animal {
	private int health;
	
	public int getHealth() {
		return health;
	}
	public void setHealth(int health) {
		this.health=health;	
	}
	public  abstract void feed();
}
public class Cat2 extends Animal{
	@Override
	public void feed() {
		System.out.println("给猫猫喂了3条鱼");
		this.setHealth(super.getHealth()+3);
		System.out.println("猫猫当前的额体力值"+this.getHealth());
	}	
}
public class Dog2 extends Animal{

	@Override
	public void feed() {
		System.out.println("给狗狗喂了一根骨头");
		this.setHealth(super.getHealth()+5);
		System.out.println("狗狗的当前的体力值"+this.getHealth());
		
	}
}
public class Master2 {
	public void  feed(Animal animal) {
		do {
			animal.feed();
		}while(animal.getHealth() < 100);
	}
}
public class test3 {
	public static void main(String[] args) {
		Dog2 dog = new Dog2();
		Master2 master = new Master2(); 
		master.feed(dog);
		Cat2 cat = new Cat2();
		master.feed(cat);
	}
}

对象之间的数据类型转换: 1:向上转型:父类的引用指向子类对象,自动完成数据类型转换,将子类对象转为父类 2:向下转型:子类的应用指向父类对象,强制完成数据类型转换,将父类对象转为子类

public class test4 {
	public static void main(String[] args) {
		//向上转型
		Cat2 cat = new Cat2();
		Animal animal = cat;
		//向下转型
		Animal animal1 = new Animal();
		Dog2 dog =(Dog2)animal1;		
}

© 著作权归作者所有

m
粉丝 0
博文 13
码字总数 2588
作品 0
丰台
私信 提问
Java面试题:面向对象,类加载器,JDBC, Spring 基础概念

为什么说Java是一门平台无关语言? 平台无关实际的含义是“一次编写到处运行”。Java 能够做到是因为它的字节码(byte code)可以运行在任何操作系统上,与底层系统无关。 2. 为什么 Java 不...

Java干货分享
2018/12/17
76
0
小谈Java Enum的多态性

Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态? 不过还是先看看“现象”吧: Java代码 public enum Fruit { APPLE, PEAR, PEACH, OR...

关西大汉弹琵琶
2015/05/30
229
0
每周10道Java面试题:面向对象, 类加载器, JDBC, Spring 基础概念

本文作者:ImportNew -唐尤华 未经许可,禁止转载! 每周10道 Java 面试题由 ImportNew 整理编译自网络,欢迎投稿您面试中遇到过的疑难问题。 1. 为什么说Java是一门平台无关语言? 平台无关...

ImportNew
2018/12/13
0
0
05-《深度拆解JVM》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
2018/09/25
36
0
Java面向对象概述及三大特征(封装,继承和多态)

一、面向对象思想 Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象! 它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计。面向对象程序的最小单元是类,类代...

编辑之路
01/10
45
0

没有更多内容

加载失败,请刷新页面

加载更多

搭建高可用MongoDB集群(分片)

搭建高可用MongoDB集群(分片) MongoDB基础请参考:https://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:https://blog.51cto.com/kaliarch/2044618 一、概述 1.1 背景 ......

linjin200
13分钟前
3
0
CDH6.0.1集成tez-0.9.1计算引擎

参考文章: https://www.jianshu.com/p/9fb9f32e1f0f https://www.baidu.com/link?url=OgpwasnZi7H1dySN2T111sseEWDBaCCTC3DFV61G7756YbrkJCA8Y3UFaueyqnfN&wd=&eqid=daeb8b3500049cf3000000......

Sheav
15分钟前
4
0
Vue内置指令的使用

v-model(数据绑定) v-model常用于表单数据的双向绑定,它本质上是一个语法糖。它主要的有两种应用: 在文本框、多行文本、input的下拉框、单选按钮、复选框中的应用 <div id="app"> ...

凌兮洛
16分钟前
3
0
外部来源应用检查-烦死了,终于找到解决设置了

Android 连接usb调试应用的时候: 华为关闭方法:1、设置-安全-更多安全设置,关掉外部来源应用检查。2、设置-系统-开发人员选项-关闭“监控ADB安装应用” 不知道OPPO 怎么关闭的?...

QGlaunch
16分钟前
4
0
6个K8s日志系统建设中的典型问题,你遇到过几个?

作者 | 元乙 阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11、双 12 考验。 导读:随着 K8s 不断更新迭代,使...

阿里云官方博客
19分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部