1.接口:interface:接口的地位等同于class,接口中的所有方法都是抽象方法。在声明接口中的方法的时候,可以使用abstract关键字也可以不使用。通常情况下,都会省略掉abstract关键字。
2.可以将接口看作是特殊的抽象类(抽象类中可以有具体方法,也可以有抽象方法,而接口中只能有抽象方法,不能有具体方法)
package com.cl.abstracttest; public interface InterfaceTest { public abstract void output();//可以省略掉abstract关键字 }
3.类跟继承的关系
类可以实现接口。实现使用关键字implements表示。代表某个类实现了某个接口。
4.一个类实现了某个接口,那个该类必须要实现接口中声明的所有方法。如果该类是个抽象类,那么就无需实现接口中的方法了。
报错:The type MyClass must implement the inherited abstract method MyInterface.output()
解决办法:
package com.cl.abstracttest; public class Test3 { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.output(); } } interface MyInterface{ public void output(); } class MyClass implements MyInterface { @Override public void output() { System.out.println("test"); } }
5.java是单继承的,也就是说某个类只能有唯一一个父类,一个类可以实现多个接口,多个接口之间使用逗号分隔。
package com.cl.abstracttest; public class Test3 { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.output(); myClass.output2(); } } interface MyInterface{ public void output(); } interface MyInterface2{ public void output2(); } class MyClass implements MyInterface,MyInterface2 { @Override public void output() { System.out.println("test"); } @Override public void output2() { System.out.println("test2"); } }
6.
package com.cl.abstracttest; public class Test3 { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.output(); myClass.output2(); myClass.output3();//从父类继承过来的 } } interface MyInterface{ public void output(); } interface MyInterface2{ public void output2(); } class MyParent{ public void output3(){ System.out.println("output3"); } } class MyClass extends MyParent implements MyInterface,MyInterface2//继承了父类,还继承了两个接口 { @Override public void output() { System.out.println("test"); } @Override public void output2() { System.out.println("test2"); } }
输出结果如下:
test
test2
output3
多态:所谓的多态是指父类型的引用可以指向子类型的对象,或者接口类型的引用可以指向实现该接口的类的实例。关于接口与实现接口的类之间的强制类型转换方式与父类与子类之间的强制类型转换方式完全一样。
package com.cl.abstracttest; public class Test4 { public static void main(String[] args) { AA bb = new BB();//接口类型的引用可以指向实现该接口的类的实例 bb.output(); } } interface AA{ public void output(); } class BB implements AA{ @Override public void output() { System.out.println("BB"); } }
关于接口与实现接口的类之间的强制类型转换方式与父类与子类之间的强制类型转换方式完全一样。这句话理解有如下代码
package com.cl.abstracttest; public class Test4 { public static void main(String[] args) { /*向上类型转换 BB bb = new BB(); AA aa = bb; bb.output(); */ //向下类型转换 AA aa = new BB(); BB bb = (BB)aa; bb.output(); } } interface AA{ public void output(); } class BB implements AA{ @Override public void output() { System.out.println("BB"); } }