『黑马程序员』---java--面向对象--多态+Object篇

来源:互联网 发布:寰神结剧情知乎 编辑:程序博客网 时间:2024/05/21 11:15

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

多态,是面向对象中的一大特点.其,在继承的基础上产生,就是使java世界中的实物具有多种存在形态.


多态定义:某一类事物的多种存在形态

体现(表现形式):父类的引用指向了自己的子类对象;或者也可以说父类的引用也可以接受自己的子类对象.

前提:必须是类与类之间有关系,要么继承,要么实现.通常还要存在覆盖.

好处:多态的出现大大提高了程序的扩展性

弊端,虽然提高了扩展性,但是也只能使用父类的引用访问父类中的成员而已


例子:   动物:猫  , 狗 , 

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 defend(){System.out.println("守家");}}public class DuoTaiDemo {public static void main(String[] args) {Animal a=new cat();//类型提升,向上转型a.eat();//打印出"吃鱼"//如果想要调用猫的特有方法,可以强制将父类的引用,转成子类类型.向下转型cat c=(cat)a;//向下转型c.catchMouse();}}


(重)在多态中,成员函数的特点:

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

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


在多态中,成员变量的特点:

当父类,子类出现重名变量时,无论编译还是运行,都参考左边(引用型变量所属的类)


在多态中,静态成员函数,变量特点:

无论编译和运行,都参考左边(只参考引用所属,与类静态绑定)

class Fu{int num=5;void method1(){System.out.println("fu_1");}void method2(){System.out.println("fu_2");}static void method4(){System.out.println("fu_4");}}class Zi extends Fu{int num=8;void method1(){System.out.println("zi_1");}void method3(){System.out.println("zi_3");}static void method4(){System.out.println("zi_4");}}public class DuoTaiDemo{public static void main(String[] args) {Fu f=new Zi();f.method1();f.method2();//f.method3();父类中没有,必须向下转型才可以调到System.out.println(f.num);//打印出5,是父类中的numZi z=new Zi();z.method1();//打印出zi_1z.method2();//打印出fu_2,继承父类的,直接用z.method3();//打印出zi_3System.out.println(z.num);//打印出8,是子类中的numf.method4();//result:fu_4z.method4();//result:zi_4}}


Object 类,是类层次结构的根类.每个类都使用Object作为超类(包括数组)都实现这个类的方法.[所有对象的直接或间接父类,就是上帝,该类中定义的是所有对象都具备的功能]

常见的有equals----Object类中提供的.

对,对象是否相同的比较方法.[如果自定义类中也有比较相同的功能,此时没必要重新定义,只要沿袭父类中的功能即可,建立自己特有的比较内容]

class Demo{//extends Objectprivate int num;Demo(int num){this.num=num;}public boolean equals(Object obj){//Object obj=new Demo();if(!(obj instanceof Demo))//判断obj是否为demo类的对象return false;Demo d=(Demo)obj;//向下转型return this.num==d.num;}}public class  Test{public static void main(String[] args) {Demo d1=new Demo(4);Demo d1=new Demo(4);System.out.println(d1.equals(d2));//使用复写后的equals,结果为true//假设有一个person类person p=new person(4);System.out.println(d1.equals(p));//因为p不是demo类的对象,不能调用demo类中的equals方法,用的还是Object中的,所以结果是false}}



0 0
原创粉丝点击