黑马程序员——Java基础——继承之多态(三)

原创 2015年11月18日 15:23:18
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

多态:
package cn.fuxi.jiekou;
/**
 * 多态:某一类事物的多种存在形态
 * 
 * 例:动物中猫,狗.
 * 猫这个对象对应的类型时猫类型:猫 c = new 猫();
 * 同时猫也是动物中的一种,可以把猫称为动物:动物 c = new 猫();
 * 动物是猫和狗具体事物中抽取出来的父类型.
 * 父类型引用指向了子类对象.
 * 
 * 多态性简单说就是一个对象对应着不同类型.
 * 
 * 体现:父类或者接口的引用指向或者接收自己的子类对象.
 * 作用:多态的存在提高了程序的扩展性和后期的可维护性.
 * 前提:
 * 1.需要存在继承或者实现关系.
 * 2.需要有覆盖操作.
 * 
 * 好处:提高了代码的扩展性,前期定义的代码可以使用后期的内容.
 * 弊端:前期定义的内容不能使用(调用)后期子类的特有内容.
 */

abstract class Animal{
	abstract void eat();
}

class Dog extends Animal{
	void eat(){
		System.out.println("狗吃骨头");
	}
	void lookHome(){
		System.out.println("狗看家");
	}
}

class Cat extends Animal{
	void eat(){
		System.out.println("猫吃猫粮");
	}
	void catchMouse(){
		System.out.println("猫捉老鼠");
	}
}

class Pig extends Animal{
	void eat(){
		System.out.println("猪吃饲料");
	}
	void gongDi(){
		System.out.println("猪会拱地");
	}
}

public class InterfaceDemo5 {
	public static void main(String[] args) {
		Animal c = new Cat();
		Dog d = new Dog();
		method(c);//猫吃猫粮
		method(d);//狗吃骨头
		method(new Pig());//猪吃饲料
		//自动类型提升,猫对象提升到了动物类型.但是特有功能无法访问,作用就是限制对特有功能的访问.
		//向上转型,将子类型隐藏,就不能使用子类特有方法了
		//c.catchMouse();报错
		//如果还想用具体动物猫的特有功能,可以向下转型(强转为猫)
		Cat c1 = (Cat)c;
		c.eat();
		c1.catchMouse();
		//注意:对应转型,自始至终都是子类对象在做类型的变化.
		Animal dog = new Dog();
		Cat e = (Cat)dog;//编译不报错,但是运行报错,Dog无法转换成Cat
		e.eat();//无法运行,编译不报错
	}
	public static void method(Animal a){
		a.eat();
		}
}
运行结果:
猫吃猫粮
Exception in thread "main" 狗吃骨头
猪吃饲料
猫吃猫粮
猫捉老鼠
java.lang.ClassCastException: cn.fuxi.jiekou.Dog cannot be cast to cn.fuxi.jiekou.Cat
at cn.fuxi.jiekou.InterfaceDemo5.main(InterfaceDemo5.java:70)

package cn.fuxi.jiekou;
//毕老师和毕姥爷的故事
class BiLaoYe{
	void teacher(){
		System.out.println("管理");
	}
	void fishing(){
		System.out.println("钓鱼");
	}
}
class BiLaoShi extends BiLaoYe{
	void teacher(){
		System.out.println("java");
	}
	void movie(){
		System.out.println("看电影");
	}
}

public class DuoTai {
	public static void main(String[] args) {
		BiLaoShi bs = new BiLaoShi();
		bs.teacher();
		bs.movie();
		//多态调用时,只能用重写过的父类的功能,不能用自己特有的功能
		BiLaoYe by = new BiLaoShi();
		by.teacher();
		by.fishing();
		//如果要用自己特有的功能,可以把类型转换为自己.
		BiLaoShi by1 =(BiLaoShi)by;
		by1.movie();
	}
}
运行结果:
java
看电影
java
钓鱼
看电影

package cn.fuxi.duotai;
/**
 * P.S. instanceof:用于判断对象的具体类型,只能用于引用数据类型判断,通常在向下转型前用于健壮性的判断.
 */
class Animal{
	void eat(){}
	void sleep(){}
}
class Cat extends Animal{
	void eat(){
		System.out.println("猫吃猫粮");
	}
	void catchMouse(){
		System.out.println("猫捉老鼠");
	}
}
class Dog extends Animal{
	void eat(){
		System.out.println("狗吃骨头");
	}
	void lookHome(){
		System.out.println("狗会看家");
	}
}
public class InstanceofDemo {

	public static void main(String[] args) {
		Animal a = new Cat();
		method(a);
		method(new Cat());
		method(new Dog());
	}
	public static void method(Animal a){
		a.eat();
		if(a instanceof Cat){
			Cat c =(Cat)a;
			c.catchMouse();
		}
		else if(a instanceof Dog){
			Dog d = (Dog)a;
			d.lookHome();
		}
	}
}
运行结果:
猫吃猫粮
猫捉老鼠
猫吃猫粮
猫捉老鼠
狗吃骨头
狗会看家

多态特点:
package cn.fuxi.duotai;
/**
 * 多态时,成员的特点:
 * 1.成员变量
 * 编译时:参考引用型变量所属的类中是否有调用的成员变量?有,编译通过,没有,编译失败.
 * 运行是:参考引用型变量所属的类中是否有调用的成员变量?并运行该所属类中的成员变量.
 * 简单说:编译和运行都参考等号的左边.(成员变量全用爹的)
 * 
 * 2.成员函数(非静态)
 * 编译时:参考引用型变量所属的类中是否有调用的函数.有,编译通过.没有,编译失败.
 * 运行时:参考的是对象所属的类中是否有调用的函数.
 * 简单说:编译看左边,运行看右边.(自己有用自己,没有就借爹的)
 * 
 * 3.静态函数
 * 编译时:参考的是对象所属的类中是否有调用的函数.
 * 运行时:参考的是对象所属的类中是否有调用的函数.
 * 简单说:编译和运行都砍左边.(静态全用爹的)
 */

class Fu{
	int num = 3;
	void show(){
		System.out.println("fu show");
	}
	static void method(){
		System.out.println("fu static method");
	}
}
class Zi extends Fu{
	int num = 4;
	void show(){
		System.out.println("zi show");
	}
	static void method(){
		System.out.println("zi static method");
	}
}
public class DuoTaiDemo {
	public static void main(String[] args) {
		//Zi z = new Zi();
		//System.out.println(z.num);
		Fu f = new Zi();
		System.out.println(f.num);
		f.show();
		f.method();
		Fu.method();
		//Zi.method();
	}
}
运行结果:
3
zi show
fu static method
fu static method



黑马程序员——JAVA基础之多态与Object

------- android培训、java培训、期待与您交流! ----------

黑马程序员——Java 基础 面向对象之多态 (复习)

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 一、理解多态 多态:可以理解为事物存在的多种体现形态。 例如:人这类事...

黑马程序员——java基础之多态

——- android培训、java培训、期待与您交流! ———- 一 多态 1. 多态的概念: 多态:可以理解为,事物存在的多中体现形态 对象的多态性 人:男人 女人 动物:猫、...

黑马程序员——学习日记9 java面向对象之多态

------- java培训、Android培训 期待与您交流! ----------
  • T2ANDY
  • T2ANDY
  • 2014年04月27日 14:08
  • 315

黑马程序员——Java基础:继承、final关键字、抽象、接口、多态

一、面向对象之继承——extends 子类和父类:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类可以称为子类,单 独这个类...

黑马程序员 ——Java基础之继承、抽象、接口、多态

继承 关键字:extends   1,提高了代码的复用性 2,让与类之间产生了关系,有了这个关系,才有了多态的特性   注意:不能为了获取其他类的功能,简化代码而继承; 必须是类与类之间有所属关系才可...
  • zdh_61
  • zdh_61
  • 2015年05月02日 17:50
  • 234

黑马程序员——java基础----面向对象(二) 继承和多态

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

黑马程序员——Java基础--继承、多态、抽象、接口联合使用的案例

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 第五讲 案例 教练和运动员案例 要求 :三个属性            构造方法...
  • c_san_6
  • c_san_6
  • 2015年06月27日 14:40
  • 313

黑马程序员 JAVA基础学习日记五——封装 继承 多态

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1.    Java中的类和接口,都是隶属于某一个包的。 我们在使用类或接口时,就需要引...

黑马程序员—JAVA基础之多态

多态 多态是java面向对象中一个重要的概念,它也是事物存在的多种体现形态。比如一个简单的例子,在动物这个大的类中,包含有许多不同的物种,我们可以称一只猫为猫,我们也可以说它是动物,这是很显然的...
  • yxqcz
  • yxqcz
  • 2014年04月24日 22:19
  • 263
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员——Java基础——继承之多态(三)
举报原因:
原因补充:

(最多只允许输入30个字)