2020.7.25

学习内容:

接口

接口是Java语言中为解决无法实现多继承而提供的一个解决方案,接口中没有实际的方法实现,只定义了一些空壳。一个类可以通过实现接口来实现多重继承关系。

1、接口的概念

接口就是一种特殊的抽象类,接口中只提供了方法的原形,但没有具体的方法实现,子类必须提供父类中抽象方法的实现方式。

接口和抽象类一样,也可以定义抽象的方法,并且在接口中只能够包含抽象的方法和常量,不能有变量、初始化块和构造函数。

 由此代码可以看出,接口中的方法都是抽象类,并没有方法具体的实现。接口中的方法必须由接口的实现类来实现

2、接口的声明

使用 interface 来定义一个接口。

接口定义同类的定义类似,也分为接口的声明和接口体,其中,接口体由常量定义和方法定义两部分组成

定义接口的基本格式如下:

 注:与Java的类文件一样,接口文件的文件名必须与接口名相同

3、接口的使用

接口不能单独实例化,要想实例化接口,必须通过接口的实现类来完成。

接口的实现类,必须全部实现接口中的所有方法,接口就是标准,用来隔离具体实现的。

接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键字 implements ,其基本格式为:

[修饰符] class < 类名 > [extends 父类名] [implements 接口列表]{  }

 

4、Java接口的特征归纳

(1)Java接口中的成员变量默认都是 public、static、final 类型的,而这三个类型其实都可以省略,接口中的成员变量为常量,并且建议全部使用大写,单词之间用“_”分隔

(2)Java中的方法默认都是public、abstract类型的,并且public和abstract可以省略。接口中的方法没有方法体,不能被实例化

(3)Java接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法

   接口中的变量必须初始化,并且方法必须是抽象方法。否则会报错

(4)接口中没有构造方法,不能被实例化

   因为接口是不能被实例化的,因此没有构造方法,如果有就会报错

(5)一个接口不能实现另一个接口,但它可以继承多个其他的接口

(6)Java接口必须通过类来实现它的实现类来实现抽象方法

(7)当类实现了某个Java接口时,他必须实现接口中的所有抽象方法,否则,这个类必须声明为抽象的

(8)不允许创建接口的实例,但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

(9)一个类只能继承一个直接的父类,但可以实现多个接口,间接地实现了多继承

5、接口的继承

Java中的类是属于单继承的,Java中的接口也可以实现继承,并且接口可以实现多继承

不允许类多重继承的主要原因:如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承哪一个呢?但接口不存在这样的问题,接口全都是抽象方法,继承谁都无所谓,所以接口可以继承多个接口

6、标记接口

标记接口是没有任何方法和属性的接口,它仅仅表明它的类属于一个特定的类型,供其他代码来测试。使用标记接口的唯一目的是可以用 instanceof 进行类型查询,例如:if(obj instanceof Cloneable){...}

在Java中常见的标记接口有 Serializable接口 和 Clone接口

(1)java.io.Serializable 接口

该接口仅仅表明,实现该接口的类,可以实现类的序列化和反序列化。标记接口仅仅是一个标记,此种接口并没有抽象方法

(2)java.lang.Cloneable 接口

该接口表明 Object.clone()方法可以合法地对该类实例进行按字段复制。实现此接口的类应该使用公共重写 Object.clone

7、综合实例

(1)定义一个接口叫Car,该接口中有3个方法,分别是 getName()--获得车的名字,getColor()--获得车的颜色,getPrice()--获得车的价格

package day01;
public interface Car {
    public String getName();
    public String getColor();
    public double getPrice();
}

(2)然后写一个BMW类来实现这个接口

package day01;

public class BMW implements Car{
    @Override
    public String getColor() {
        String Color="红色";
        return Color;
    }
    @Override
    public String getName() {
        String name="宝马";
        return name;
    }
    @Override
    public double getPrice() {
        double price=800000;
        return price;
    }
}

(3)最后写一个测试类CarTest

package day01;

public class CarTest {
    public static void main(String[] args) {
        Car car=new BMW();
        String name=car.getName();
        String color=car.getColor();
        double price=car.getPrice();
        System.out.println("3年后我将送给女朋友一辆"+name+",颜色是"+color+",价格是"+price+"元");
    }
}

遇到的问题:

1.@overeide 是什么意思?

@Override简单理解就是这个句话下边的方法是继承父类的方法,对其覆盖。比如toString()方法的话,在方法前面加上@Override 系统可以帮你检查方法的正确性,@Override public String toString(){...}这是正确的一旦写错 写成这样@Override public String tostring(){...}编译器可以检测出这种写法是错误的 这样能保证你的确重写的方确而如果不加@Overridepublic String tostring(){...}这样编译器是不会报错的 它只会认为这是你自己新加的一个方法而已------------------------------------------------------------@Override的用法:Override:java.lang.Override是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。使用方法极其简单:在使用此annotation时只要在被修饰的方法前面加上@Override。下面的代码是一个使用@Override修饰一个企图重载父类的toString方法,而又存在拼写错误的sample:清单1:@Override public String toSting() { // 注意方法名拼写错了 return "[" + super.toString() + "]";}

2.不理解标记接口

https://www.cnblogs.com/yanggb/p/10664155.html

明天要学习的内容:

异常机制概述

原文地址:https://www.cnblogs.com/ltw222/p/13395965.html