1多态案例:向上转型及向下转型及抽象类/方法

Animal one = new Animal();//1标准父类实例化的

向上转型&向下转型

向上转型

向上转型/隐式转型/自动转型,及小类转型为大类
父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法哦
无法调用子类独有的方法
注意:父类中的静态放无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法
如果想调用子类的静态方法只能通过向下强制转换数据类型 列如:Cat cat=(cat)two;

向下转型

向下转型/强制类型转换
子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法
必须满足转型条件才能转换
instanceof 判断左边的对象是不是右边的实例 返回true/false

抽象类&抽象方法

抽象类

使用 abstract修饰class
父类public abstract void eat();
抽象类不允许实例化,可以通过向上转型,指向子类实例
继承父类关系,避免父类无意义的实例化 禁止了子类设计的随意性

抽象方法

public abstract Cat();
不允许有方法体!在子类创建的时候就会有方法重写的提醒

使用规则

1 abstract定义抽象类
2 抽象类不能直接实例化 只能被继承 可以通过向上转型完成对象实例
3 abstract定义抽象方法,不需要具体实现
4 包含抽象方法类一定是抽象类
5 抽象类中可以没有抽象方法

案例:

创建package 命名com.imooc.test 生成3个类分别Animal父类子类Cat及Dog(介绍向上向下转型)
另外一个是抽象方法案例Master.java
Animal.java

package com.imooc.animal;
//abstract修饰的类是抽象类 
//抽象类不允许实例化 可以通过向上转型,指向子类实例
//继承父类关系   避免父类无意义的实例化 禁止了子类设计的随意性
public abstract class Animal {
//属性: 昵称\ 年龄
	private String name;
	private int month;
	//无参构造方法
	public Animal() {
		
	}
	//带参构造方法
	public Animal(String name,int month) {
		this.name = name;
		this.month = month;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMonth() {
		return month;
	}
	public void setMonth(int month) {
		this.month = month;
	}
	//方法:吃东西
	//方法加abstract修饰的抽象方法 子类必须有重写方法,否则子类也要变成抽象类
	//不允许包含方法体 static final private不能与abstract并存
	public abstract void eat();
	
}

Cat.java

package com.imooc.animal;

public class Cat extends Animal {
	//子类特有属性: 体重
	private double weight;
	//无参构造方法
	public Cat() {
		
	}
	//带参构造方法
	public Cat(String name,int month,double weight) {
		super(name,month);
		this.weight = weight;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	//子类特有方法:跑动
	public void run() {
		System.out.println("小猫快乐的奔跑");
	}
	//子类独有的静态方法
	public static void say() {
		System.out.println("小猫碰胡须");
	}
	//方法:吃东西 (重写父类方法)
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
}

Dog.java

package com.imooc.animal;

public class Dog extends Animal {
//子类特有属性:性别
	private String sex;
	//无参构造方法
	public Dog(){
		
	}
	//带参构造方法
	public Dog(String name,int month,String sex){
		this.setMonth(month);
		this.setName(name);
		this.setSex(sex);
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	//子类特有方法:睡觉
	public void sleep() {
		System.out.println("小狗有午睡的习惯");
	}
	//方法:吃东西(重写父类方法)
	public void eat() {
		System.out.println("狗吃肉");
	}
	
}

Master.java (抽象方法关于主人喂养宠物及因时间选择饲养种类 )

package com.imooc.animal;

public class Master {
	/*喂宠物
	 * 喂猫咪:吃完东西后,主人会带着去跑动
	 * 喂狗狗:吃完东西后,主人会带着去睡觉
	 */
	//方案一 编写方法 传入不同类型的动物,调用各自的方法
//	public void feed(Cat cat) {
//		cat.eat();
//		cat.run();
//	}
//	public void feed (Dog dog) {
//		dog.eat();
//		dog.sleep();
//	}
	
	//方案2  编写方法 传入动物的父类 方法中通过类型转换,调用指定子类的方法
	public void feed(Animal obj) {
		obj.eat();//共有方法可以直接写在判断外面直接调用 缩小代码的冗余
		if(obj instanceof Cat) {
			Cat temp=(Cat)obj;
		//	temp.eat();  //共有的方法写在判断体外面
			temp.run();
		}else if(obj instanceof Dog) {
			Dog temp=(Dog)obj;
		//	temp.eat();  //共有的方法写在判断体外面
			temp.sleep();
		}
	}
	/*
	 * 饲养何种宠物
	 * 空闲时间多:养狗狗
	 * 空闲时间不多:养猫咪
	 */
	//方案一:
//	public Dog hasManyTime() {
//		System.out.println("主人时间比较充足,适合养狗狗");
//		return new Dog();
//	}
//	public Cat haslittleTiem() {
//		System.out.println("主人平时比较忙碌,适合养猫咪");
//		return new Cat();
//	}
	
	//方案2:
	public Animal raise(boolean isManyTime) {
		if(isManyTime) {
			System.out.println("主人时间比较充足,适合养狗狗");
			return new Dog();
		}else {
			System.out.println("主人平时比较忙碌,适合养猫咪");
			return new Cat();
		}
	}
	
}

创建测试包com.imooc.test 有Test.java / MasterTest.java
Test.java

package com.imooc.test;

import com.imooc.animal.Animal;
import com.imooc.animal.Cat;
import com.imooc.animal.Dog;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			//Animal one = new Animal();//1标准实例化的
			/*向上转型/隐式转型/自动转型,及小类转型为大类
			 * 父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法哦
			 * 无法调用子类独有的方法
			 * 注意:父类中的静态放无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法
			 * 如果想调用子类的静态方法只能通过向下强制转换数据类型 列如:Cat cat=(cat)two;
			 */
			Animal two = new Cat();//2 向上转型
			Animal three = new Dog();//3  向上转型
//			one.eat();  //abstract抽象方法后无意义调用被限制
//			two.eat(); //abstract抽象方法后无意义调用被限制
//			three.eat(); //abstract抽象方法后无意义调用被限制
			System.out.println("==============================");
			/*向下转型/强制类型转换
			 * 子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法
			 * 必须满足转型条件才能转换
			 * instanceof 判断左边的对象是不是右边的实例 返回true/false
			 */
			if(two instanceof Cat) {
				Cat temp =(Cat) two;
				temp.eat();
				temp.run();//向下转型 强制后转换后可以调用子类特有方法
				temp.say();//也可以调用独有静态方法
				temp.getMonth();
				System.out.println("two可以转换为Cat类型");
			}
			if(two instanceof Dog) {
			Dog temp2 =(Dog) two; //这个instanceof跟dog类没有关系返回false
			temp2.eat();
			temp2.sleep();
			temp2.getMonth();
			System.out.println("three可以转换为Dog类型");
			}
	}

}

Master.java

package com.imooc.test;

import com.imooc.animal.Animal;
import com.imooc.animal.Cat;
import com.imooc.animal.Dog;
import com.imooc.animal.Master;

public class MasterTest {
	public static void main(String[] args) {
		Master master = new Master();
		Cat one =new Cat();
		Dog two =new Dog();
		master.feed(one);
		master.feed(two);
		System.out.println("============================");
		boolean isManyTime=false; //主人时间是否空余较多
//		方案一调用方法
//		Animal temp;  //创建一个Animal对象 接收待会来的结果并打印出来查看
//		if(isManyTiem) {
//			temp= master.hasManyTime();
//			
//		}else {
//			temp= master.haslittleTiem();
//		}
//		System.out.println(temp);
		
		
//		方案二调用方法
		Animal temp = master.raise(isManyTime);
		System.out.println(temp);
	}
}	

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值