抽象类初学以及和接口的关联 多态 instanceof运算符d

抽象类和抽象方法:

抽象类不能new对象,但在子类中可以用父类new对象(或者通过)

抽象方法和常规方法很相似,只是不实现其中的逻辑,来交给他的子类实现;

抽象类包含了抽象和普通的构造方法,抽象的构造方法要用protected,抽象方法只能在子类中被调用;

非抽象类不能含有抽象的构造方法

如果一个子类继承了一个抽象的父类,那么这个子类一定要重写所有父类中的抽象的构造方法,否则子类要定义成抽象的

非抽象类的父类也可以有抽象的子类继承

接口类似于一种父类,也需要继承

 

 


 

接口

new <接口名> () 

{

 

};

 

注意:1、new操作符后面跟的是接口名,表明上是创建接口对象,实质上是创建了接口的匿名内部类对象

几乎和抽象类同样的存在,只是继承时用implements;

一个类只能继承一个父类,但能继承多个接口;

一个接口也能继承其它接口(不是类),这样的接口称作子接口,实现这样的子接口的类,一定要把这个子接口以及其父接口中的所有方法实现(因为接口中的方法全是公共抽象实例方法);

 

抽象类初学以及和接口的关联 多态 instanceof运算符d

 

 

 

 

抽象类举例:

抽象类初学以及和接口的关联 多态 instanceof运算符d

 

接口举例:

抽象类初学以及和接口的关联 多态 instanceof运算符d

 

书上解释说,尽量用接口代替抽象类,就像这里,书上解释说第一个例子(抽象类)只能用于动物,而第二个例子定义一个可食用接口,用处会更广;而我感觉差不多,因为定义一个可食用抽象类也能实现上述功能,所以完全是胡扯;

 

 

 

多态:

原理:圆类是几何类的子类,圆类对象一定是几何类对象,而反过来不一定,这就形成了子类实例包含了父类实例(指的不是vn图那样的包含而是普通意义上A一定是B,A的范围比B大),所以能使用父类对象的地方,都可以用子类对象代替。(这个创建的父类对象只能调用子类中重写父类的那些方法,非重写方法看下面的向下转型)    父类中的静态方法只能通过类名.方法名(或者对象.方法名 不常用)在子类中调用,不能通过重写来使用父类的静态方法,因为这样会导致父类的静态方法被覆盖;

 

如下Object o=new GeometricObject()就是多态;

抽象类初学以及和接口的关联 多态 instanceof运算符d

这个例子有个问题,GeometricObjective中也有toString()方法,那么这个o.toString()方法到底是调用的父类的还是子类的呢?这里涉及到动态绑定,动态绑定规定从GeometricObjective类往上到Object类,在哪个类找到的就调用相应类中这个方法的逻辑;如下所示:

抽象类初学以及和接口的关联 多态 instanceof运算符d

 

 

其实多态就是为了实现“一个接口,多种实现”的理念;如下:

   抽象类初学以及和接口的关联 多态 instanceof运算符d

 

上例通俗地讲:如果你看到A,B,C类有些共同动作,但是太懒不想一一写一遍怎么办,这时定义一个父类D,使这些类都继承于它;在D类写下这些动作,并让这些子类重写这些动作;D这时候就很舒服了呀,谁都可以暧昧,

想让A做这些动作中专属A的逻辑(如叫声“汪汪汪”),就可以D d=new A();  d.方法名()即可;    

想让B做这些动作中专属B的逻辑(如叫声“喵喵喵”),就可以D d=new B(); d.方法名()即可  等等

 

 

 

再了解两个概念:向上转型和向下转型

向上转型:很简单,就是获得了子类的对象,然后就可以利用这个对象对父类中所有的(公共)方法进行调用,这也是常用的;那问题来了,怎么用父类的对象获得子类的方法(此处的方法指的是非重写方法,因为重写的可以通过多态实现),这时候涉及到向下转型;

 

向下转型:结合向上转型概念和下例看;

抽象类初学以及和接口的关联 多态 instanceof运算符d

这个例子还用到了instanceof运算符,判断myObject是不是Circle类对象范围内,很显然,这上面已经说明过了;

Circle继承了Object,但是getDiameter()只有Circle类中才有,那一个Object父类怎么才能调用这个非重写方法呢,这时可以采用  (子类名)父类对象名.子类中要调用的方法,这就是向下转型的方法,来调用子类的方法;

 

最后看个例子:

抽象类初学以及和接口的关联 多态 instanceof运算符d           

蓝色箭头判断传入的对象是否为 Circle***类对象的范围内,是的话就下走,接下去就对这个父类进行向下转型;

抽象类初学以及和接口的关联 多态 instanceof运算符d

 

 

接口:

几乎和抽象类同样的存在,只是继承时用interface;

一个类只能继承一个父类,但能继承多个接口;

一个接口也能继承其它接口(不是类),这样的接口称作子接口,实现这样的子接口的类,一定要把这个子接口以及其父接口中的所有方法实现(因为接口中的方法全是公共抽象实例方法);

 

抽象类初学以及和接口的关联 多态 instanceof运算符d