java void eat_Java 练习(多态性练习)

随机生成 Animal 执行 eat 方法

package com.klvchen.java5;

import java.util.Random;

class Animal{

protected void eat() {

System.out.println("animal eat food");

}

}

class Cat extends Animal{

protected void eat() {

System.out.println("cat eat fish");

}

}

class Dog extends Animal{

public void eat() {

System.out.println("dog eat bone");

}

}

class Sheep extends Animal{

public void eat() {

System.out.println("sheep eat grass");

}

}

public class InterviewTest {

public static Animal getInstance(int key) {

switch(key) {

case 0:

return new Cat();

case 1:

return new Dog();

default:

return new Sheep();

}

}

public static void main(String[] args) {

int key = new Random().nextInt(3);

System.out.println(key);

Animal animal = getInstance(key);

animal.eat();

}

}

运行结果:

35b6ae74af312d0046a70969dad6a233.png

1b6a6f732159c4c79a8683b1c16fa2a5.png

举例一:

Person.java

package com.klvchen.java;

public class Person {

String name;

int age;

int id = 1001;

public void eat() {

System.out.println("人,吃饭");

}

public void walk() {

System.out.println("人,走路");

}

}

Woman.java

package com.klvchen.java;

public class Woman extends Person {

boolean isBeauty;

public void goShopping() {

System.out.println("女人喜欢购物");

}

public void eat() {

System.out.println("女人少吃,为了减肥");

}

public void walk() {

System.out.println("女人窈窕地走路");

}

}

Man.java

package com.klvchen.java;

public class Man extends Person{

boolean isSmoking;

int id = 1002;

public void earnMoney() {

System.out.println("男人负责挣钱养家");

}

public void eat() {

System.out.println("男人多吃肉,长肌肉");

}

public void walk() {

System.out.println("男人霸气的走路");

}

}

PersonTest.java

package com.klvchen.java;

import java.util.Date;

public class PersonTest {

public static void main(String[] args) {

Person p1 = new Man();

p1.name = "Tom";

//不能调用子类所特有的方法、属性:编译时,p1 是 Person类型。

//p1.earnMoney();

//p1.isSmoking = true;

//有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致

//编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。

//如何才能调用子类持有的属性和方法?

Man m1 = (Man)p1;

m1.earnMoney();

m1.isSmoking = true;

//使用强转时,可能会出现 ClassCastException 的异常

//Woman w1 = (Woman)p1;

//w1.goShopping();

/*

* instanceof 关键字的使用

* a instanceof A: 判断对象 a 是否是类A的实例。如果是,返回 true,返回不是, 返回 false。

*

* 使用情境:为了避免在向下转型时出现 ClassCastException 的异常,我们在向下转型之前,先

* 进行 instanceof 的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。

*/

if( p1 instanceof Woman) {

Woman w1 = (Woman)p1;

w1.goShopping();

System.out.println("*********** Woman ***********");

}

if(p1 instanceof Man) {

Man m2 = (Man)p1;

m2.earnMoney();

System.out.println("*********** Man ***********");

}

if(p1 instanceof Person) {

System.out.println("*********** Person ***********");

}

if(p1 instanceof Object) {

System.out.println("*********** Object ***********");

}

//问题一:编译通过,运行时不通过

//Person p2 = new Woman();

//Man m2 = (Man)p2;

//Person p3 = new Person();

//Man m3 = (Man)p3;

//m3.earnMoney();

//问题二: 编译通过,运行时也通过

Object obj = new Woman();

Person p = (Person)obj;

//问题三: 编译不通过

//Man m4 = new Woman();

//Object o = new Date();

//String str1 = (String)o;

}

}

运行结果:

6f2265cb547d551f6d64decae84cbc17.png

举例二:

AnimalTest.java

package com.klvchen.java;

public class AnimalTest {

public static void main(String[] args) {

AnimalTest test = new AnimalTest();

test.func(new Dog());

System.out.println("*************************************");

test.func(new Cat());

}

public void func(Animal animal) {// Animal animal = new Dog();

animal.eat();

animal.shout();

if(animal instanceof Dog) {

Dog d = (Dog)animal;

d.watchDoor();

}

}

}

class Animal{

public void eat() {

System.out.println("动物, 进食");

}

public void shout() {

System.out.println("动物, 叫");

}

}

class Dog extends Animal{

public void eat() {

System.out.println("狗吃骨头");

}

public void shout() {

System.out.println("汪!汪!汪!");

}

public void watchDoor() {

System.out.println("看门");

}

}

class Cat extends Animal{

public void eat() {

System.out.println("猫吃鱼");

}

public void shout() {

System.out.println("喵!喵!喵!");

}

}

运行结果:

bf6dd552229d168fa14e8c0b2937dc1d.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值