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

作者:Dragon_Stu 时间:2023-10-02 14:30:13 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/loongkingwhat/article/details/84141711

标签:Java,抽象类,抽象方法
0
投稿

猜你喜欢

  • SpringBoot集成EasyExcel的应用场景分析

    2023-01-09 07:47:45
  • Java操作MongoDB模糊查询和分页查询

    2023-03-12 20:31:22
  • Java常见的阻塞队列总结

    2022-10-03 10:12:06
  • JAVA IDEA 打开assert 设置方式

    2022-08-19 13:48:49
  • IDEA 2020.3.X 创建scala环境的详细教程

    2022-07-16 11:44:47
  • Java中的Object类详细介绍

    2023-11-23 23:18:46
  • Java实现二叉堆、大顶堆和小顶堆

    2022-08-20 18:39:33
  • Spring Cloud Config RSA简介及使用RSA加密配置文件的方法

    2023-11-28 22:39:26
  • MyBatis环境资源配置实现代码详解

    2023-08-05 08:59:02
  • 基于Flutter制作一个心碎动画特效

    2023-05-27 06:07:47
  • c#使用filesystemwatcher实时监控文件目录的添加和删除

    2021-12-04 18:01:57
  • Android实现excel/pdf/word/odt/图片相互转换

    2021-12-05 23:08:16
  • Springboot项目中使用redis的配置详解

    2021-11-26 03:43:44
  • java搭建ftp/sftp进行数据传递的全过程

    2023-11-29 15:08:10
  • java静态工具类注入service出现NullPointerException异常处理

    2021-11-28 09:59:11
  • Android 调用设备已有的相机应用详情

    2022-12-20 01:07:21
  • java 对象参数去空格方式代码实例

    2023-11-27 09:49:34
  • mybatis-plus生成mapper扩展文件的方法

    2023-08-10 07:29:05
  • Java数组传递及可变参数操作实例详解

    2023-08-26 21:21:59
  • AccessibilityService实现微信发红包功能

    2023-06-23 03:51:53
  • asp之家 软件编程 m.aspxhome.com