【【多态】】
instanceof
定义:某一种事物的多种存在形态
【【instanceof 关键字】】用于判断所属类型。
/*
* 【【多态】】
* 定义:某一种事物的多种存在形态
* 人:男人、女人
* 动物:猫、狗
* 猫 x = new 猫;
* 动物 x = new 猫;
*
* 多态强调对象上的体现,其实函数也体现出了。
* 重点讲:对象的多态性。
*
* 围绕一下4点学习:
* 1、多态的体现形式?
* 父类的引用指向了自己的子类对象,这就是多态的体现。
* 父类的引用也可以接收自己的子类对象。
* 2、多态的前提?
* 必须是类与类之间有关系,要么继续,要么实现。
* 通常还有一个前提:存在覆盖。
* 3、多态的好处?
* 多态的出现,大大的提高了程序的扩展性
* 4、多态的弊端:
* 提高了扩展性,但只能使用父类的引用访问父类的成员。
* 5、多态的应用?【请看Demo_Duotai3】
* 6、多态出现在代码中的特点(多态使用的注意事项)【请看Demo_Duotai4】
*
*/
/*
* 需求:
* 动物
* 猫,狗
*/
package DayXuexi;
abstract class Animal{
abstract void eat();
}
//猫
class Cat extends Animal{
public void eat(){
System.out.println("chi yu");
}
public void cathMouse(){
System.out.println("zhua mouse");
}
}
//狗
class Dog extends Animal{
public void eat(){
System.out.println("chi gu tou");
}
public void kanHome(){
System.out.println("kan Home");
}
}
//猪
class Pig extends Animal{
public void eat()
{
System.out.println("chi si liao");
}
public void gongDi(){
System.out.println(" gong di");
}
}
public class Demo_Duotai {
public static void main(String []args){
/*按照以往的逻辑,我们在这里想要这些东西吃东西,那么就得挨个new一次,并调用吃的方法。非常麻烦
* 而多态的出现,则解决了这个复杂的代码:
*/
//第一步:
/*
Animal a=new Cat();//[a]
a.eat();
Animal b=new Dog();
b.eat();
Animal c=new Pig();
c.eat();
*/
//继续优化:
Function(new Cat());
Function(new Dog());
Function(new Pig());
}
public static void Function(Animal name){ //[b] 其实就是: Animal name=new Cat/Dog/Pig
name.eat();
}
//否则每一个东西都要写这么一个方法进行重载,相比,多态提高了代码的扩展性。
/*
public static void Function(Cat c){
c.eat();
}
public static void Function(Dog d){
d.eat();
}
public static void Function(Pig p){
p.eat();
}
*/
}
-------------------------------------------------------------------------------------------------------
package DayXuexi;
/*
* 【【多态】】
* 定义:某一种事物的多种存在形态 至始至终都是子类在做着变化。
用多态1的例子来使用【特有方法】
*/
abstract class Animal2{
abstract void eat();
}
//猫
class Cat2 extends Animal2{
public void eat(){
System.out.println("chi yu");
}
public void cathMouse(){
System.out.println("zhua mouse");
}
}
//狗
class Dog2 extends Animal2{
public void eat(){
System.out.println("chi gu tou");
}
public void kanHome(){
System.out.println("kan Home");
}
}
//猪
class Pig2 extends Animal2{
public void eat()
{
System.out.println("chi si liao");
}
public void gongDi(){
System.out.println(" gong di");
}
}
public class Demo_Duota2 {
public static void main(String []args){
//关键:
Animal a=new Cat();//类型提升 这里把cat提升为Animal 也称为向上转型
/*比如以前学习到的 byte=2; int x=b; b就会被提升为int */
a.eat();
/*如果想要调用cat的特有方法时,如何操作*/
//【强制】将父类的引用转成子类类型 【 向下转型】
Cat c=(Cat)a;
c.eat();
c.cathMouse();
/*这个时候,子类的两个方法都拥有了。
千万不要将父类对象转为子类类型。
正确的是将父类的应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换
当子类有限的时候可以用【mm】
【多态】至始至终都是子类对象在做着变化。
*/
}
public static void Function(Animal2 name){ //[b] 其实就是: Animal name=new Cat/Dog/Pig
name.eat();
/* 子类有限的时候才这么干。【mm】
if(name instanceof Cat2){
Cat2 c= (Cat2)name;
} else if(name instanceof Dog2){
Dog2 d=(Dog2)name;
} else if(name instanceof Pig2){
Pig2 p=(Pig2)name;
}
*/
}
}
---------- android培训、 java培训 、期待与您交流!----------
黑马官网: http://edu.csdn.net/heima