接口的成员特点
程序引例
/*
接口成员的特点:
成员变量:
只能是常量,并且是静态的
它里面给成员变量的默认修饰符是public static final
建议:手动全部补齐
构造方法:
接口中没有构造方法
成员方法:
接口中的成员方法只能是抽象方法,没有方法体,连大括号都没有
它会自动补充修饰符:public abstract
建议:手动全部补齐
*/
interface Inter{ //➡ abstract interface Inter{,当定义完成员方法fun()后从反编译工具中看出加上了abstract
//先在接口中定义一个成员变量a
int a = 10; //➡public static final int a = 10;
//在这里我们看到的定义a的格式是成员变量啊,为什么不能改变a的值呢?
//因为接口中默认只能是静态的常量
//它里面给成员变量的默认修饰符是public static final
public static final int b = 20;
//接口中没有构造方法
// Inter(){}
// Error:接口抽象方法不能带有主体
// public void fun(){
// System.out.println("玩游戏");
// }
//接口中的成员方法只能是抽象方法,没有方法体,连大括号都没有
public void fun();//它会自动补充修饰符➡public abstract void fun();
//并且在反编译工具中看出不仅fun()方法中加了abstract关键字,连接口定义中都加了,
//哪个先加的呢?是fun()上先加的,然后因为有抽象方法的类必须是抽象类,所以上面
//接口的定义格式中会加上abstract。(接口不是类,这边为了方便理解这样写)
}
//接口只能被实现,不能被继承
//class Demo1 extends Inter{} ×
//虽然接口中没有构造方法,但是多态初始化的时候要先初始化父类再初始化子类
//这里其实继承了一个父类
//java中所有的类都默认继承一个类:Object
//每一个class都有Object作为超类
//那么所有继承Object类的实现对象都实现了这个类中的方法
class Demo1 implements Inter{//➡class Demo1 extends Object implements Inter{
@Override
public void fun() {
System.out.println("玩游戏2");
}
}
public class InterfaceDemo2 {
public static void main(String[] args) {
Inter i = new Demo1();
//我用Demo1类去实现接口Inter,那么我可以通过i去调用a的值吗?
// 当然可以,那么我又想了能不能去改变a的值?
System.out.println(i.a);
//Error无法为最终变量a分配值,不能改变a的值,会报错。
//这和final关键字的情况很像。为什么呢?
// i.a = 100;
//因为接口中默认只能是静态的常量,所以我可以直接通过接口名调用a
// System.out.println(Inter.a);
}
}