前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础知识:抽象类与接口类的异同

Java基础知识:抽象类与接口类的异同

作者头像
DioxideCN
发布2022-08-05 19:44:34
2440
发布2022-08-05 19:44:34
举报

抽象类与接口类的异同

诞生过程

继承的诞生:

抽象的诞生:

父类没必要完全实现所有逻辑,也没必要创建一个父类时。 就只是单纯的想让各种各样的子类来完成不同的逻辑,则诞生了抽象类。 将父类的方法抽象出来,让子类继承父类后,重写父类中的方法。这里的抽象类就拥有了 “标准” 与 “规范” 的意思。

  1. 抽象类就好比一类规范的制定方;
  2. 而抽象类的子类就好比这一规范的实现方;
  • 但是抽象类不完全抽象,因为它除了抽象方法外,还有成员属性。
  • 且有时候就是只想制定一个纯粹的标准,让子类去实现抽象方法,不想让子类再继承别的东西,这时候 “接口类” 诞生了。

接口的诞生

接口 只有成员方法 ,没有成员属性 ,子类继承接口后唯一能做的就是重写方法;

代码语言:javascript
复制
public interface Runnable {
	public abstract void run();
}

所以说,接口就是一种模板一种规范。接口规定好方法模板后,子类都必须按照该模板来实现方法。 所以接口就是定义接口,供子类实现的同时供调用方调用。

代码语言:javascript
复制
public static void printCollection(Collection collection) {
	if(collection == null) {
		return;
	}
	System.out.println("数据数量:" + collection.size())
}
public static void main(String[] args) {
	printCollection(new ArrayList());
	printCollection(new HashSet());
}

这里将方法 printCollection() 的参数定义成 Collection 接口类,调用方就可传入任何一个 Collection 的子类(如:ArrayList、HashSet)进来。

抽象与接口的异同

  1. 都可以定义抽象方法;
代码语言:javascript
复制
//抽象类
public abstract class Animal {
	public abstract void eat();
}
//接口类
public interface class Runnable {
	public abstract void run();
}
  1. 都不能创建本类对象,都需要通过子类进行实例化;

  1. 子类扩展继承时的方法不同;
代码语言:javascript
复制
//继承抽象
public class Dog extends Animal {}
//实现接口
public class Thread implements Runnable {}
  1. 抽象类可以实现接口,接口只能继承接口;
代码语言:javascript
复制
public abstract class Animal implements A {}
public interface Runnable extends A, B, C {}
  1. 一个类最多只能继承一个父类但是能实现多个接口;
代码语言:javascript
复制
public abstract class Pet extends Animal implements A, B, C {}

因而使用接口类来实现子类的灵活度更高。

  1. 接口只能定义 final 类型的静态常量(不能定义静态变量),抽象类可以定义成员属性;
代码语言:javascript
复制
public abstract class Animal {
	protected String name;
	public abstract void eat();
}
public interface class Runnable {
	public static final name = "Dioxide.CN";
	public abstract void run();
}
  1. 接口类没有构造器,抽象类有构造器。抽象类的构造器作用为:限定子类的构造行为;
代码语言:javascript
复制
public abstract class Animal {
	protected String name;

	protected Animal(String name) {
		this.name = name;
	}

	public abstract void eat();
}

class Dog extends Animal {
	//约束构造行为
	public Dog(String name) {
		super(name);
	}
	@Override
	public void eat() {
		System.out.println("开饭了");
	}
}
  1. 从 Java8 开始,接口类可以使用 default 关键字来定义方法、也可以使用 static 关键字来定义静态方法;
代码语言:javascript
复制
public interface class Animal {
	void eat();
	//不会强制子类去实现方法
	default void defaultMethod() {
		System.out.println("默认方法");
	}
	//不会强制子类去实现方法
	static void staticMethod() {
		System.out.println("静态方法");
	}
}
  1. 从 Java9 开始,接口类可以使用 private 权限修饰符来定义方法;
代码语言:javascript
复制
public interface class Animal {
	void eat();
	default void defaultMethod() {
		privateMethod();
		privateMethod();
		privateMethod();
	}
	private void privateMethod() {
		System.out.println("私有方法");
	}
}

何时调用

抽象类

接口类

定义

包含抽象方法的类

主要是抽象方法和静态常量的类

组成

构造器抽象方法普通成员方法、成员变量静态方法、静态变量常量

静态常量抽象方法default方法、静态方法(Java8)私有方法(Java9)

使用

子类继承抽象类(extends)

子类实现接口类(implements)

关系

子类只能继承一个接口类抽象类可以实现多个接口类

子类可以实现多个接口接口不能继承类但能继承多个接口类

选择

如果需要继承父类的成员变量,或者需要控制子类的实例化,则选抽象类

优先选择接口,避免单继承的局限

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象类与接口类的异同
    • 诞生过程
      • 继承的诞生:
      • 抽象的诞生:
      • 接口的诞生
    • 抽象与接口的异同
      • 何时调用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档