The Default Methods And Static Methods In Java Interface

Default Methods
Default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces

默认方法主要是在确保不破坏原有程序的基础上对接口进行扩展 :

public interface TInterface {
    //原有一个sayHello()方法。
    void sayHello();
}
/**
 * TImplement 实现了 TInterface接口,并重写了sayHello()方法
 * @author Administrator
 *
 */
public class TImplement implements TInterface {

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("Hello");

    }

}
/**
 * AImplement 也实现了 TInterface接口,但是现在需要在AImplement中新增greeting()方法,并希望在接口中实现
 * 而且需要兼容以前的程序,要实现这个功能,解决方案不是单一的,例如可以另写一个接口继承TInterface接口,
 * 然后AImplement继承新的接口,但Java8中对Interface新增了Default方法,我们可以在不另加其他接口的情
 * 况下对原有接口进行扩展
 * 
 * @author Administrator
 *
 */
public class AImplement implements TInterface {

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("Say Hello!");

    }

}

修改原来的TInterface接口 ,新增greeting()方法。

public interface TInterface {
    //原有一个sayHello()方法。
    void sayHello();
    //新增greeting()方法,并编写默认实现代码
    default public void greeting(){
        System.out.println("Say Greeting");
    }
}

在AImplement中重写greeting()方法,覆盖默认方法。

/**
 * AImplement 也实现了 TInterface接口,但是现在需要在AImplement中新增greeting()方法,并希望在接口中实现
 * 而且需要兼容以前的程序,要实现这个功能,解决方案不是单一的,例如可以另写一个接口继承TInterface接口,然后AImplement
 * 继承新的接口,但Java8中对Interface新增了Default方法,我们可以在不另加其他接口的情况下对原有接口进行扩展
 * 
 * @author Administrator
 *
 */
public class AImplement implements TInterface {

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("Say Hello!");

    }

    /* 
     * 重写greeting()方法,以适应不同的需求
     */
    @Override
    public void greeting() {
        // TODO Auto-generated method stub
        System.out.println("Override!");
    }


}

此时我们已经完成在不破坏原有程序的基础之上对接口进行了扩展。

public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        AImplement.class.newInstance().greeting();
    }

测试输出:Override!


Static Methods
A static method is a method that is associated with the class in which it is defined rather than with any object. Every instance of the class shares its static methods.

Static Methods可以在接口中定义Static方法,并且每一个实例(该接口)都共享这些方法。

/**
 * static 方法无法override,该接口的每个实例都将共享这个say()方法。
 * 
 * @author Administrator
 *
 */
public interface TInterface {
    // Static Method 
    static public String say(){
        return "123456";
    }
}

直接使用接口调用该方法

    public static void main(String[] args) {
        //使用接口直接调用该方法
        System.out.println(TInterface.say());

    }

输出结果:123456

<think>好的,我现在需要解释抽象方法、抽象类和接口。首先,我得回忆一下这些概念的定义和区别,然后想想怎么用中文清晰地表达出来。 抽象方法,应该是指没有具体实现的方法,需要在子类中重写。比如在Java中,用abstract关键字声明的方法,没有方法体。那抽象类呢,就是包含抽象方法的类,必须用abstract修饰,不能被实例化,只能被继承。抽象类可以有普通方法,也可以有成员变量,而子类必须实现所有的抽象方法,否则子类也得是抽象类。 然后是接口,接口里的方法默认都是抽象的,不过在Java 8之后可以有默认方法和静态方法。接口中的变量默认是public static final的。类可以实现多个接口,但只能继承一个抽象类。接口主要用于定义行为,而抽象类用于代码复用和扩展。 接下来需要比较它们的异同。比如抽象类可以有构造方法,而接口不能。抽象类中的成员变量可以是各种访问类型,而接口的变量只能是public static final。使用场景的话,接口适合定义契约,抽象类适合部分实现的情况。 可能用户会混淆接口和抽象类,所以需要强调何时使用哪一个。比如“is-a”关系用抽象类,“has-a”能力用接口。还要提到设计原则,比如接口隔离,依赖倒置等。 需要检查是否有错误的地方,比如抽象类是否可以没有抽象方法?是的,但如果有抽象方法,类必须是抽象的。接口的方法是否都是抽象的?在Java 8之前是的,但现在可以有默认实现。所以要说明不同版本的区别。 另外,语法方面,举一些例子,比如Java中如何定义抽象类和接口,如何继承和实现。比如: 抽象类: abstract class Animal { abstract void makeSound(); void eat() { ... } } 接口: interface Flyable { void fly(); } 然后子类继承抽象类,实现接口。比如Dog extends Animal,必须实现makeSound。Bird实现Flyable接口,必须实现fly方法。 还要提到多继承的问题,Java不支持多继承,所以抽象类只能单继承,但接口可以多实现。这点很重要。 可能还需要提到设计模式中的应用,比如模板方法模式用抽象类,策略模式用接口。这样用户能理解实际应用场景。 最后总结三者的区别,使用场景,以及各自的优缺点。确保结构清晰,逐步引导用户理解。</think>让我们逐步理解抽象方法、抽象类和接口的概念及区别: 1. **抽象方法 (Abstract Method)** - **定义**:用`abstract`声明且没有实现的方法 - **特性**: - 只有方法签名,没有方法体 - 必须被子类/实现类重写 - **示例**: ```java abstract void draw(); ``` 2. **抽象类 (Abstract Class)** - **定义**:用`abstract`修饰且包含抽象方法的类 - **特点**: - 不能被实例化 - 可以包含普通方法和成员变量 - 子类必须实现所有抽象方法(除非子类也是抽象类) - **示例**: ```java abstract class Shape { abstract double area(); void print() { System.out.println("形状"); } } ``` 3. **接口 (Interface)** - **定义**:用`interface`声明的完全抽象类型 - **特性**: - 方法默认是`public abstract`(Java 8前) - 变量默认是`public static final` - Java 8+支持默认方法(`default`)和静态方法 - **示例**: ```java interface Drawable { void draw(); default void reset() { /* 默认实现 */ } } ``` 4. **核心区别对比** | 特性 | 抽象类 | 接口 | |---------------------|----------------------------|---------------------| | 实例化 | ❌ 不能实例化 | ❌ 不能实例化 | | 方法实现 | 可包含实现方法 | Java8+支持默认方法 | | 变量类型 | 任意类型变量 | 只能是常量 | | 继承机制 | 单继承(extends) | 多实现(implements)| | 构造方法 | ✅ 有 | ❌ 没有 | | 设计目的 | 代码复用 + 多态基础 | 行为规范定义 | 5. **使用场景选择** - 选择抽象类当: - 需要共享代码给多个相关类 - 需要定义非public的成员 - 需要声明非静态/非常量字段 - 选择接口当: - 定义多个不相关类的共同行为 - 需要多重继承的特性 - 定义类型的外延特性(如Comparable) 6. **设计模式中的典型应用** - 抽象类:模板方法模式 ```java abstract class Game { abstract void initialize(); abstract void startPlay(); // 模板方法 final void play() { initialize(); startPlay(); } } ``` - 接口:策略模式 ```java interface PaymentStrategy { void pay(int amount); } class CreditCardPayment implements PaymentStrategy { ... } ``` 7. **Java 8+的重要变化** - 接口现在可以包含: - 默认方法(解决接口演化问题) - 静态方法(工具方法) ```java interface Vehicle { default void print() { System.out.println("交通工具"); } static int convertKmToMile(int km) { return km/1609; } } ``` 8. **最佳实践建议** - 优先使用接口定义类型 - 用抽象类实现代码复用 - 接口命名建议使用形容词(-able)形式,如`Runnable` - 遵循"接口隔离原则":细粒度接口优于臃肿接口 理解这些概念后,可以更好地进行面向对象设计,在灵活性和可维护性之间找到平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值