黑马程序员__多态技巧总结

------Java培训期待与您交流! -------

继承extends,不支持多继承,但支持多层继承java


如何使用一个继承体系中的功能呢?面试


想要使用体系,先查阅体系父类的描述,由于父类中定义的是该体系中共×××。数组

经过了解共×××,就能够知道该体系的基本功能。ide

那么这个体系已经能够基本使用了。函数

那么在具体调用时,要建立最子类的对象,为何呢?this

一是由于有可能父类不能建立对象,spa

二是建立子类对象可使用更多的功能,包括基本的也包括特有的。orm



简单一句话:查阅父类功能,建立子类对象使用功能。对象

---------------------------------------------------继承

1.多态的体现:

向上转型:父类的引用指向了本身的子类对象,这样的话,父类引用就变成父类成员,使用的方法是子父类的交集,也就是子类继承父类后重写的方法

向下转型:强制将父类的引用,转成子类对象。记住不能将父类转成子类,由于父类自己不具有子类有的内容


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("吃骨头");
}
publci void kanJia(){
System.out.pritnln("吃骨头");
}
}
public static void function(Animal a) //Animal a=new Cat();
{
a.eat;
if(a instanceof Cat){
Cat c=(Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog c=(Dog)a;
c.kanJia();
}
}
main(){
function(cat);
function(dog);
}


--


向上转型    

Animal a=new Cat();

a.eat



向下转型

Cat c =(Cat)a


if (a instanceof Type)    判断对象是不是继承或者等于某个Type类

if (this.getClass()==obj.getClass)判断对象的类型是否和某个类相同


-----------------------

面试题,通常开发不会出现

小技巧:

在多态总花姑娘成员函数的特色:

在编译时期:查阅 引用型所属的类中 是否有调用的方法。若是有,编译经过,若是没有,就编译失败

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

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



Animal a=new Cat();

a.eat

a.catchMouse

左边: Animal是否有catchMouse方法,若是没有,就已是编译不经过了

右边:Cat是否有catchMouse eat方法,若是有,那么就用Cat方法,若是没有就会用父类方法,那么就会运行失败(由于父类通常是抽象类)



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

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


静态成员的话,是不用参考右边的,由于不须要对象,因此,左边哪一个类调用静态成员或者方法,就是该类的静态成员或者方法,就是该类的静态所属

---


赋值的多态

Quadrangle obj=new Square();声明的变量obj是Quadrangle类型的,而赋值倒是Square类型的实际变量

Quadrangle obj1=new Parallelogram();   


Suqare newObj=(Square)quaObj;   强制类型转换


多态数组--将父类数组元素进行子类的对象赋值

Quadrangle[] quadrangles=new Quadrangle[3];
quadrangles[0]=new Square();
quadrangles[1]=new Parallelogram();
for (Quadrangle obj:quadrangles){
obj.draw();
}



返回类型的多态--经过定义父类类型的方法,返回父类型的初始值

public Quadrangle getQuadrangle(){
Quadrangle tmp=new Quadrangle();
return tmp;
}


方法的多态--将父类方法用于的参数定义为父类成员,那么调用此方法的子类成员都也能够调用父类方法

public void alldraw(Quadrangle quadrangle){
quadrangle.draw;
}
Quadrangle.alldraw(square);
Quadrangle.alldraw(parallelogram);



将父类Quadrangle  进行继承给    Suqare和Parallelogram。

而后利用Quadrangle类格式变成数组格式,而后将子类对象的实参  赋值给父类的对象,在用foreach进行输出每一个元素的draw()方法。

---------------------------------------------------------------------------------

public class Quadrangle{
public void draw(){
System.out.println("绘制自身图形");
}
}

--------------------------


public class Square extends Quadrangle {
public void draw(){
System.out.println("正方形");
}
}

----------------------------

public class Parallelogram extends Quadrangle {
public void draw(){
System.out.println("长方形");
}
}



-------------------------------

public class Demo{
public static void main(String[] args){
Quadrangle[] quadrangles=new Quadrangle[3];
quadrangles[0]=new Square();
quadrangles[1]=new Square();
quadrangles[2]=new Square();
for (Quadrangle obj:quadrangles){
obj.draw();
}
}
}
相关文章
相关标签/搜索