首页 > 编程语言 >Java 抽象类

Java 抽象类

时间:2023-02-12 18:11:06浏览次数:38  
标签:Java 子类 abstract 实例 抽象 抽象类 方法

目录

当编写一个类时,常常会为该类定义一些方法,用于描述该类的行为方式,这些方法都有具体的方法体。但在某些情况下,某个基类只是知道其子类应该包含那些方法,但不知道子类是如何实现这些方法的。

如何让一个基类只包含方法签名,又无需提供方法的具体实现?

使用抽象方法即可满足该要求:抽象方法是只有方法签名,没有方法实现的方法。

利用抽象类和抽象方法,可以更好的发挥多态的优势,使程序更加灵活。

1、抽象方法和抽象类

抽象方法:使用修饰符 abstract 来修饰的方法(抽象方法不能有方法体)。

public abstract void abstractMethod(); // 注意此时没有方法体 {},直接;结尾
public abstract void abstractMethod(){ } // 直接报错,因为有方法体 {}

抽象类:使用修饰符 abstract 来修饰的类(抽象类里可以没有抽象方法)。

public abstract class AbstractClass { } // 该抽象类里什么都没有

注:

1、含有抽象方法的类只能被定义成抽象类。

2、含有抽象方法的类的三种情况:

  • 直接定义了一个抽象方法。
  • 继承了一个抽象基类,但没有完全实现基类里的抽象方法。
  • 实现了一个接口,但没有完全实现接口里的方法。

3、抽象类不能被实例化:无法使用 new 关键字来调用抽象类的构造器实例化抽象类;即使抽象类里不含抽象方法,这个抽象类也不能实例化。

4、抽象类只能被继承;抽象方法必须由子类提供实现(重写)。

5、final 和 abstract 永远不能同时使用:final 修饰的类不能被继承,final 修饰的方法不能被重写。

6、abstract 不能修饰变量、构造器:即没有抽象变量、抽象构造器。

7、static 和 abstract 不能同时修饰方法,但可以同时修饰内部类

8、private 和 abstract 不能同时修饰方法,但可以同时修饰内部类:abstract 关键字修饰的方法必须被其子类重写才有意义,否则这个方法永远不会有方法体,因此 abstract 方法不能定义为 private 访问权限。

9、抽象类里可以包含的:

  • 成员变量(实例变量、类变量)
  • 方法(抽象方法、实例方法、类方法)
  • 构造器:不能用于创建自己的实例,主要用于被其子类调用,初始化父类成员使用的
  • 代码块(类代码块、实例代码块)
  • 内部类(接口、枚举)
// 抽象类
public abstract class AbstractClass {
    // 实例变量
	private int age;
	// 类变量
	private static String name;
	// 实例代码块
	{}
	// 类代码块
	static {}
	// 抽象方法
	public abstract void abstractMethod();
	// 实例方法
	public void defaultMethod() {}
	// 类方法
	public static void a() {}
	// 构造器
	public AbstractClass() {}
	// 接口
	Comparable anInterface;
	// 枚举
	Enum anEnum;
    // 内部类
	class A{ }
    // 静态内部类
	static class B{}
}

抽象类的得与失:

得:可以包含抽象方法

失:无法创建实例

2、抽象类的作用

抽象类不能创建实例,只能当成父类来被继承。

从语义的角度来看,抽象类是从多个具体类中抽象出来的父类,它是更高层次的抽象。

从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性。

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。

抽象类里提供多个子类的通用方法,并把方法推迟留到子类中来实现,这就是一种模板模式。

标签:Java,子类,abstract,实例,抽象,抽象类,方法
From: https://www.cnblogs.com/sunzhongjie/p/17114375.html

相关文章

  • Java-异常处理
           ......
  • java——spring boot集成RabbitMQ——路由模式——应用场景
    如果多个队列都绑定了同一个交换机,通过路由key,指定消息到哪个消息队列     ......
  • Java程序设计三特性
    Java程序编写具有三大特征:封装、继承和多态;封装对类中的方法和属性进行权限访问控制,只提供特定接口供外部访问,这样一方面增加了代码的规范性另一方面又增加了代码的访......
  • java——spring boot集成RabbitMQ——发布/订阅模式——实现生产者
        首先抽离出来连接,单据一个工具类:                                     ......
  • java面试题(三)
    1、Java中会存在内存泄漏吗,请简单描述。答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发......
  • java面试题(四)
    1、什么时候用断言(assert)?答:断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和......
  • Java方法
    一、什么是方法Java方法是语句的集合,他们在一起执行一个功能方法是解决一类问题的步骤的有序组合包含于类或对象中方法在程序中被创建,在其他地方被引用二、方法的......
  • 5_Java对象
    面向对象编程对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。面......
  • java——spring boot集成RabbitMQ——简单模式示例——实现消费者
    1、引入依赖                                               ......
  • maven的java工程取mysql数据库数据
    maven的java工程取mysql数据库数据maven的java工程取mysql数据库数据创建User实体类: publicclassUser{privateintid;privateStringNAME;@Ov......