Java抽象类(Abstract Class)与接口(Interface)区别

抽象类与接口比较

抽象类跟接口类似,都不能实例化,可能包含不需实现方法或已实现的方法。

抽象类可以定义一些不是静态或常量的字段,定义 public, protected, private访问级别的具体方法。

接口的所有字段自动是public、静态、常量,所有定义的方法的访问级别都是public。

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

抽象类使用场景

1、你想在几个密切相关的类共享代码。

2、你想让继承你抽象类的类有一些共用的字段或方法,或想设置protected, private的访问级别。

3、你想声明非静态或非常量的字段。这样可以定义访问或修改字段状态的方法。

接口使用场景

1、你想要不相关的类实现你的接口。

2、只想声明特定数据类型的行为,不关注实现的情况。

3、实现多继承效果。

例子

An example of an abstract class in the JDK is AbstractMap, which is part of the Collections Framework. Its subclasses (which include HashMap, TreeMap, and ConcurrentHashMap) share many methods (including get, put, isEmpty, containsKey, and containsValue) that AbstractMap defines.

An example of a class in the JDK that implements several interfaces is HashMap, which implements the interfaces Serializable, Cloneable, and Map<K, V>. By reading this list of interfaces, you can infer that an instance of HashMap (regardless of the developer or company who implemented the class) can be cloned, is serializable (which means that it can be converted into a byte stream; see the sectionSerializable Objects), and has the functionality of a map. In addition, the Map<K, V> interface has been enhanced with many default methods such as merge and forEach that older classes that have implemented this interface do not have to define.

Note that many software libraries use both abstract classes and interfaces; the HashMap class implements several interfaces and also extends the abstract class AbstractMap.

接口能不能有实现的方法?

Java8允许接口有默认方法和静态方法,只不过调用方式不一样,如下。

public interface RdNum {
    void play();

    static int getANum(){
        return 123;
    }

    default String getAStirng(String str){
        return str + "嘤嘤嘤";
    }
}

public class R implements Interface {
    ......
}

public class Test {
    public static void main(String[] args){
        R r = new R();
        System.out.println(r.getAStirng("哈哈哈"));
        System.out.println(RdNum.getANum());
    }
}

参考文献

https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

原文地址:https://www.cnblogs.com/lovesong/p/8886206.html

时间: 2024-10-06 23:05:32

Java抽象类(Abstract Class)与接口(Interface)区别的相关文章

Java简明教程 09. 抽象类(abstract class)和接口(interface)

抽象类(abstract class) 描述抽象的事物,  比如人类(human), 就是一个抽象类. 对于人类这个抽象类, 具体的就是某一个人, 比如张三(男)啊, 小红(女)啊,虽然说人都会eat, 可是男人和女人的eat似乎又是不一样的.男人一般都是大口大口的吃, 而女人比较慢条斯理. AbstractDemo.java 1 abstract class Human { //抽象类, 特点: 1. 前面有abstract修饰 2 // 2. 无法直接生成一个对象,需要子类去继承这个类, 并

JAVA的abstract修饰符 &amp;&amp; 接口interface用法 &amp;&amp; 抽象类和interface的差别

abstract修饰符可以修饰类和方法. (1)abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型(见后面实例),也就是编译时类型.抽象类就相当于一类的半成品,需要子类继承并覆盖其中的抽象方法. (2)abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明而没有实现,需要子类继承实现. (3)注意的地方: A:有抽象方法的类一定是抽象类.但是抽象类中不一定都是抽象方法,也可以全是具体方法.abstract修饰符在修饰类时必须放在类

虚方法virtual、抽象方法abstract、接口interface区别

接口.抽象类.抽象方法.虚方法: 这四个名词时非常容易混淆的: 首先说一下接口 与抽象类 的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方法被继承,需要override重写 . 4.接口更像是一种规范,一种约束. 5.一个子类只能继承一个抽象类,但却可以继

转载 [c#] 虚函数(Virtual),抽象函数(abstract)和接口的区别

1.virtual:允许被重写,但不强制要求.声明时提供其自身实现: 2.abstract:强制要求其继承者重写.声明时不提供其自身的实现,抽象类不能被实例化: 3.interface:接口就是协议,其声明的成员(属性,方法,事件和索引器)必须由其继承的类实现.接口不能直接被实例化. 虚方法与抽象方法的区别在于,虚方法提供自身的实现,并且不强制要求子类重写:而抽象方法不提供自身的实现,并且强制子类重写. 抽象类与接口很相似,但是思路不一样.接口是公开类的成员,而抽象类则是抽象类成员以要求子类继承

小白心目中的Java抽象类(abstract class)

在java开发中,我们有时会定义了一个父类,这个父类只有对方法的描述,但却没有在父类中写出对方法的实现,这种被定义的方法称为抽象方法.那么理所当然,含有抽象方法的类就称为抽象类.用关键字abstract修饰. 例如我写一个父类Person: 1 abstract class Person{ 2 public abstract void study(); 3 public void eat(){ 4 System.out.println("吃的技能"); 5 } 6 } 可以看出,这个P

C# 中基类,虚类,抽象类,密封类,接口的区别

在派生类中重写基类中的虚方法使用override: 在派生类中调用基类中的方法似乎用Base.method(); 在派生类中修改基类中的普通方法可以用new 关键字重写: 密封类中的方法都不能再派生类中使用; 抽象类与抽象方法使用abstract关键字,抽象方法不使用花括号{},抽象类中可以有不抽象的方法与属性.也就是抽像类中不全部是抽象方法与属性. 当一个非抽象类继承了抽象类.就必须实现它所有的抽象方法如果只有 一个抽象方法没有实现,那个这个非抽象类必须设置为抽象的.抽象类不能实例化,没有对象

【Java】Comparable和Comparator接口的区别

Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象. Java提供了包含compare()和equals()两个方法的Comparator接口. compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数. equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等.只有当输入参数也是一

JAVA中List,Map,Set接口的区别

从三点来分析它们之间的不同: 1.继承的接口不同: List,Set接口都是继承于Collection接口的,而Map接口不是,它是一个顶层接口. 2.自身特点: List:用来处理序列的.对于放于的元素是有序的并且可以重复. Set:用来处理集合的.对于放于的元素是无序的并且不可以重复. Map:用来处理键值对.key值不能重复,如果重复,则会被覆盖,并且放入无序. 3.实现类: List:有三个实现类,ArrayList  Vector  LinkedList Set:有三个实现类,Hash

关于Java抽象类和接口的区别与举例说明

声明:本文整理自 http://www.enet.com.cn/article/2007/1126/A20071126923475.shtml  中的文章 Java 中对于抽象类的定义有两种支持机制: 抽象类(abstract class)和接口(interface).我们来看看这两种机制的不同在哪里? 零.在此处需要明确的指出以下几点: 1.抽象类中抽象一词 限定的是不允许 有此类的分配实例到内存中 2.抽象方法:在方法定义(声明)时在其前面有修饰符abastract 3.普通方法:在方法定义