您的位置:首页 > 职场人生

黑马程序员——面向对象08(多态)

2015-08-16 15:29 399 查看
——- android培训java培训、期待与您交流! ———-

1.1,多态

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

1.2,多态的体现

1、父类的引用指向了自己子类的对象。

2、父类的引用也可以接收自己的子类对象。

如: Animal a = new Cat();

其中就将父类型的 a 引用指向了子类的对象。

1.3,多态的前提

1、类与类之间必须有关系,要么继承,要么实现。

2、存在覆盖。父类中有方法被子类重写。

1.4,多态的利与弊

1,多态的好处

多态的出现大大的提高程序的扩展性。

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 类型(类类型 接口类型)
*/

}

}


1.5,多态的特点

1,在多态中成员函数的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

2、多态中成员变量的特点

无论编译和运行,都参考左边(引用变量所属的类)。

3,在多态中,静态成员函数的特点:

无论编译和运行,都参考做左边。

示例1:


class Fu
{
static int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
static void method4()
{
System.out.println("fu method_4");
}
}

class Zi<
4000
/span> extends Fu
{
static int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}

static void method4()
{
System.out.println("zi method_4");
}
}
class  DuoTaiDemo4
{
public static void main(String[] args)
{

//      Fu f = new Zi();
//
//      System.out.println(f.num);
//
//      Zi z = new Zi();
//      System.out.println(z.num);

//f.method1();
//f.method2();
//f.method3();

Fu f = new Zi();
System.out.println(f.num);
f.method4();

Zi z = new Zi();
z.method4();

/*
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。

*/

//      Zi z = new Zi();
//      z.method1();
//      z.method2();
//      z.method3();
}
}


1.6,多态的应用

1、定义好工具类,即将共同行为封装在一个类中。

2、对类型进行抽取,—->多态的产生。

3、操作同一父类型,对其中的子类型均可操作

示例1:


/*
需求:
电脑运行实例,
电脑运行基于主板。
*/

interface PCI
{
public void open();
public void close();
}

class MainBoard
{
public void run()
{
System.out.println("mainboard run ");
}
public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。
{
if(p!=null)
{
p.open();
p.close();

}
}
}

class NetCard implements PCI
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
method();
}

}
class SoundCard implements PCI
{
public void open()
{
System.out.println("SoundCard open");
}
public void close()
{
System.out.println("SoundCard close");
}
}
/*
class MainBoard
{
public void run()
{
System.out.println("mainboard run");
}
public void useNetCard(NetCard c)
{
c.open();
c.close();
}
}

class NetCard
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
}
}
*/

class DuoTaiDemo5
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());

}
}


示例2:


/*
基础班学生:
学习,睡觉。
高级班学生:
学习,睡觉。

可以将这两类事物进行抽取。

*/

abstract class Student
{
public abstract void study();
public void sleep()
{
System.out.println("躺着睡");
}
}

class DoStudent
{

public void doSome(Student stu)
{
stu.study();
stu.sleep();
}

}

class BaseStudent extends Student
{
public void study()
{
System.out.println("base study");
}
public void sleep()
{
System.out.println("坐着睡");
}
}

class AdvStudent extends Student
{
public void study()
{
System.out.println(" adv study");
}
}

class  DuoTaiDemo3
{
public static void main(String[] args)
{

DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());

//      BaseStudent bs = new BaseStudent();
//      bs.study();
//      bs.sleep();
//      AdvStudent as = new AdvStudent();
//      as.study();
//      as.sleep();
}

}


——- android培训java培训、期待与您交流! ———-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息