• 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();
    	}
    }
    

    运行结果:


    举例一:

    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;
    	}
    
    }
    

    运行结果:

    举例二:

    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("喵!喵!喵!");
    	}
    
    }
    

    运行结果:

  • 相关阅读:
    Delegate(委托与事件)
    eclipse2020-06创建属于自己的JSP模板(图文)
    eclipse没有新建web项目的解决问题
    my97datepicker实现日期改变立刻触发函数
    jetty启动项目后js修改后无法保存
    js连续的日期判断,判断相差几天
    同步和异步
    面试题
    MYSQL 数据库名、表名、字段名查询
    Spring-MVC
  • 原文地址:https://www.cnblogs.com/klvchen/p/14436221.html
Copyright © 2020-2023  润新知