A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© quicksand007 中级黑马   /  2016-8-28 11:17  /  1262 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[AppleScript] 纯文本查看 复制代码
class Animal {
	public void eat(){
		System.out.println("eat");
	}
	
	public void sleep(){
		System.out.println("sleep");
	}
}

class Dog extends Animal {
	public void eat(){
		System.out.println("狗吃肉");
	}
	
	public void sleep(){
		System.out.println("狗站着睡觉");
	}
}

class Cat extends Animal {
	public void eat() {
		System.out.println("猫吃鱼");
	}
	
	public void sleep() {
		System.out.println("猫趴着睡觉");
	}
}

//针对动物操作的工具类
class AnimalTool {
	private AnimalTool(){}

	public static void useAnimal(Animal a) {
		a.eat();
		a.sleep();
	}	
}

class DuoTaiDemo {
	public static void main(String[] args) {
		Cat c = new Cat();
		c.eat();
		c.sleep();
		
		Cat c2 = new Cat();
		c2.eat();
		c2.sleep();
		
		Cat c3 = new Cat();
		c3.eat();
		c3.sleep();
		//...
		System.out.println("--------------");
		
		AnimalTool.useAnimal(c);
		AnimalTool.useAnimal(c2);
		AnimalTool.useAnimal(c3);
		System.out.println("--------------");
		
		Dog d = new Dog();
		Dog d2 = new Dog();
		Dog d3 = new Dog();
		AnimalTool.useAnimal(d);
		AnimalTool.useAnimal(d2);
		AnimalTool.useAnimal(d3);
		System.out.println("--------------");
		
	}	
}


看视频自学ing  老师讲到多态时说了这个猫狗案例 不过关于上面针对动物的操作工具不太懂 希望大神能解惑~~
35行 定义useAnimal参数是Animal a  ,从57行开始可以直接调用AnimalTool.useAnimal(c);  但是前面创建对象时Cat c = new Cat();
不应该是Animal c = new Cat();吗? 按上面定义了Cat变量  useAnimal方法可以直接调用Cat类变量??


17 个回复

倒序浏览
有没有好心人可以讲解下
回复 使用道具 举报
类名.方法名(对象名),就可以输出啦
回复 使用道具 举报
13402849575 发表于 2016-8-28 11:33
类名.方法名(对象名),就可以输出啦

但是useAnimal要求的对象是Animal类的呀 可以直接拿Cat类的来用吗?
回复 使用道具 举报
quicksand007 发表于 2016-8-28 11:35
但是useAnimal要求的对象是Animal类的呀 可以直接拿Cat类的来用吗?

AnimalTool.useAnimal()这个方法,接收的是Animal,而Cat和Dog都是Animal的子类,可以接收这个两种类型的实参
回复 使用道具 举报
AnimalTool.useAnimal()这个方法,接收的是Animal,而Cat和Dog都是Animal的子类,可以接收这个两种类型的实参
回复 使用道具 举报
13402849575 发表于 2016-8-28 11:43
AnimalTool.useAnimal()这个方法,接收的是Animal,而Cat和Dog都是Animal的子类,可以接收这个两种类型的实 ...

可以直接用子类对象啊……
那就是说不用非得写一句 Animal a = new Cat() 吗?
回复 使用道具 举报
你没理解的是继承。
Cat和Dog是Animal的子类,将子类对象作为实参传递,运行子类重写后的方法。
回复 使用道具 举报
useanimal();方法里面传入一个animal 类的a 参数,猫和狗都是animal的子类,可以传入当做参数。
运行的时候调用的是猫 和 狗的eat和sleep 方法;
回复 使用道具 举报
水月灬清影 发表于 2016-8-28 12:20
你没理解的是继承。
Cat和Dog是Animal的子类,将子类对象作为实参传递,运行子类重写后的方法。 ...

恩恩 谢谢你啦
感觉自学还是理解的不够
回复 使用道具 举报
细听风语为梧桐 发表于 2016-8-28 17:31
useanimal();方法里面传入一个animal 类的a 参数,猫和狗都是animal的子类,可以传入当做参数。
运行的 ...

谢谢解答~
回复 使用道具 举报
该方法需要的而参数是Animal a,你传递具体动物cat或dog等于多态,其实就是Animal a=new Dog();刘老师为什么要把该方法的形参变成Animal a?为什么不是俩个方法Use(Dog d)加Use(Cat c)?因为这样的话每增加一种动物就得修改工具类添加一个新的Use方法,而这是开发忌讳的,工具类一旦被做成,最好是永不修改,所以形参给一个Animal a 一劳永逸,既可以传new Dog()也可以传new Cat(),将来你想添加蛇宠也可以传递new snake(),只需要添加一个新类snake继承Animal重写eat和sleep方法即可,不需要修改工具类。你学到了吗
回复 使用道具 举报
这就是多态呀,父类引用指向子类对象呀,只要父类/子类中有相同方法,编译时看父类是否有,执行时执行子类的成员方法,就可以完成输出.其实我觉得,如果你继续往后看,看完抽象方法和接口,这个定义就更好理解了,拓展性嘛
回复 使用道具 举报
支持一下,顶一下。
回复 使用道具 举报
可以的,看到你们讲的这么详细,我就当一个旁观者了 吧~~
回复 使用道具 举报
life写实 发表于 2016-8-29 17:00
该方法需要的而参数是Animal a,你传递具体动物cat或dog等于多态,其实就是Animal a=new Dog();刘老师为什 ...

哇塞!真是太感谢了~有种醍醐灌顶的赶脚~~
回复 使用道具 举报
a623562486 发表于 2016-8-29 21:24
这就是多态呀,父类引用指向子类对象呀,只要父类/子类中有相同方法,编译时看父类是否有,执行时执行子类的成 ...

恩恩 我还没有看完视频 赶脚路漫漫呀~~
回复 使用道具 举报
可以呀,Cat是animal的子类,而useAnimal是animal的工具类,想要使用里面的方法就需要animal的对象,而Cat就是animal的一个对象,并且工具类里的方法是静态的方法,所有可以通过类名打点访问,因此直接在调用useAnimal方法的时候把Animal的对象Cat传过去就ok了。这样解释能明白吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马