去宠物店去买猫和狗,
* 从从控制台输入1,购买一只猫,
* 输入2,购买一只狗,
* 输入其他则提示重新输入
* 当狗和猫的只数总共为5只的时候去结算,
* 假设狗的价格为每只100元,猫的价格为每只200元,
* 计算最后的总价格
import java.util.Scanner;
class Animal{
public void say() {
System.out.println("动物叫……");
}
public double getPrice() {
return 0;
}
}
class Dog extends Animal{
/**
* 重写动物叫的方法
*/
@Override
public void say() {
System.out.println("汪汪汪……");
}
public void lookHouse() {
System.out.println("狗看家……");
}
public double getPrice() {
return 200;
}
}
class Cat extends Animal{
@Override
public void say() {
System.out.println("喵喵喵……");
}
public void catchMouse() {
System.out.println("猫抓老鼠……");
}
public double getPrice() {
return 100;
}
}
public class Test1 {
public static void main(String[] args) {
Animal a1=new Animal();
Animal d1=new Dog();
Animal c1=new Cat();
//父类型的引用可以指向子类型的对象
//在编译期间,引用是属于父类型
//在运行期间,会调用子类型中重写的方法
a1.say();
d1.say();
c1.say();
//在编译期间,d1和c1两个引用都是属于animal类型
//只能调用到在父类中已经定义过的方法
//而不能调用到子类中所特有的方法
// d1.lookHouse();
// c1.catchMouse();
System.out.println("-------------------------");
//类型转换
/**
*
* 1、向上类型转换
* 子类型转父类型,自动类型转换,隐式类型转换
*/
Dog d2=new Dog();
d2.lookHouse();
d2.say();
Animal a2=d2;
System.out.println(d2==a2);
//多态,运行时候调用子类重写方法
a2.say();
//转成父类型后,只能调用父类中已经定义过的方法
//a2.lookHouse();
/*
* 2、向下类型转换
* 父类型转子类型,强制类型转换,显示类型转换
*
*/
Animal a3=new Dog();
Dog d3=(Dog)a3;
System.out.println(a3==d3);
//强转子类型后就可以调用子类中定义的特有方法
d3.lookHouse();
Animal a4=new Cat();
/*
* instanceof关键字
* 主要用于判断a4引用所指向的对象
* 是否属于Cat类型,而不是判断
* a4引用本身的类型
*/
boolean f=a4 instanceof Cat;
if(f) {
System.out.println("-----可以进行类型转换----");
Cat c4=(Cat)a4;
c4.catchMouse();
c4.say();
}else {
System.out.println("------不可以进行类型转换------");
}
System.out.println("---------------------------------");
//调用买狗
Dog d5=(Dog)buyDog();
d5.lookHouse();
d5.say();
//调用买猫
Cat c5=(Cat)buyCat();
c5.catchMouse();
c5.say();
//购买动物
Animal a5 =buyAnimal(1);
a5.say();
Animal a6=buyAnimal(2);
a6.say();
System.out.println("---------------------------------------");
//创建狗
Dog d6=new Dog();
//调用狗叫
dogSay(d6);
//创建猫
Cat c6=new Cat();
//调用猫叫
catSay(c6);
animalSay(d6);
animalSay(c6);
System.out.println("----------------------");
//购买5只动物(猫或狗)
Animal[] animals = buyAnimal();
//计算总价格
double price = 0;
for(int i=0;i<animals.length;i++) {
Animal animal = animals[i];
//根据多态应用,如果是狗,就获取狗的价格
//如果是猫,就获取猫的价格,不用去判断
price += animal.getPrice();
}
System.out.println("总价格:"+price);
}
public static Animal buyDog() {
Dog dog =new Dog();
return dog;
}
public static Animal buyCat() {
Cat cat =new Cat();
return cat;
}
public static Animal buyAnimal(int type) {
Dog dog =new Dog();
// return dog;
Cat cat =new Cat();
// return cat;
if(type==1) {
return dog;
}else {
return cat;
}
}
//传入狗,调用狗叫
public static void dogSay(Dog dog) {
dog.say();
}
public static void catSay(Cat cat) {
cat.say();
}
public static void animalSay(Animal animal) {
animal.say();
}
public static Animal[] buyAnimal() {
Animal[] animas = new Animal[5];
for(int i=0;i<5;i++) {
System.out.println("请选择1>猫2>狗");
int type = new Scanner(System.in).nextInt();
switch (type) {
case 1://购买猫
Cat cat = new Cat();
System.out.println("你买了一只猫");
animas[i] = cat;
break;
case 2://购买狗
Dog dog = new Dog();
System.out.println("你买了一只狗");
animas[i] = dog;
break;
default://输入错误
System.out.println("输入错误,请重新输入");
i--;
break;
}
}
return animas;
}
}