接口

本文深入探讨了Java中抽象类和接口的概念与应用,对比两者特性,解释如何使用抽象方法和接口实现多态及多重继承,同时展示了抽象类与接口在实际编程中的作用。

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

首先,我将介绍一下抽象类,他是介于普通类和接口之间。尽管我们再构建默写未实现方法的类时,我们的第一个想法总是创建接口,但时抽象类仍是一种必须的工具。

抽象类和抽象方法

在我们生活中,也有很多抽象得到概念。一个通用接口建立一种基本的形式,来表示所有导出类的共同部分,不同的子类可以用不同的方式来表达这个接口。然而这个通用类又被称为抽象基类,或者交抽象类。

比如:

  • 人类(有男人,有女人)
  • 鸟类(有咕咕咕,有八哥)

再组织这种关系的时候我们可以使用extennds的方式继承:

  • 图中food是一个抽象基类,下面的bread,rice,noodles都是food的子类,
  • food类都有eat()的方法。但这个动作是抽象的(没有具体的方法),每种不同的食物都有不同的吃法,需要每个类对food类的eat()进行覆盖。
public class Test2 {
    public static void main(String[]args){
        Rice r= new Rice();
        Bread b = new Bread();
        Noodles n = new Noodles();
        r.eat();
        r.feeling();
        b.eat();
        b.feeling();
        n.eat();
        n.feeling();
    }
}

abstract class food{
    public abstract void eat();
    public void feeling(){
        System.out.println("吃饱了");
    }
}

class Rice extends food{
    public void eat(){
        System.out.println("米饭烧熟了吃");
    }

    public void feeling(){
        System.out.println("吃米饭没有配菜");
    }
}

class Bread extends food {
    public void eat() {
        System.out.println("面包直接吃");
    }

    public void feeling() {
        System.out.println("面包没有营养");
    }
}


class Noodles extends food {
    public void eat() {
        System.out.println("面条烫嘴");
    }

    public void feeling() {
        System.out.println("没有大排面好吃");
    }
}

从上述代码中可以看到,Java提供一种叫抽象方法的机制,这种方法是不完整的;仅有方法声明而没有方法主体。如下:

abstarct void f();

包含抽象方法的类,叫做抽象类。如果一个类包含一个或者多个抽象方法,这个类必须添加abstract。当然抽象类中并不需要所有方法都是抽象的,仅需要将某些方法声明为抽象就OK。

 

接口

interface这个关键字是是产生一个更加抽象的类。允许创建者确定方法名,参数列表,返回类型,但是没有任何具体实现

实现

  • 接口可以包含域,但这些域都是隐式的static和final的,
  • 接口中默认的方法声明是public,当要实现一个接口时,接口被定义的方法必须定义是public的
  • 为了实现某个特定的接口,需要医用implements关键字来实现,一旦实现类某个接口,实现后就会变成一个普通类,然后可以通过继承或者组合的方法来调用他。

Java存在的“多重继承”

interface存在着“多重继承”,此处的“多重继承”其实是多重实现的意思,可以将所有接口名都制约implements的后面用逗号隔开

interface CanFight {
  void fight();
}

interface CanSwim {
  void swim();
}

interface CanFly {
  void fly();
}

class ActionCharacter {
  public void fight() {}
}

class Hero extends ActionCharacter
    implements CanFight, CanSwim, CanFly {
  public void swim() {}
  public void fly() {}
}

public class Adventure {
  static void t(CanFight x) { x.fight(); }
  static void u(CanSwim x) { x.swim(); }
  static void v(CanFly x) { x.fly(); }
  static void w(ActionCharacter x) { x.fight(); }
  public static void main(String[] args) {
    Hero i = new Hero();
    t(i); // Treat it as a CanFight
    u(i); // Treat it as a CanSwim
    v(i); // Treat it as a CanFly
    w(i); // Treat it as an ActionCharacter
  }
} 

扩展

我们不仅可以在接口中添加新的方法声明,还可以通过继承在新的接口中组合数个接口。

Java接口可以从另外一个Java接口中继承,就像类可以从其他类中继承一样。你可以使用extends来指定继承。下面是一个简单的接口继承示例:

public interface MySuperInterface {
    public void saiHello();
}
public interface MySubInterface extends MySuperInterface {
    public void sayGoodbye();
}

MySubInterface接口继承于MySuperInterface接口。这意味着,MySubInterface将继承MySuperInterface所有的属性和方法,实现接口的类必须实现MySubInterface和MySuperInterface接口中所有的方法

在子接口中可以定义与父接口中具有相同签名(名称+参数)的方法。

与类的继承不同是,子接口可以继承多个父接口。列出所有你想要继承的接口名称,以逗号分隔。要实现继承多个父接口的子接口,实现接口的类必须实现子接口与所有父接口中的所有方法。

下面是一个继承多个父接口的示例:

public interface MySubInterface extends
    SuperInterface1, SuperInterface2 {
    public void sayHello();
    public void sayGoodBye();
}

回调

//这一节之后的时间里在进行总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值