java8的interface和abstract class

本文介绍了Java8中接口的重要变化,包括默认方法和静态方法的引入,并对比了接口与抽象类的区别。通过示例展示了如何使用这些新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:java8接口interface的变化

1. 在java8中接口可以有default方法和static方法。java8之前的接口中的方法全部默认为 public abstract method_name(),变量全部默认为public static final

default method in interface 默认方法

简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 

interface Drawable{  
void draw();  
default public void msg(){System.out.println("default method");}  
}  
class Rectangle implements Drawable{  
public void draw(){System.out.println("drawing rectangle");}  
}  
class TestInterfaceDefault{  
public static void main(String args[]){  
Drawable d=new Rectangle();  
d.draw();  
d.msg();  
}}  

default方法是提交提供的一个默认实现,也可以像其他方法一样被继承。接口可以有多继承,当多个父接口中有相同签名的默认方法时,子实现类中需要以

<Interface接口名>.super.<method方法名>()的形式指定要调用哪个父接口中的方法

由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,默认方法判断冲突的规则如下:

1.一个声明在类里面的方法优先于任何默认方法(classes always win)

2.否则,则会优先选取最具体的实现,比如下面的例子 B重写了A的toOverride方法。

interface A
{
    void foo();
    default void toOverride() {
        System.out.println("A");
    }
}
interface B extends A
{
    default void toOverride() {
        A.super.toOverride();
        System.out.println("B");
    }
}
interface C extends B
{
    default void toOverride() {
        A.super.toOverride();// does not work
        B.super.toOverride();
        System.out.println("B");
    }
}
class D implements B
{
    public void toOverride() {

    }    
    public void foo() {
        D.this.toOverride();
        B.super.toOverride();
        A.super.toOverride(); // does not work!
    }
}


static method in interface  通过接口名就可以直接调用其静态方法

interface Drawable{  
void draw();  
static int cube(int x){return x*x*x;}  
}  
class Rectangle implements Drawable{  
public void draw(){System.out.println("drawing rectangle");}  
}  
  
class TestInterfaceStatic{  
public static void main(String args[]){  
Drawable d=new Rectangle();  
d.draw();  
System.out.println(Drawable.cube(3));  
}}  


二:接口interface和抽象类abstract class的区别

Abstract class Interface
1) Abstract class can have abstract and non-abstractmethods. Interface can have only abstract methods. Since Java 8, it can have default and static methods also.
2) Abstract class doesn't support multiple inheritance. Interface supports multiple inheritance.
3) Abstract class can have final, non-final, static and non-static variables. Interface has only static and final variables.
4) Abstract class can provide the implementation of interface. Interface can't provide the implementation of abstract class.
5) The abstract keyword is used to declare abstract class. The interface keyword is used to declare interface.
6) Example:
public abstract class Shape{
public abstract void draw();
}
Example:
public interface Drawable{
void draw();

7)接口中没有 this 指针,没有构造函数. 抽象类中可以有  

注意:

  • default 关键字只能在接口中使用(以及用在 switch 语句的 default 分支),不能用在抽象类中。

  • 接口默认方法不能覆写 Object 类的 equalshashCode 和 toString 方法。

  • 接口中的静态方法必须是 public 的,public 修饰符可以省略,static 修饰符不能省略。


<think>好的,用户想了解接口interface抽象类(abstract class)在编程中的区别。首先,我需要回忆一下这两者的基本概念它们在面向对象编程中的作用。根据引用[1],抽象类的子类必须实现父类中的所有抽象方法,否则子类也必须声明为抽象类。而接口不能实例化,可以包含有实现或无实现的方法,所有字段默认是publicstatic、final的,方法默认是public的。引用[2]提到接口不能有状态或实现,数据成员必须是publicfinalstatic的,而抽象类可以有状态方法实现。另外,接口支持多重继承,而抽象类不行。引用[3]则提到设计上的区别,抽象类适用于IS-A关系,接口适用于CAN-DO-THIS关系。例如,形状类适合用抽象类,而可飞行适合用接口。接下来要整理这些区别,分点说明。可能需要从定义、继承、方法实现、状态、设计目的等方面展开。同时要注意用户可能对Java比较熟悉,因为引用中多次提到Java的例子。需要确保术语准确,比如接口的默认方法、静态方法等特性。还要考虑用户可能的实际应用场景,比如什么时候选择抽象类,什么时候用接口。引用[4]提到抽象类用于定义特定行为的结构,而接口用于契约式编程。引用[5]提到抽象类的子类需要实现所有抽象方法,而接口方法都是抽象的。 需要检查是否有遗漏点,比如构造函数的区别,接口的多重继承,以及Java8之后接口可以有默认方法等。这些内容在引用中没有详细提到,可能需要补充,但要根据现有引用内容,避免引入外部知识。最后,生成相关问题时要围绕两者的区别应用,比如适用场景、多重继承、设计原则等。确保问题能帮助用户进一步理解。</think>### 接口interface)与抽象类(abstract class)的区别 接口抽象类是面向对象编程中实现多态代码复用的两种重要机制,以下是它们的核心区别: #### 1. **定义与核心目的** - **抽象类**: - 用于定义**IS-A(是一个)**关系,例如:`Circle`是`Shape`的一种[^3]。 - 可以包含**具体方法**(有实现)**抽象方法**(无实现),还能定义字段(数据成员)构造方法[^2][^4]。 - 子类必须实现所有抽象方法,否则子类自身也必须声明为抽象类[^1]。 - **接口**: - 用于定义**CAN-DO-THIS(能做某事)**关系,例如:`Bird`可以实现`Flyable`接口[^3]。 - 所有方法默认是`public abstract`的(Java 8后允许`default``static`方法),字段默认是`public static final`的[^1][^2]。 - 接口不包含构造方法,也不能保存对象状态(即非静态字段)[^2]。 #### 2. **继承与实现** - **抽象类**: - 支持**单继承**,一个类只能继承一个抽象类。 - 子类通过`extends`关键字继承。 - **接口**: - 支持**多重继承**,一个类可以实现多个接口[^2]。 - 通过`implements`关键字实现接口。 #### 3. **代码复用与设计** - **抽象类**适合: - 多个子类共享**公共代码逻辑**(通过具体方法实现)[^4]。 - 需要定义**部分默认行为**的场景,例如模板方法模式。 - **接口**适合: - 定义**行为契约**,强制实现类遵循特定规范(如`Comparable`接口)[^4]。 - 解耦功能扩展,例如通过接口组合实现灵活的功能叠加[^3]。 #### 4. **典型应用场景** - **抽象类示例**: ```java abstract class Shape { abstract double area(); // 抽象方法 void print() { // 具体方法 System.out.println("Area: " + area()); } } ``` - **接口示例**: ```java interface Flyable { void fly(); // 隐式抽象方法 } ``` #### 5. **版本演进的影响** - 在Java 8之后,接口可以通过`default`方法提供默认实现,但仍不能保存状态[^1]。 - 抽象类的演进可能破坏子类兼容性(如新增抽象方法),而接口通过`default`方法可避免这一问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值