黑马程序员技术交流社区

标题: 第二贴之抽象类 [打印本页]

作者: 刘胜寒    时间: 2013-4-26 11:33
标题: 第二贴之抽象类
本帖最后由 刘胜寒 于 2013-4-26 15:21 编辑

关键字 : abstract   抽象的   只能用于修饰类和方法
类中有被abstract修饰的方法,这个类一定是个抽象类
被abstract修饰的类,不一定有被abstract修饰的方法
代码如下
  1. abstract class A
  2. {
  3.         public void show()
  4.         {
  5.                 System.out.println("Hello 报文");
  6.         }
  7. }
  8. class B extends A
  9. {
  10. }
  11. class Main
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 new B().show();
  16.         }
  17. }
复制代码
abstract修饰的类只支持单继承,不能被创建
abstract修饰的方法无意义,也不能被调用,如果调用首先实例化,不能实例化怎么被调用。
具体格式:
abstract class  Xxx(类名);
abstract  Xxx(返回值类型)  SSS(方法名)  ( Ttt t, Yyy y, ... );  ( Ttt t 和 Yyy y 为参数列表  )
abstract 不能和final一起使用用来修饰类和方法,被final修饰的类被继承,方法不能被复写。
抽象类只允许创建子类,他的抽象方法才能被实现,只有其具体非抽象子类才能被实例化。
当然abstract不能和private用来修饰方法,被private修饰方法是对子类透明的。
子类无法去复写父类被privat修饰的抽象方法,这个错误会在编译时期提示。
抽象类没有抽象的构造方法,也没有抽象的静态方法
  1. abstract class A
  2. {
  3.         abstract A();//编译出错
  4.         static abstract void method();//编译出错
  5.         static void show()// 这个方法可以直接一A.show();的方式被调用
  6.        {
  7.              System.out.println("Hello 报文");
  8.        }

  9. }
复制代码
抽象类中可以有非抽象的构造方法,创建子类的实例可能会调用这些构造方法;
子类被创建一定会先调用父类的构造函数。多态
抽象类不能被实例化,然后可以创建一个引用变量,其类型是一个抽象类,并让他引用非抽象的的一个子类实例
  1. abstract class A
  2. {
  3. }
  4. class Main extends A
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 //A  A1 = new A();  //编译出错
  9.                 A  A1 = new Main();  //合法   父类指向子类引用多态的内容
  10.         }
  11. }
复制代码
如果一个类继承了一个抽象类,必须要全部复写抽象类的全部抽象方法之后,这个类才能被实例化。
原因很简单:子类会继承父类的所有方法除了被pirvate修饰的非抽象方法。如果某些父类的抽象方法在子类中没有被复写,
那么这个方法依然是一个抽象的方法, “类中有被abstract修饰的方法,这个类一定是个抽象类”,所以子类还是抽象类

见论坛上有些人问为什么接口支持多继承而抽象类只能单继承。
假如抽象A和抽象类B中有一个同名的非抽象方法run()。类C同时去继承A和B,而且类C并没有复写run()方法。我弱弱的问一句,调用C中的方法去执行A中的run()方法还是B中的。
即使类C去复写run()方法,假设类C中有个函数去调用父类的run()方法,也就是super.run(),是去执行A中的run()方法还是B中的。
如果都是接口的话,因为接口中的方法全部都是抽象的,无论去调用A或者B的最后都是调用本身复写的那个方法。
因为抽象方法被调用无意义。
很多人都疑惑何时使用抽象类何时使用接口
模版设计方法建议使用抽象类。否则其他的使用接口,因为接口比较灵活可以进行组合使用
模版设计就是处理某一类问题有一个固定的工序或者流程,只对对不同的问题具体实现方式不同。
如同工厂里面的流水线一样。生产汽车的和成产手机的。
都是从原料-->加工-->组装-->检测是否合格-->装箱-->贴标签-->拿去换钱。
这一点体现抽象类的继承。
就这么多了....
接口的看看其他人做的任务吧 ....

好吧..我承认我的那个文字编排能力不强.....
不能满足你们的各种需求{:soso_e151:}
作者: 曹睿翔    时间: 2013-4-26 14:48
竟然没人顶寒寒!!
那个啥,**不*。
把下边的那些话,整理下,字体加粗什么的
抽象这块总结确实不容易出彩,你不想让大家见识见识你的厉害?
作者: 刘胜寒    时间: 2013-4-26 15:09
曹睿翔 发表于 2013-4-26 14:48
竟然没人顶寒寒!!
那个啥,**不*。
把下边的那些话,整理下,字体加粗什么的

给我点金币啊....
100 就够了
作者: 刘胜寒    时间: 2013-4-26 15:16
曹睿翔 发表于 2013-4-26 14:48
竟然没人顶寒寒!!
那个啥,**不*。
把下边的那些话,整理下,字体加粗什么的

菜鸟一个...
马粮兑换不了啊...
密码没错啊..
坑啊
作者: 刘胜寒    时间: 2013-4-26 15:16
曹睿翔 发表于 2013-4-26 14:48
竟然没人顶寒寒!!
那个啥,**不*。
把下边的那些话,整理下,字体加粗什么的

菜鸟一个...
马粮兑换不了啊...
密码没错啊..
坑啊
作者: 曹睿翔    时间: 2013-4-26 15:25
刘胜寒 发表于 2013-4-26 15:16
菜鸟一个...
马粮兑换不了啊...
密码没错啊..

滔哥说100一枚
作者: 曹睿翔    时间: 2013-4-26 15:28
刘胜寒 发表于 2013-4-26 15:16
菜鸟一个...
马粮兑换不了啊...
密码没错啊..

这个,我没玩过,我金币更不够,问玉圣,他马良多
作者: 刘胜寒    时间: 2013-4-26 15:35
曹睿翔 发表于 2013-4-26 15:28
这个,我没玩过,我金币更不够,问玉圣,他马良多

100   我勒个擦..
我的那个把QQ绑定去掉就好了
我出了70马粮...
谢谢你的120金币
谢谢...





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2