java基础之抽象类(abstract)和接口(interface)

news/2024/7/3 12:28:48 标签: java, 抽象类, 多态, 接口, 设计模式

一. 抽象类的特性(语法规则)

  1. 抽象类不能被实例化
    注:为什么抽象类不能被实例化?
    语义上来解释,抽象类表示的从具体类型抽象出来的类型,例如苹果类、香蕉类和橘子类是具体类,而水果类则是抽象类,在自然界中也不存在水果类本身的实例。
  2. 抽象类中可以没有抽象方法
  3. 包含抽象方法的类必须被定义为抽象类,如果子类没有实现父类中所有的抽象方法,子类也必须被定义为抽象类
java">abstract class Base{
	abstract void method1();
	abstract void method2();
	} 
class Sub extends Base{
	void method1(){System.out.println("method1");}
	}  // 编译出错,Sub类必须声明为抽象类
  1. abstract修饰符不能与static修饰符连用修饰方法(abstract只能修饰类,方法;static只能修饰方法,变量,代码块,ps:static可以修饰内部类
    注:为什么abstract修饰符不能与static修饰符连用?
    若一个方法用abstract修饰,则表示为抽象方法,没有方法体,需要被继承的子类实现;若一个方法用static修饰,则表示某个类所特有的功能,这种功能的实现不依赖于类的具体事例,更不依赖于它的子类,当前类必须为静态方法提供实现的机会

二. 接口的特性(语法规则)

  1. 接口中的成员变量,必须是public访问级别,并且是staticfinal类型,必须被显式地初始化
java">public interface StandardIFC{
	public static final int MAX_AGE = 120;
	int MIN_AGE = 1;   // 默认是 public static final 类型。
	private int TOTEL = 2; // 编译错误,接口中不允许出现private访问级别的成员变量
	}
  1. 接口中的成员方法,必须是public或private访问级别。
  2. 一个接口可以继承多个其它接口
  3. 接口必须通过类来实现它的抽象方法
  4. 一个类只能继承一个直接的父类,但能实现多个接口
  5. 不允许创建接口的实例,但可以声明接口类型的变量来引用实现了这个接口的实例。
java">CalculatorIFC cal = new Calculator(); // Calculator类实现了CalculatorIFC接口

这里提一下多态的定义:一个引用类型的变量可以引用声明类型的实例,还可以引用其子类型的实例,这样,这个变量就有多种状态。当调用它的实例方法时,到底是调用父类还是子类的实例方法,取决于这个变量实际上引用的实例。

三. 比较抽象类接口

抽象类接口的相同点:

  1. 都不能被实例化。
  2. 都能包含抽象方法和非抽象方法。

抽象类接口的不同点:

  1. 接口中的成员变量之能事public、static和final类型;而在抽象类中可以定义各种类型各种访问级别的成员变量。(抽象类的优势)
  2. 一个类只能继承一个直接父类;但一个类可以实现多个接口。(接口的优势)
  3. 二者本质上的区别:对于任意2个及以上的类,不管它们是否属于同一个父类,只要存在着相同的功能,就能抽象出一个接口类型。举例:风筝类(Kite)和鸟类(Bird)无法抽象出一个抽象父类,但是存在相同的功能,都能飞,因此可以抽象出一个飞(Flyable)的接口类型。
  4. 继承抽象类的子类主要是做一些扩展功能和实现功能的工作;而继承接口的类只是做实现功能的工作

http://www.niftyadmin.cn/n/1647785.html

相关文章

Python的三种可变参数

初学python没多久,对python中函数的可变参数有点头晕,查阅了stackflow,现总结一下可变参数 可变参数应该最简单,在C/C和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素&…

Linux 下安装 Nginx

Linux 下安装 Nginx 作者:Grey 原文地址: 博客园:Linux 下安装 Nginx CSDN:Linux 下安装 Nginx 版本 Nginx:1.22 下载地址: nginx-1.22.0 操作系统:CentOS-7 或 Debian 10,本文以 CentO…

java高级编程之内部类(全)

1. 内部类与封装,内部类的优势? 内部类的定义:在一个类的内部定义的类成为内部类 提到内部类,就不得不提java三大特性之一的封装特性,关于封装的介绍,可参考此文:封装概念和特点 内部类与封装…

Ubuntu 蓝牙鼠标一段时间失效的问题

问题: 我有一个小巧的蓝牙鼠标,但有一个问题。 当它不使用一段时间时,它会关闭。 好的我得按按钮把它打开。 但是我发现,在我在蓝牙小程序下单击"连接"之前,它不会再被Ubuntu识别出来。 我有一个蓝牙touchpa…

汉诺塔进阶问题

汉诺塔进阶问题 作者:Grey 原文地址: 博客园:汉诺塔进阶问题 CSDN:汉诺塔进阶问题 题目描述 牛客-汉诺塔II 有一个int数组arr其中只含有1、2和3,分别代表所有圆盘目前的状态,1代表左柱,2代…

如何阅读大型项目的代码?(转)

如何阅读大型项目的代码?(转) 本文转载自:http://blog.csdn.net/jk110333/article/details/7563718 Technorati 标签: 源码阅读作者:浩天之家出处:http://www.cnblogs.com/cherishui/本文版权归作者和博客园共有,欢迎转…

马尔科夫过程,马尔科夫奖励过程和马尔科夫决策过程

马尔科夫决策过程是强化学习中的一个基本框架,用来表示agent与环境的交互过程:agent观测得到环境的当前状态之后,采取动作,环境进入下一个状态,agent又得到下一个环境状态的信息,形成一个循环回路。 在理解…

加油站的良好出发点问题

加油站的良好出发点问题 作者:Grey 原文地址: 博客园:加油站的良好出发点问题 CSDN:加油站的良好出发点问题 题目描述 题目链接 思路 暴力解法 O(N^2) 我们可以通过生成辅助数组来验证良好出发点 int[]h这个数组的长度和…