抽象类 Dear 丶 2021-09-22 22:56 329阅读 0赞 ## 基本概念 ## -------------------- 所有的对象都是通过类来描述的,但并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称之为抽象类。比如new Animal(),我们都知道它是在产生一个Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。 抽象方法,是指没有方法体的方法,同时抽象方法还必须用abstract修饰。 拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。 在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。 ## 定义 ## -------------------- abstract class K{ //定义一个抽象类,用abstract关键字声明 public void fun(){ //普通方法,存在方法体 } public abstract void print(); //抽象方法,没有方法体,用abstract修饰 } ## 抽象类使用原则和方法 ## -------------------- 1. 抽象方法必须声明为public或者protected(因为如果是 private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。 2. **抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理**。 3. 抽象类必须有子类,子类使用extends继承抽象类,一个子类只能继承一个抽象类; 4. 子类如果不是抽象类,则必须覆写抽象类之中的全部抽象方法;如果子类没有去实现父类的任何一个抽象方法,或是只实现了父类的一部分抽象方法,则必须将子类也定义为abstract类。 5. 子类中可以定义新的,不与父类的抽象方法同名的,抽象方法。(因为子类此时也是一个抽象类) 6. **只要类中包含抽象方法,该类就必须定义为抽象类,不管是否还包含有其他方法。** 7. **抽象类中可以包含具体的数据和方法,也可以不包含抽象方法。** > 由于抽象类里会存在一些属性,所以**抽象类中一定存在构造方法**,其存在目的是为了属性的初始化。并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。 8. **abstract不能与final并列修饰同一个类。** 9. static可以修饰内部抽象类。外部抽象类不允许使用static声明。使用static声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示该内部类的名称。 > abstract class T1\{ > **static abstract class T2\{ //static定义的内部类是属于外部类的 > public abstract void print(); > \}** > \} > class T3 **extends T1.T2**\{ > public void print()\{ > System.out.println(“static修饰内部类”); > \} > \} > public class K\{ > public static void main(String\[\] args) \{ > **T1.T2** t = new T3(); //向上转型 > t.print(); > \} > \} > Output:static修饰内部类 10. **abstract 不能与private、static、final、native并列修饰同一个方法。** 11. **普通类可以继承抽象类,抽象类可以继承普通类,要注意子父类构造器调用问题**。 12. 任何时候,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样。 **抽象类名.static方法** 13. 有时抽象类中只需要一个特定的系统子类操作,所以可以使用内部抽象类子类。这样的设计在系统类库中会比较常见,目的是对用户隐藏不需要知道的子类。 > abstract class T1\{ > public abstract void print(); > private static class T2 extends T1\{ //内部抽象类子类 > public void print() \{ > System.out.println(“内部抽象类子类”); > \} > \} > public static T1 getInstance()\{ //类方法 > return new T2(); > \} > \} > public class K\{ > public static void main(String\[\] args) \{ > T1 t = T1.getInstance(); //此时取得T2的对象的时候完全不需要知道T2这个子类的存在 > t.print(); > \} > \} ## 例子 ## -------------------- ###### 例1 ###### public class Test extends T{ public final Integer print() { return 45; } public static void main(String[] args) { Test t = new Test(); System.out.println(t.print()); System.out.println(t.print().getClass().getName()); } } abstract class T{ public abstract Number print(); } Output: 45 java.lang.Integer ## 在设计模式中的应用 ## -------------------- 模板设计模式。
相关 抽象类 抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类使用abstract关键字来声明。 格式为: abstract class AbstractName\{ 末蓝、/ 2022年08月22日 00:03/ 0 赞/ 160 阅读
相关 抽象类 抽象方法是只声明而未实现的方法,所有的抽象方法必须用abstract修饰,包含抽象方法的类必须也用abstract修饰。 有抽象方法的类一定是抽象类,抽象类不一定有 快来打我*/ 2022年06月08日 07:40/ 0 赞/ 136 阅读
相关 抽象类 1.纯虚函数 在基类中仅仅给出声明,不对虚函数实现定义,而是在派生类中实现。这个虚函数称为纯虚函数。普通函数如果仅仅给出它的声明而没有实现它的函数体,这是编译不过的。纯虚 £神魔★判官ぃ/ 2022年06月08日 00:49/ 0 赞/ 158 阅读
相关 抽象类 抽象类 1、抽象类的概念: 包含一个抽象的方法的类就是抽象类 2、抽象方法: 声明而未被实现的方法,抽象方法必须使用abstract关键字声明。 曾经终败给现在/ 2022年06月07日 03:17/ 0 赞/ 164 阅读
相关 抽象类 1、什么是抽象类? 带有抽象方法但没有方法体、并且在类名前添加abstract关键字的类是抽象类。 2、为什么用抽象类、什么时候用抽象类? 设计一个类作为一些类的 Love The Way You Lie/ 2022年05月05日 09:40/ 0 赞/ 243 阅读
相关 抽象类 类的设计应该保证父类和子类能够共享特征。有时将一个父类设计的非常抽象,以至于它没有 具体的实例,这样的就可以声明为抽象类。 用abstract关键字修饰一个类,这 短命女/ 2022年03月26日 05:12/ 0 赞/ 173 阅读
相关 抽象类 抽象类 抽象类的引入 抽象类的引入 空实现: 就是给出了代码块,但是没有实现 注意: 空实现也是实现了 抽象方法的实现没有意义,但是存在有意义? 存在有 客官°小女子只卖身不卖艺/ 2022年03月25日 12:20/ 0 赞/ 223 阅读
相关 抽象类 1. abstract定义抽象类和抽象方法 抽象类不能被实例化,即无法使用new来调用抽象类构造器创建抽象类实例。但是抽象类有构造器,主要是给其子类调用的 约定不等于承诺〃/ 2022年02月19日 10:41/ 0 赞/ 199 阅读
相关 抽象类 基本概念 -------------------- 所有的对象都是通过类来描述的,但并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需 Dear 丶/ 2021年09月22日 22:56/ 0 赞/ 330 阅读
相关 抽象类 Abstract(抽象)可以修饰类、方法 进行先上抽取,只能抽取功能定义,而不抽取功能主体,具体的实现由子类覆盖完成。 抽象相当于一些概念性的东西,而子类相当于功能性的实现 r囧r小猫/ 2021年09月10日 23:14/ 0 赞/ 306 阅读
还没有评论,来说两句吧...