小白学java核心知识(面向对象)十九:多态性的扩展性、转型

需要注意:
一、父类的引用指向了自己的子类对象是指:Animal a = new Cat(); 这个语句function(new Cat());将cat这个子类当做父类Animal传进public static void function(Animal a)当中。
二、类型提升:例如,byte b=2;int x = b 之前b是byte类型现在被提升为int类型。同理,把cat类型提升为Animal类型,这也称为
向上转型
。但是 运行的结果是子类的结果。
三、向下转型。问题:如果想要调用猫的特有方法时候?如何做?
方法:强制将父类的引用转成子类类型,向下转型。代码:
Animal a =new Cat()
Cat c=(Cat)a;
c.catchMouse();

能转换的是父类的引用指向了自己的子类对象时候,不能转换父类对象,自始至终都是子类对象在做着变化。例如在以下情况不能强制转换:
Animal a = new Animal();
Cat c = (Cat)a;
四、instanceof:是否是某某类型,用于判断语句。

1、多态性的扩展性

/*
多态:可以理解为事物存在的多种体现形态。

人:男人,女人

动物:猫,狗。

猫 x = new 猫();

动物 x = new 猫();

1,多态的体现
	父类的引用指向了自己的子类对象。
	父类的引用也可以接收自己的子类对象。
2,多态的前提
	必须是类与类之间有关系。要么继承,要么实现。
	通常还有一个前提:存在覆盖。

3,多态的好处
	多态的出现大大的提高程序的扩展性。

4,多态的弊端:
	提高了扩展性,但是只能使用父类的引用访问父类中的成员。

5,多态的应用



*/

/*
动物,
猫,狗。
*/

abstract class Animal
{
	abstract void eat();

}

class Cat extends Animal
{
	public void eat()
	{
		System.out.println("吃鱼");
	}
	public void catchMouse()
	{
		System.out.println("抓老鼠");
	}
}


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


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

//-----------------------------------------


class DuoTaiDemo 
{
	public static void main(String[] args) 
	{
		//Cat c = new Cat();
		//c.eat();

		//Dog d = new Dog();
		//d.eat();
		//Cat c = new Cat();
		/*
		Cat c1 = new Cat();
		function(c1);

		function(new Dog());
		function(new Pig());
		*/

		//Animal c = new Cat();
		//c.eat();

		
		function(new Cat());
		function(new Dog());
		function(new Pig());
		

		
	}
	public static void function(Animal a)//Animal a = new Cat();
	{
		a.eat();
		//a.catchMouse();
	}
	/*
	public static void function(Cat c)//
	{
		c.eat();
	}
	public static void function(Dog d)
	{
		d.eat();
	}

	public static void function(Pig p)
	{
		p.eat();
	}
	*/

}

2、多态性的转型

/*
多态:可以理解为事物存在的多种体现形态。

人:男人,女人

动物:猫,狗。

猫 x = new 猫();

动物 x = new 猫();

1,多态的体现
	父类的引用指向了自己的子类对象。
	父类的引用也可以接收自己的子类对象。
2,多态的前提
	必须是类与类之间有关系。要么继承,要么实现。
	通常还有一个前提:存在覆盖。

3,多态的好处
	多态的出现大大的提高程序的扩展性。

4,多态的弊端:
	虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。

5,多态的应用

6,多态的出现代码中的特点(多态使用的注意事项)




第二个问题:如何使用子类特有方法。
*/

/*
动物,
猫,狗。
*/

class Cat extends Animal
{
	public void eat()
	{
		System.out.println("吃鱼");
	}
	public void catchMouse()
	{
		System.out.println("抓老鼠");
	}
}


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


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

//-----------------------------------------


class DuoTaiDemo2 
{
	public static void main(String[] args) 
	{
		//Animal a = new Cat();//类型提升。 向上转型。
		//a.eat();

		//如果想要调用猫的特有方法时,如何操作?
		//强制将父类的引用。转成子类类型。向下转型。
		///Cat c = (Cat)a;
		//c.catchMouse();
		//千万不要出现这样的操作,就是将父类对象转成子类类型。
		//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
		//多态自始至终都是子类对象在做着变化。
//		Animal a = new Animal();
//		Cat c = (Cat)a;
		

		/*
		毕姥爷 x = new 毕老师();

		x.讲课();

		毕老师 y = (毕老师)x;


		y.看电影();
		*/
		function(new Dog());
		function(new Cat());


	}
	public static void function(Animal a)//Animal a = new Cat();
	{
		a.eat();
		/*
		if(a instanceof Animal)
		{
			System.out.println("haha");
		}
		else 
		*/
		if(a instanceof Cat)
		{
			Cat c = (Cat)a;
			c.catchMouse();
		}
		else if(a instanceof Dog)
		{
			Dog c = (Dog)a;
			c.kanJia();
		}


		/*
		instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)  
		*/
	
	}
	


}

猜你喜欢

转载自blog.csdn.net/weixin_45246666/article/details/107757743