Java中接口,抽象类.嵌套接口区别和用法

简介: Java中接口,抽象类.嵌套接口区别和用法

1接口


   接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口与类的区别:

    接口不能用于实例化对象。

    接口没有构造方法

    接口中所有的方法必须是抽象方法

    接口不能包含成员变量,除了 static 和 final 变量。

    接口不是被类继承了,而是要被类实现。

    接口支持多继承。

接口特性

    接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。

    接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。

    接口中的方法都是公有的。

抽象类和接口的区别

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

如下图创建一个item类


package com.itheima.dao;
/**
 * 食物条目
 */
public interface Item {
    //名字
    public String name();
    //嵌套接口  打包
   public Packing packing();
    //价钱
    public float price();
}

在定义一个汉堡类Burger

package com.itheima.domain;
import com.itheima.dao.Item;
import com.itheima.dao.Packing;
//汉堡  实现条目
public  abstract class Burger implements Item {
    //抽象类里面可以有非抽象的方法
    public Packing packing() {
        return new Wrapper();
    }
    //抽象方法
    public abstract float price() ;
}

这个里面就是没有全部实现接口中的方法,把类定义为了抽象类


2.嵌套接口

interface嵌套interface

作用是降低耦合性


package com.itheima.dao;
/**
 * 食物条目
 */
public interface Item {
    //名字
    public String name();
    //嵌套接口  打包
   public Packing packing();
    //价钱
    public float price();
}
package com.itheima.dao;
//食物包装
public interface Packing {
    public String pack();
}

上面就是接口之间的嵌套


3.用抽象类来实现接口,可以不用重写接口中的方法

item接口


package com.itheima.dao;
/**
 * 食物条目
 */
public interface Item {
    //名字
    public String name();
    //嵌套接口  打包
   public Packing packing();
    //价钱
    public float price();
}

Burger 类为抽象类,只实现一部分方法

package com.itheima.domain;
import com.itheima.dao.Item;
import com.itheima.dao.Packing;
//汉堡  实现条目
public  abstract class Burger implements Item {
    //抽象类里面可以有非抽象的方法
    public Packing packing() {
        return new Wrapper();
    }
//
//    //抽象方法
//    public abstract float price() ;
}

VegBurger实现抽象类没有实现的其他方法

package com.itheima.domain;
public class VegBurger extends Burger  {
    //继承抽象类,抽象类没有实现的方法,必须实现
    public float price() {
        return 25.0f;
    }
    public String name() {
        return "Veg Burger";
    }
}


相关文章
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
18天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
20天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第17天】Java零基础教学篇,手把手实践教学!
17 2
|
22天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第15天】Java零基础教学篇,手把手实践教学!
19 2
|
23天前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
23天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
26天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
28天前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
60 0
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
5天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9