一,抽象类和接口
1,抽象类和抽象方法
(1)将多个类共性的内容抽象出来
(2)抽象类只是将内容抽取出来,而而不考虑如何实现
例子:三角形,矩形,圆形 ----> 图形
解释:所以图形就可以是抽象类,图形类内部需要声明周长和面积,但是对于不同的图形,具体是实现就是在各自类中完成了
(3)抽象类关键字 abstract
(4)抽象类语法
abstract class A{}
(5)抽象类的特点
《1》抽象类不能直接实例化对象,不能使用new运算符创建该类对象,只能先创建子
类,再由子类创建对象
《2》抽象类可以声明对象,作为子类对象的上转型对象
//不确定
抽象类的上转型可以理解为:他是对于A的对象的方法的扩充,即A的对象可访问B 从A中继承来和B覆盖A的方法
《3》和普通类型相比,抽象类中可以有抽象方法,也可以没有抽象方法,也就是说普
通类中是不可以有抽象方法的
《4》解释上面的语句 ---- 有抽象方法的类一定是抽象类
(6)对于抽象方法只允许声明,但是不允许实现,也就是说只定义相应的方法头,没有实现内容
例子:abstract double getArea(); //因为没有实现,所以 在()后面直接就是分号而不是{}因为没有方法体
(7)抽象方法是不可以使用static和final修饰的
//static 是类的,也就是不用创建类的对象就可以直接使用,但是在抽象方法中没有体内容,所以没有办法修饰
//final 因为在后续的子类之中是要实现父类中的抽象方法,所以一旦加了这些限制词就会影响后续的实现
(8)抽象超类的所有子类都必须为超类的抽象方法提供具体实现
//不确定
抽象超类:抽象父类
(9)抽象类的子类也可以是抽象类,子类是抽象类时不必实现抽象超类的所有抽象方法
(10)例子
package test
public abstract class Tuxing{
public static final double PI = 3.1415926;
public abstract double getArea();
public abstract double getPerimeter();
}
public class JuXing extends TuXing{
double l,w;
public JuXing{} //在创建下面的那些构造方法时,编译器就不会再自动创建无参构造函数了,所以我们需要自己创建一个无参构造函数
public JuXing (double l, double w){
this.l = l;
this.w = w;
}
public double getArea(){
return l*w;
}
public double getPerimeter(){
return (l+w) * 2;
}
}
public class App(){
public static void main(String[] args){
TuXing g;
g = new JuXing(1,2); //此处相当于上转型
System.out.print("矩形的面积:%.2f 矩形的周长:%.2f",g.Area(),g.getPerimeter()); //此处调用的是子类的,因为实际上在实现的时候是在子类中实现的
}
}
2,面向抽象编程
(1)简单解释抽象类
《1》抽象类可以抽象出重要行为准则,即抽象类封装了子类必有得行为准则
《2》抽象类声明的对象可以成为其之类对象的上转系对象,即体现子类根据抽象类里的行为标准给出的具体行为
《3》开发的人可以把主精力放在一个应用需要哪些行为标准,而不需要关注细节,不仅节省时间,同时更易于创造出易维护,易扩展的程序
《4》抽象类中的抽象方法,可以由子类去实现,从而实现了行为标准和具体实现的分工
(2)面型抽象编程
《1》在设计算法的时候,先声明一个abstract 类,通过在类中声明若干个abstract 方法,表明这些方法在整个系统设计中的重要性,对于方法体的实现就是其非abstrat子类去完成了
《2》再利用多态来实现编程,使用多态进行程序设计的核心技术实际上是利用了方法重写和上转型对象,这个上转型对象可以调用子类重写的方法
《3》所谓面向对象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象
《4》实例:(使用面向对象的思想实现TuXing类,ZhuTi类的封装包括圆柱体,长方体)
abstract class TuXing{ //抽象类中创建了抽象方法和常量
public static final double PI = 3.1415926;
public abstract double getArea();
//abstract double getPerimeter();
}
class JuXing extends TuXing{ //创建JuXing类集成图形类
double w = 0;
double h = 0;
public JuXing(){} //抽象类
public JuXing(int w, int h){
this.w = w;
this.h = h;
}
@Override
public double getArea() {
return w*h;
}
}
class ZhuTi {
TuXing di;
double h;
public ZhuTi(){}
public ZhuTi(TuXing di,double h){
super();
this.di = di;
this.h = h;
}
public TuXing getDi(){
return di;
}
public void setDi(TuXing di){
this.di = di;
}
public double getV(){
return di.getArea() * h;
}
}
public class Test{
public static void main(String[] args) {
ZhuTi zt = new ZhuTi(new JuXing(1,2),3);
System.out.printf("长方体的体积:%.2f%n",zt.getV());
}
}
//柱体类我们可以看到没有使用具体的子类,而是使用了抽象类,从而实现一个底可以表示多种图形
//主题体积求法大体相同,都是底面积乘高,所以只要区分底就行了
3,开闭原则
(1)设计模式
《1》设计模式代表了最佳的实践,是软件开发人员对于一般问题的解决方案,
《2》设计模式描述一个在我们周围不断重复发生的事情,一旦确定了设计方案的核心,我们就可以长时间使用该核心,而不是进行多次重复劳动
(2)模板设计模式
定义一个操作框架,将算法的一些步骤延续到子类,使子类在不改变父类的前提下实现子类的特定功能