/*
* 接口:
* 1、接口是一种引用数据类型
* 2、接口是完全抽象的(抽象类是半抽象)
* 或者也可以说接口是特殊的抽象类
* 3、语法:
* 【修饰符列表】interface 接口名{
* }
* 不同于抽象类:
* 【修饰符列表】 abstract class 类名{
* }
* 4、接口支持多继承,一个接口可以继承多个接口
* 5、接口中只包含两部分:
* 一部分:常量 一部分:抽象方法
* 6、接口中所有元素都是public修饰的
* 7、接口中的抽象方法定义时,可以省略public abstract
* 8、接口中的方法不能有方法体,都是抽象方法
* 9、interface中没有变量,只要常量(不能更改)
* 可以调用,(A.PI)
*
*
* */
public class Test01 {
public static void main(String[] args) {
System.out.println(C.PI);
//C.PI = 12;
}
}
interface A {
}
interface B {
}
interface C extends A, B {
public static final double PI = 3.1415926;
double PI02 = 3.12;
// 接口可以省略常量前的public static final
public abstract void sum(int a, int b);
// 接口中都是抽象方法,可以省略public abstract?
int sum02(int a, int v);
// 接口中可以有方法体?
// void doSome(){}报错不能
}
======================================================================================================
public class Test02 {
public static void main(String[] args) {
MyMathTemp a = new MyMathTemp();
a.sum(12,13);
}
}
//特殊的抽象类,完全抽象的,接口
//因为抽象类中可以有抽象方法,
// 亦可以有实例方法
interface MyMath{
double PI = 3.1414926;
int sum(int a,int b);
}
/*
* 接口基础语法:
* 类和类之间叫做继承
* 类和接口之间叫实现
* (当然,你也可以叫做“继承”)
* 继承使用extends
* 实现用implements关键字
*
* */
class MyMathTemp implements MyMath{
//重写,覆盖,实现,接口中的方法(通常叫实现)
// 当一个非抽象类实现接口中方法,必须将接口中方法全部实现
// 子类不能去掉public,修饰符只能权限更高,不能更低
public int sum(int a,int b){
System.out.println(a + b);
return a;
}
}
======================================================================================================
/*
* 接口和接口之间支持多继承,
* 一个类可以同时实现多个接口
* 这种机制弥补了java中的哪种缺陷?
* java中类和类之间只支持单继承
* 实际上单继承是为了简单而出现的
* 现实世界中存在多继承,java中的接口
* 弥补了单继承带来的缺陷
* 接口互转问题:
* A和B没有继承关系,但是可以互转
* 编译器没意见,但运行时可能出现
* ClassCastException
* 注意:
* 向下转型,首先进行判断instanceof
*/
public class Test03 {
public static void main(String[] args) {
Son ff = new Son();
ff.f();
ff.m();
Y yy = new Z();
if(yy instanceof X){
X xx = (X)yy;
}
//刚开始这里写成 X xx = (Y)yy;错误:会报Y 无法转成X
/*
* 经过测试,强制类型装换的时候,没有继承关系,也可强转
* 注意:运行时会报ClassCastException异常
* 编译通过,运行不通过
* */
Father a = new Son();
Mother b = new Son();
Father c = (Father)b;
// 这样写是可以的
}
}
interface X {
}
interface Y {
}
class Z implements Y {
}
//===============================================
interface Father {
void f();
}
interface Mother {
void m();
}
class Son implements Father, Mother {
public void f() {
System.out.println("实现第一个接口");
}
public void m() {
System.out.println("实现第二个接口");
}
}
======================================================================================================
/*
* 继承和实现都存在的话,代码怎么写?
* extends在前,implement在后
* 同一个接口,调用同一个fly()方法,最后执行效果不同
* 接口通常提取的是行为动作(如:飞行)
* */
public class Test04 {
public static void main(String[] args) {
Fly p = new Pig();
p.fly();
Fly c = new Cat();
c.fly();
}
}
class Animal{
}
interface Fly{
void fly();
}
class Pig extends Animal implements Fly{
public void fly(){
System.out.println("这只猪上天了,插着翅膀");
}
}
class Cat extends Animal implements Fly{
public void fly(){
System.out.println("小猫实现fly的方法,也上天了");
}
}