黑马程序员---java面向抽象/接口编程

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

面向抽象编程:指的是设计某些重要的类时,不让该类面向具体的类,而是面向抽象类。即设计中重要的数据是抽象类声明的对象,而不是具体类声明的对象。

重点:

1.abstract类的使用:abstract类只关心操作,不关心这些操作具体的实现细节。

2.多态:使用多态进行程序设计,核心技术之一是使用上转型对象。abstract类声明的对象作为其子类的上转型对象,用这个上转型对象就可以调用子类重写的方法。


面向接口编程:与面向对象编程很像,只不过把抽象类换成了接口。

抽象类与接口的异同:

同:都可以有抽象方法。

异:接口中只能有常量,接口中只能有abstract方法。而抽象类不同,可以有变量,可以有具体的方法。

重点:

1.接口的使用:如果子类除了要实现特定的方法,还要继承一些成员,那么就用抽象类,如果是单纯的需要实现某个方法,那么就可以考虑使用接口。

2.接口回调:实则是和抽象类的转型对象用法一样,不赘述了。


举例:

这里有一个圆类,内含求面积的方法

public class Circle{
	double r;
	Circle(double r){
		this.r =r;
	}
	public double getArea(){
		return (3.14*r*r);
	}
}
有一个柱体类,用来求圆柱的体积
class Pillar{
	Circle bottom;
	double height;
	Pillar(Circle bottom,double height){
		this.botton = bottom;
		this.height = height;
	}
	public double getVolume(){
		return bottom.getArea()*height;
	}
}

我们发现,这个程序用来求圆柱的体积是没有任何问题的,但是以后我们想扩展,将其用来求长方体的体积,或者用来求地面是其他图形的柱体,就不得不改写程序。

这时,我们可以用面向抽象或者面向接口编程。

新建一个抽象类或者接口:

abstract class Geometry{
	public abstract double getArea();
}

interface Geometry{
	public abstract double getArea();
}

这个问题无论使用abstract类还是接口都是适用的。

然后我们稍稍改写Pillar类

class Pillar{
	Geometry bottom;
	double height;
	Pillar(Geometry bottom,double height){
		this.botton = bottom;
		this.height = height;
	}
	public double getVolume(){
		return bottom.getArea()*height;
	}
}
然后只需要继承Geometry类或者实现Geometry接口,然后将对象传进Pillar类中即可。无论是上转型对象的使用还是接口回调,在这里都是一样的。


开闭原则:对扩展开放,对修改关闭。

上述例子中,我们让Geometry类可以被继承,其可以用无数个子类,这就是对扩展开放。

但是Pillar类是核心,不应该再被修改,所以应该对修改关闭。





你可能感兴趣的:(黑马程序员---java面向抽象/接口编程)