(13)Java学习笔记——面向对象07——多态

来源:互联网 发布:linux怎么卸载jdk 编辑:程序博客网 时间:2024/05/16 10:03

多态

某一个事物,在不同时刻表现出来的不同状态。

举例:

--| 猫可以是猫的类型。 猫 m = new 猫();

--| 同时猫可以是动物类型,也可以把猫称为动物。  动物  d = new 猫();


猫这类事物即具备猫的形态,又具备着动物的形态。

class 动物//父类{}class 猫 extends 动物//子类{}class 狗 extends 动物{}猫 x = new 猫;动物 x = new 猫;//父类指向子对象,体现出多态性


多态的前提:

1/多态要有继承关系

2/必须要有重写(不重写就没意义)

3/ 要有父类引用指向子类对象。(父类 f = new 子类();


范例:

class Fu{public void show(){System.out.println("show Fu");}}class Zi extends Fu//前提①:zi类继承父类{public void show()//前提②:对父类方法重写{System.out.println("show Zi");}}class DuoTaiDemo {public static void main(String[] args) {Fu f = new Zi();//前提③:父类引用指向子类对象}}


多态中的成员访问特点:

1 / 成员变量

       编译看左边,运行看左边。(变量看的父类的)

2 / 构造方法

       创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。

3 / 成员方法

       编译看左边,运行看右边。(因为方法重写,父类方法被子类覆盖,只留下子类方法)

4 / 静态方法

       编译看左边,运行看左边。(静态方法算不上重写,静态和类相关,所以访问的还是左边)


由于成员方法存在方法重写,所以运行看右边。


多态的好处:

1 / 提高了代码的维护性(用继承保证)

2 / 提高了代码的扩展性,前期定义的代码可以使用后期的内容。(由多态保证)


范例:

/*通过动物来示范多态的扩展性*/class Animal//定义一个Animal父类{public void eat(){System.out.println("eat");}public void sleep(){System.out.println("sleep");}}class Cat extends Animal//定义一个cat类继承Anamal类{public void eat()//重写父类方法{System.out.println("小猫吃鱼");}public void sleep()//重写父类方法{System.out.println("小猫趴着睡觉");}}class Dog extends Animal//定义一个Dog类继承Anamal类{public void eat()//重写父类方法{System.out.println("小狗啃骨头");}public void sleep()//重写父类方法{System.out.println("小狗站着睡觉");}}/*可以不断定义新的动物,继承父类Animal的共性,提高了扩展性*/class AnimalTool//定义一个Animal工具类,调用对象方法{private AnimalTool()//定义一个私有空参构造方法{}public static void useAnimal(Animal a)//定义一个静态Animal带Animal参数的方法{a.eat();a.sleep();}}class DuoTaiDemo_02 {public static void main(String[] args) {Animal c1 = new Cat();//用父类引用指向子类对象,定义cat对象Animal c2 = new Cat();Animal c3 = new Cat();AnimalTool.useAnimal(c1);//用(类名.方法名)传参,调用工具类方法AnimalTool.useAnimal(c2);AnimalTool.useAnimal(c3);System.out.println("---------------------------------");Animal d1 = new Dog();Animal d2 = new Dog();Animal d3 = new Dog();AnimalTool.useAnimal(d1);AnimalTool.useAnimal(d2);AnimalTool.useAnimal(d3);}}


多态的弊端(局限性):

不能使用子类的特有功能。


需要用到子类特有功能时可以用的方法:

a / 创建子类对象,调用子类方法。(但是不合理,实际是创建了两个对象:Fu f = new Zi();     Zi z = new Zi();)

b / 把父类的引用强制转换为子类引用。 (Zi z = (Zi) f;)


对象间转型:

向上转型:Fu f = new Zi();

**向上转型的作用是限制对对象特有功能的访问。

向下转型:Zi z = (Zi)f;

**向下转型的目的是为了使用子类中的特有方法。

范例:

class  DuoTime02{public static void main(String[] args) {Animal a = new Cat();//自动类型提升。Cat对象提升为Animal类型。访问上出现局限性,不能访问Cat的特有功能。作用就是限制对特有功能的访问。//向上转型。a.eat();//如果还想使用具体Cat的特有功能。可以将该对象进行向下转型。Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。c.eat();c.catchMouse();}public static void method(Animal a)//Animal a 在不断指向Animal的子类对象,体现了子类对象的多态性(Animal a = new Dog();   Animal a = new Cat();){a.eat();}}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("抓老鼠");}}


练习01:南北方人饮食案例

/*南北方人案例*/class Person{private void Person(){}public void eat(){System.out.println("eat");}}class SouthPerson extends Person{void SouthPerson(){}public void eat(){System.out.println("南方人吃米饭");}public void sell(){System.out.println("南方人经商");}}class NorthPerson extends Person//定义北方人类,继承Perfon{void NorthPerson(){}public void eat(){System.out.println("北方人吃面食");}public void work()//定义北方人特有方法{System.out.println("北方人实业");}}class DuoTaiTest_01 {public static void main(String[] args) {Person p1 = new SouthPerson();//多态,继承父类方法p1.eat();SouthPerson p11 = (SouthPerson)p1;//向下强转,调用子类特有方法p11.sell();System.out.println("---------------");Person p2 = new NorthPerson();p2.eat();NorthPerson p22 = (NorthPerson)p2;p22.work();}}






类型判断 关键字 intanceof(通常在向下转型前用于代码健壮性的判断)

instanceof 用于判断对象的具体类型,只能用于医用数据类型判断。

示例: if ( a instanceof Cat)







0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绝地求生卡在登陆页面怎么办 白鞋子长霉了怎么办 幸福树树干烂了怎么办 花椒树树叶掉落枝干发黑怎么办 茉莉枝干变干了怎么办 冲风了头蒙怎么办 不小心把腰扭了怎么办 白衣服发霉有小黑点怎么办 佛肚竹的枝叶都枯了怎么办 山竹一天吃多了怎么办 水养竹子叶子发黄怎么办 龙竹的竹杆黄了怎么办 散尾竹叶子发黑怎么办 给姐姐打工不发工资怎么办? 水培红掌叶子发黄怎么办 盆竹的叶尖发黄怎么办 养富贵竹水里怎么生小虫怎么办 盆栽金银花叶子全部落掉怎么办 荷花竹根部烂了怎么办 水培绿萝叶子发黄怎么办 大早上的公鸡老打鸣怎么办 紫吊兰叶子变绿怎么办 芙桑花叶子发黄怎么办 长春花长得太高怎么办 四季梅叶子蔫了怎么办 吸财树叶子蔫了怎么办 民族团结手抄报间单有漂亮怎么办 鹦鹉尾巴毛掉了怎么办 羊绒衫领子打太大了怎么办 内裤洗了还有一股味道怎么办 月经下不来内裤上总有脏东西怎么办 夏天外衣薄露出内衣怎么办 金毛体味很重怎么办 直筒连衣裙太短怎么办 托班社会下雨了怎么办 托班下雨了怎么办教案 吃鸡界面有鼠标怎么办 老年机成英语了怎么办 手机成了英语了怎么办 塑料袋融化粘到衣服上怎么办 厕所被卫生纸堵了怎么办