接口可以看做是多个类的公共规范,是一种引用类型。
一、接口的语法
接口的定义格式与类相似,关键字为 interface 。
public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}
注意:
创建接口时,接口的命名一般以大写字母 I 开头。 接口的命名一般使用“形容词”词性的单词。 阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性。
二、接口的使用
接口不能直接使用,必须要有一个“实现类”来“实现”该接口,实现接口中的所有抽象方法。
//子类和父类之间是 extends 继承关系,类与接口之间是 implements 实现关系。
public class 类名称 implements 接口名称{
// ...
}
三、接口的特性
1、接口类型是一种引用类型,但是不能直接 new 接口的对象
2、接口中每一个方法都是public的抽象方法,即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)
3、接口中的方法不能在接口中实现,只能由实现接口的类来实现,但是两个方法除外:一个是被static修饰的方法,一个是被default修饰的方法
4、重写接口中的方法时,不能使用默认的访问权限
5、接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
6、接口中不能有静态代码块和构造方法
7、接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是 .class
8、如果类没有实现接口中所有的抽象方法,则类必须设置为抽象类
9、jdk8中:接口中还可以包含default方法。
四、接口的继承
在Java中,虽然不支持多继承,但是一个类可以实现多个接口。接口之间可以实现多继承,相当于把多个接口合并起来。
IDEA 中使用 ctrl + i 快速实现接口。
- 类和接口之间的关系:implements(实现)
- 接口和接口之间的关系:extends(拓展)
五、Clonable 接口和深拷贝
Clonable 是Java中内置的一个接口。在Object类中存在一个clone方法,调用这个方法可以创建一个对象的“拷贝”。想要合法调用clone方法,就必须先实现Clonable接口,否则就会抛出CloneNotSupportedException异常。
浅拷贝:直接复制指向某个对象的指针,而不复制对象本身,新旧对象共用一块内存。
chass Age {
public double a = 21;
}
class Person implements Cloneable {
public String name;
public Age age = new Age();
public Person(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person("小刘");
Person person2 = (Person)person1.clone();
System.out.println("person1 " + person1.age.a);
System.out.println("person2 " + person2.age.a);
System.out.println("==============");
person2.age.a = 12;
System.out.println("person1 " + person1.age.a);
System.out.println("person2 " + person2.age.a);
}
}
运行结果:
原因:
深拷贝:创造另外一个一模一样的对象,新旧对象不共用同一块内存,对新对象的改变不会影响到旧对象。
class Person implements Cloneable {
// 此处代码已省略
// 对 clone() 方法进行修改,使之符合深拷贝
@Override
protected Object clone() throws CloneNotSupportedException {
Person tmp = (Person)super.clone();
tmp.age = (Age) this.age.clone();
return tmp;
}
// main方法已省略
}
运行结果:
原因:
深拷贝和浅拷贝在于代码的实现,而不在于某个方法。