Java抽象类和抽象方法定义与用法实例详解

 更新时间:2019年11月08日 11:05:08   作者:Dragon_Stu  
这篇文章主要介绍了Java抽象类和抽象方法定义与用法,结合实例形式详细分析了Java抽象类和抽象方法相关原理、定义、使用方法及操作注意事项,需要的朋友可以参考下

本文实例讲述了Java抽象类和抽象方法定义与用法。分享给大家供大家参考,具体如下:

一、Java抽象类

参考资料:Java抽象类 详解

1、抽象类的说明

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

在Java语言中使用abstract class来定义抽象类

抽象类是为了把相同的但不确定的东西的提取出来,为了以后的重用。定义成抽象类的目的,就是为了在子类中实现抽象类。

2、抽象类的定义

abstract class A{//定义一个抽象类
  public void fun(){//普通方法
    System.out.println("存在方法体的方法");
  }
  //不存在方法体的抽象方法
  public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}

3、抽象类的使用

抽象类的使用原则如下:

(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
(2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
(3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
(4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);

package com.wz.abstractdemo;
abstract class A{//定义一个抽象类
  public void fun(){//普通方法
    System.out.println("存在方法体的方法");
  }
  public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{//B类是抽象类的子类,是一个普通类
  @Override
  public void print() {//强制要求覆写
    System.out.println("Hello World !");
  }
}
public class TestDemo {
  public static void main(String[] args) {
    A a = new B();//向上转型
    a.fun();//被子类所覆写的过的方法
  }
}

(1)抽象类的子类里面有明确的方法覆写要求,而普通类可以有选择性的来决定是否需要覆写;
(2)抽象类实际上就比普通类多了一些抽象方法而已,其他组成部分和普通类完全一样;
(3)普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。

虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类。

4、抽象类的使用限制

(1)抽象类中有构造方法么?

由于抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。

并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。

范例如下:

package com.wz.abstractdemo;
abstract class A{//定义一个抽象类
  public A(){
    System.out.println("*****A类构造方法*****");
  }
  public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{//B类是抽象类的子类,是一个普通类
  public B(){
    System.out.println("*****B类构造方法*****");
  }
  @Override
  public void print() {//强制要求覆写
    System.out.println("Hello World !");
  }
}
public class TestDemo {
  public static void main(String[] args) {
    A a = new B();//向上转型
  }
}

执行结果:

*****A类构造方法*****
*****B类构造方法*****

(2)抽象类可以用final声明么?

不能,因为抽象类必须有子类,而final定义的类不能有子类;

二、Java抽象方法

参考资料:JAVA抽象类和抽象方法

用abstract修饰的方法,即抽象方法。并且,抽象方法不能有方法主体。格式如下:

abstract void xxx();

说明:

  1. 一旦类中包含了abstract抽象方法,那类该类必须声明为abstract类。
  2. 抽象类中不一定要包含abstrace方法。
  3. 抽象类不能被实例化。因为抽象类中方法未具体化,这是一种不完整的类,所以直接实例化也就没有意义了。
  4. 任何子类必须重写父类的抽象方法,或者声明自身为抽象类

范例:bstract关键字可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。

public abstract class Employee
{
  private String name;
  private String address;
  private int number;
  public abstract double computePay();
  //其余代码
}

如果Salary类继承了上面的Employee抽象类,那么它必须实现computePay()方法:

/* 文件名 : Salary.java */
public class Salary extends Employee
{
  private double salary; // Annual salary
  public double computePay()
  {
   System.out.println("Computing salary pay for " + getName());
   return salary/52;
  }
  //其余代码
}

【抽象类总结规定】

  1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  4. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java入门绊脚石之Override和Overload的区别详解

    Java入门绊脚石之Override和Overload的区别详解

    重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同
    2021-10-10
  • java中1+1d/5和1+1/5的区别说明

    java中1+1d/5和1+1/5的区别说明

    这篇文章主要介绍了java中1+1d/5和1+1/5的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java 超基础讲解String的使用

    Java 超基础讲解String的使用

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,让我们一起来了解它
    2022-04-04
  • Maven默认使用JDK1.5的问题及解决方案

    Maven默认使用JDK1.5的问题及解决方案

    这篇文章主要介绍了Maven默认使用JDK1.5的问题及解决方案,本文给大家分享两种方式,通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Java使用云片API发送短信验证码

    Java使用云片API发送短信验证码

    这篇文章主要介绍了Java使用云片API发送短信验证码,主要用的是Java实现短信验证码。需要的朋友可以参考下
    2017-02-02
  • Mybatis Example的高级用法详解

    Mybatis Example的高级用法详解

    这篇文章主要介绍了Mybatis Example的高级用法详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java通过注解翻译字典的实现示例

    java通过注解翻译字典的实现示例

    本文主要介绍了java通过注解翻译字典的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java 8中Collectors.toMap空指针异常源码解析

    Java 8中Collectors.toMap空指针异常源码解析

    这篇文章主要为大家介绍了Java 8中Collectors.toMap空指针异常源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java的RocketMq水平扩展及负载均衡详解

    Java的RocketMq水平扩展及负载均衡详解

    这篇文章主要介绍了Java的RocketMq水平扩展及负载均衡详解,RocketMQ是一个分布式具有高度可扩展性的消息中间件,本文旨在探索在broker端,生产端,以及消费端是如何做到横向扩展以及负载均衡的,需要的朋友可以参考下
    2024-01-01
  • Java AbstractMethodError案例分析详解

    Java AbstractMethodError案例分析详解

    这篇文章主要介绍了Java AbstractMethodError案例分析详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论