一、多态

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

一、多态1.1、多态概念

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

例:动物中猫,狗。

猫这个对象对应的类型是猫类型:猫 x = new 猫();

同时猫也是动物中的一种,也可以把猫称为动物:动物 y = new 猫();

动物是猫和狗具体事物中抽取出来的父类型。

父类型引用指向了子类对象。

体现:

父类或者接口的引用指向或者接收自己的子类对象。

作用:

多态的存在提高了程序的扩展性和后期可维护性。

前提:

1. 需要存在继承或者实现关系。

2. 需要有覆盖操作。

好处:

提高了代码的扩展性,前期定义的代码可以使用后期的内容。

1.2、2种类型

向上转型和向下转型

1.3、向上转型

声明时为父类的类型,如动物 小鸟=new 小鸟();

但运行时为子类的类行

任何子类存在的地方都可以用父类来替代

packagecom.day08.doutai.demo1;publicabstractclassAnimal {PRivateString name;privateString gender;/*** 吃饭方法*/publicabstractvoideat();publicString getName() {returnname;

}publicvoidsetName(String name) {this.name =name;

}publicString getGender() {returngender;

}publicvoidsetGender(String gender) {this.gender =gender;

}

}

packagecom.day08.doutai.demo1;/*** 小鸟吃虫子

*@authordenny

**/publicclassBirdextendsAnimal {

@Overridepublicvoideat() {

System.out.println("小鸟吃虫子");

}publicvoidfly(){

System.out.println("小鸟在天上飞");

}

}

packagecom.day08.doutai.demo1;/*** 小狗吃骨头

*@authordenny

**/publicclassDogextendsAnimal {

@Overridepublicvoideat() {

System.out.println("小狗吃骨头");

}publicvoidrun(){

System.out.println("小狗在地上跑!");

}

}

packagecom.day08.doutai.demo1;/*** 小猪类

*@authordenny

**/publicclassPigextendsAnimal {

@Overridepublicvoideat() {

System.out.println("小猪吃杂食!");

}publicvoidsleep(){

System.out.println("小猪在睡觉!");

}

}

测试类

packagecom.day08.doutai.demo1;/*** 多态向上转型

* 声明状态进为父类

* 运行时状态为子类

*@authordenny*/publicclassAnimalTest1 {publicstaticvoidmain(String[] args) {//声明小狗Animal dog=newDog();//声明小猪Animal pig=newPig();//声明小鸟Animal bird=newBird();

getAnimal(dog);

getAnimal(pig);

getAnimal(bird);

}publicstaticvoidgetAnimal(Animal a){

a.eat();

}

}

结果:

小狗吃骨头

小猪吃杂食!小鸟吃虫子

1.4、向下转型

判断是不是子类,是就强制类型转换

intanceof 关键字来判断

以上类不变

packagecom.day08.doutai.demo1;/*** 多态向上转型

* 声明状态进为父类

* 运行时状态为子类

*@authordenny*/publicclassAnimalTest1 {publicstaticvoidmain(String[] args) {//声明小狗Animal dog=newDog();//声明小猪Animal pig=newPig();//声明小鸟Animal bird=newBird();

getAnimal(dog);

getAnimal(pig);

getAnimal(bird);

}publicstaticvoidgetAnimal(Animal animal){//判断是不是 小狗类if(animalinstanceofDog){

Dog dog=(Dog)animal;

dog.run();//判断 是不是小鸟}elseif(animalinstanceofBird){

Bird bird=(Bird)animal;

bird.fly();

}elseif(animalinstanceofPig){

Pig pig=(Pig)animal;

pig.sleep();

}

}

}

结果:

小狗在地上跑!小猪在睡觉!小鸟在天上飞

1.5、简单工厂

packagecom.day08.doutai.demo1;publicclassAnimalFactory {

Animal an;publicAnimal getAmincal(String animal){if(animal.equalsIgnoreCase("bird")){

an=newBird();

}elseif(animal.equalsIgnoreCase("pig")){

an=newPig();

}elseif(animal.equalsIgnoreCase("dog")){

an=newDog();

}else{

System.out.println("没这个动物");

}returnan;

}

}

测试类

packagecom.day08.doutai.demo1;publicclassTest1 {publicstaticvoidmain(String[] args) {//声明一个工厂类AnimalFactory factory=newAnimalFactory();

Animal animal=factory.getAmincal("dog");

animal.eat();

}

}

结果:

小狗吃骨头

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

成员函数特点:

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

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

简单:成员函数在多态调用时,编译看左边,运行持右边

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

静态成员,也是都参考左边

packagecom.day08.demo1;/*** 父类

*@authorDenny

**/publicclassFu {//成员变量intnum=5;

}packagecom.day08.demo1;publicclassZiextendsFu {intnum=8;

}packagecom.day08.demo1;publicclassTest1 {publicstaticvoidmain(String[] args) {

Fu f=newZi();

System.out.println(f.num);//5Zi z=newZi();

System.out.println(z.num);//8}

}

结果:

5

8

二、Object类

2.1、Object类

Object类是所有类的根类(间接父类),java对象中最顶级的类。

这个类中定义了所有对象都具备的功能

2.2、equalse()方法

packagecom.day08.objec.demo1;/*** 人类

*@authorAdministrator

**/publicclassPerson {/*** 姓名

* 年龄

* 性别*/privateString name;privateintage;privateString gender;/*** getter和setter方法

*@return*/publicString getName() {returnname;

}publicvoidsetName(String name) {this.name =name;

}publicintgetAge() {returnage;

}publicvoidsetAge(intage) {this.age =age;

}publicString getGender() {returngender;

}publicvoidsetGender(String gender) {this.gender =gender;

}

}

测试类

packagecom.day08.objec.demo1;publicclassTest1 {publicstaticvoidmain(String[] args) {

Person p1=newPerson();

Person p2=newPerson();

Person p3=p1;

System.out.println(p1==p2);

System.out.println(p1.equals(p2));

System.out.println(p1==p3);

System.out.println(p1.equals(p3));

}

}

结果:

false

false

true

true

重写equals方法

/*** 重写equalse方法*/@Overridepublicbooleanequals(Object obj) {//判断是不是这个对象if(this==obj){returntrue;

}//判断 如果是空值就返回falseif(null==obj){returnfalse;

}if(objinstanceofPerson){

Person p=(Person)obj;returnname.equals(p.getName())&&age==p.getAge()&&gender.equals(p.getGender());

}else{returnfalse;

}

}

测试

packagecom.day08.objec.demo1;publicclassTest1 {publicstaticvoidmain(String[] args) {

Person p1=newPerson();

p1.setName("张三");

p1.setAge(20);

p1.setGender("男");

Person p2=newPerson();

p2.setName("李四");

p2.setAge(21);

p2.setGender("女");

Person p3=p1;

p3.setName("张三");

p3.setAge(20);

p3.setGender("男");

System.out.println(p1.equals(p2));

System.out.println(p1.equals(p3));

System.out.println(p1.hashCode());

System.out.println(p2.hashCode());

System.out.println(p3.hashCode());

}

}

结果:

false

true

705927765

366712642

705927765

2.3、toString()类

toString=getClass().getName+@+Integer.toHexString(hasCode())

还是上面的Person类

packagecom.day08.objec.demo1;publicclassTest2 {publicstaticvoidmain(String[] args) {

Person p1=newPerson();

System.out.println(p1.toString());//默认为十六进制System.out.println(p1.hashCode());//默认为10进制System.out.println(Integer.toHexString(p1.hashCode()));//转换为十六进制System.out.println(p1.getClass().getName()+"@"+Integer.toHexString(p1.hashCode()));

}

}

结果:

com.day08.objec.demo1.Person@2a139a55

705927765

2a139a55

com.day08.objec.demo1.Person@2a139a55

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航