abstract类与abstract方法,abstract是什么意思,Java中abstract怎么使用(二)

发布时间:2016-04-12 16:00:22 来源:大铁棍娱乐网

《abstract类与abstract方法,abstract是什么意思,Java中abstract怎么使用(二)》是由大铁棍娱乐网(www.datiegun.com)编辑为你整理收集在【教育学习】栏目,于2016-04-12 16:00:22整理发布,希望对你有所帮助,可及时向我们反馈。

  abstract 规则:

  1:抽象类可以没有抽象方法,但是有抽象方法的类必须定义为抽象类,如果一个子类继承一个抽象类,子类没有实现父类的所有抽象方法,那么子类也要定义为抽象类,否则的话编译会出错的。

  2:抽象类没有构造方法,也没有抽象静态方法。但是可以有非抽象的构造方法

  3:抽象类不能被实例化,但是可以创建一个引用变量,类型是一个抽象类,并让它引用非抽象类的子类的一个实例

  4:不能用final 修饰符修饰

  Q:java里面有抽象类么?和接口的区别是什么?A:java中有抽象类,用关键字abstract修饰。

  以下是我对这个问题的看法。首先,从语法上讲,抽象类是一个类,根据java的单继承体系。如果它有子类,那么它的子类只能继承它。java允许实现多个接口。所以一个类可以实现多个接口抽象类里面可以定义各种类型和访问权限的变量(就像普通类一样),也可以定义各种访问权限的方法(就像普通类一样)。但是接口不可以。在接口里面定义的方法默认就是public abstract的,变量默认就是public static final的。(不管你有没有加权限控制符,不加,默认就是这些权限;加错了,权限缩小了,那么就会报错)

  其次,从意义上讲,如果继承一个抽象类,那么抽象类和它的子类就有父子关系,即有类的层次关系(这关系到类的设计问题)。接口,在我看来,是一种契约或者协议,是一层提供给另一层的接口(可以想象成OSI各层之间的关系)在某一层中有多个类协作实现这个层的功能,通过接口暴露出去。但这些类之间会有层次关系(is a,has a)

  Q:一个方法加abstract和不加abstract有什么区别?就是说不加有什么关系?加了又会怎样?A:一方法要是加abstract,那么这个方法就是抽象的,须由子类去实现

  抽象方法必须在抽象类当中,也就是说,一个类只要有一个方法是抽象的,那么这个类就必须是抽象类抽象类里面的方法不一定要抽象的,也可以全都不是抽象的抽象类不能实例化!所以可以想到,当你不想让你的类被别人实例化,只想这个类的子类可以实例化,那么只要将这个类声明为abstract的就可以了(和final的情况蛮相近,当你不想让这个类再有子类化,只要在类的声明前面添加final即可)

  不过更多的情况下,我想,还是一个抽象类,他既有部分抽象方法,也有部分具体的方法。具体的方法是已经定义好的,抽象方法需要由子类去实现。(个人感觉和C++的virtual很相近,不过abstract是纯虚的)

  那么为什么要有抽象类呢?我说过这关系到你类的设计问题。(当然还有不想被实例化)譬如经常举的一个例子

  abstract class Shape{ public abstract void draw(); public abstract void reDraw(); }

  class Triangle extends Shape{ public void draw(){...} public void reDraw(){...} } class Circle extends Shape{ public void draw(){...} public void reDraw(){...} }

  当然你可以这样设计

  class Shape{ public void draw(){} public void reDraw(){} }这样设计有2个不妥之处:1.不符合逻辑。Shape是你针对具体的事物(Triangle,Circle)抽象出来的。它定义的方法应该到子类中去实现2.在设计的时候就应该认识到,实例化Shape是没有意义的,因为Shape本身只是一种抽象。现在别人如果拿来就可以实例化了,这样的操作方式违背了当初设计的意愿。而且会存在潜在的危险。(当前的实现可能看不出危险)

  那么,如果把Shape定义成Interface呢?当然可以

推荐阅读