java 抽象性_Java 面向对象(十三):面向对象特征之四:抽象性

一、抽象

1、抽象类

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。

我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类。

2、定义

抽象方法:没有方法体的方法

抽象类:包含抽象方法的类。

二、abstract 关键字

1、抽象类

用abstract关键字来修饰一个类, 这个类叫做抽象类。

如果一个类包含抽象方法,那么该类必须是抽象类。

定义格式:

abstract class 类名字 {

// 方法体

}

抽象类:

(1)抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。

(2)若没有重写全部的抽象方法,仍为抽象类。

2、抽象方法

用abstract来修饰一个方法, 该方法叫做抽象方法,只有方法的声明,没有方法的实现。

使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。

定义格式:

修饰符 abstract 返回值类型 方法名 (参数列表);

3、abstract 注意事项

(1) 不能用 abstract 修饰变量、代码块、构造器;

(2)不能用 abstract 修饰私有方法、静态方法、final 的方法、final 的类;

三、抽象类

(1)抽象类不能创建对象(实例化),如果创建,编译无法通过而报错,只能创建其非抽象子类的对象;

(2)抽象类中,可以有构造方法,是供子类创建对象(实例化)时,初始化父类成员使用的;

(3)抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。(不包含抽象方法但声明为抽象类,是为了不能创建该类的对象);

(4)抽象类的子类,必须重写抽象类中所有的抽象方法,否则,编译无法通过而报错,除非该子类也是抽象类。

四、抽象方法

(1)抽象方法只有方法的声明,没有方法体;

(2)包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。

(3)若子类重写了父类中的所有的抽象方法后,此子类方可实例化;

(4)若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰;

五、抽象的应用

1、抽象类和抽象方法的应用

继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。

最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。

Demo:

1 public abstract classAnimal {2 public voidrun();3 }4 public class Cat extendsAnimal {5   public voidrun (){6     System.out.println("小猫在墙头走~~~");7 }8 }9 public classCatTest {10   public static voidmain(String[] args) {11     //创建子类对象

12     Cat c = newCat();13     //调用run方法

14 c.run();15 }16 }17 输出结果:18 小猫在墙头走~~~

注意:此时的方法重写,是子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做实现方法。

2、抽象类的匿名子类

1 public classPersonTest {2

3 public static voidmain(String[] args) {4

5 method(new Student());//匿名对象

6

7 Worker worker = newWorker();8 method1(worker);//非匿名的类非匿名的对象

9

10 method1(new Worker());//非匿名的类匿名的对象

11

12 System.out.println("********************");13

14 //创建了一匿名子类的对象:p

15 Person p = newPerson(){16

17 @Override18 public voideat() {19 System.out.println("吃东西");20 }21

22 @Override23 public voidbreath() {24 System.out.println("好好呼吸");25 }26

27 };28

29 method1(p);30 System.out.println("********************");31 //创建匿名子类的匿名对象

32 method1(newPerson(){33 @Override34 public voideat() {35 System.out.println("吃好吃东西");36 }37

38 @Override39 public voidbreath() {40 System.out.println("好好呼吸新鲜空气");41 }42 });43 }44

45

46 public static voidmethod1(Person p){47 p.eat();48 p.breath();49 }50

51 public static voidmethod(Student s){52

53 }54 }55

56 class Worker extendsPerson{57

58 @Override59 public voideat() {60 }61

62 @Override63 public voidbreath() {64 }65

66 }

3、抽象类应用

抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。

cc816a35a56b2d2ce1e68651e2cc21b8.png

六、扩展:不能和 abstract 一起使用的修饰符

1、final:和 final 不能一起修饰方法和类

2、static:和 static 不能一起修饰方法

3、native:和 native 不能一起修饰方法

4、private:和 private 不能一起修饰方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值