1 接口interface
1.1 概念
接口是一个纯粹的抽象类(接口里面所有的方法都是抽象方法)
接口就是一个规范(标准),他没有提供任何是实现,具体的功能由实现接口的子类去实现。
接口就是一个规范,可插拔(可以被替换,首先定义一个标准(接口),大家都遵守这个标准,就可以实现互相之间替换)
① 接口是一个纯粹的抽象类,接口里面的方法都是抽象方法:public abstract
② 接口里面所有的属性:(public static final) double PI = 3.14;
接口中的所有属性**是且总是(public static final)**,final见后面
1.2 接口理解、接口与抽象类(继承)
灯泡的接口 与 各种白炽灯钨丝灯之间的关系
计算机主板上CPU、内存插口 与 各种CPU和内存之间的关系
即接口(的具体实现)可插拔(对应不同型号的钨丝灯、各种CPU内存条),而接口不变

 如何选择接口还是抽象类
 ① 继承是严格的父子关系,你继承什么你就是什么:鸽子就是鸟。
   父类是抽取了所有子类的共同特征,父类里面的属性和方法是所有子类所共有的属性和方法。
 ② 接口是一个标准,一般用在能不能具有某个功能。
   把能不能飞定义称为一个接口IFly,实现了这个接口的类就具有了这个功能。
    //argument: 参数
    public static void main(String[] args) {
        GeZi geZi = new GeZi();
        geZi.egg();
        geZi.fly();
        geZi.gugujiao();
        //多态: 声明成父类类型,new子类对象
        AbstractBird bird = new GeZi();
        bird.egg();
        //bird是站在AbstractBird这个父类的角度去看new出来的DaYan
        //bird.fly();
        //cannot resolve method 'gugujiao' in 'AbstractBird'
        //bird.gugujiao();
        //站在能不能飞 IFLy的角度去看GeZi,只能看到fly()这个方法
        IFly fly = new GeZi();
        fly.fly();
        //Cannot resolve method 'egg' in 'IFly'
        //fly.egg();
        //fly.gugujiao();
        fly = new MiFeng();
        fly.fly();
    }
2 final
final总结:修饰变量、类、方法 final:最终的意思
① final变量:这个变量就不能被修改,就是常量 public static final double PI = 3.1415;
② final类:这个类就不能被继承
③ final方法:这个方法就不能被重写
3 static(静态属性、静态方法)
3.1 说明与理解
    非静态的属性和方法(实例属性和方法)必须通过new对象访问,而静态的属性和方法是属于类的,在类加载到内存中就可以访问,不需要new对象就可以使用,但是可以被所有对象所共享。
     小区里面业主的房子可以看成一个一个的对象,这些都是属于特定的业主所独有。但是小区里面也有一些公共设施(健身器材、绿地),这些公共设施是属于这个小区的。但是是可以被所有的业主对象所使用的。
3.2 注意点
    ① 静态的方法只能访问静态的方法和静态的属性(因为当前对象的实例可以没有创建,所以静态的方法是没办法调用非静态的方法和属性的)
     ② 静态的方法中不能写this、super关键字(因为当前的对象实例可能还没有创建,代表当前类对象的this还有代表父类对象的super可能都还没有创建)
3.3 例子
编程时我们会发现有时main方法中调用自身所在的类的其他方法时,发现无法调用,错误调用情况如下
public class Demo1{
	public static void main(String[] args){
		test();
	}
	
	public void test(){
	
	}
}
原因:main方法已经声明为静态,静态方法只能调用静态方法,无法调用非静态方法test()。非静态方法可以调用静态方法。
 解决方案:
 ① 创建一个Demo1的实例,然后通过该实例调用方法test。
public class Demo1{
	public static void main(String[] args){
		Demo1 d1 = new Demo1();
		d1.test();
	}
	
	public void test(){
	
	}
}
② 将test方法声明为静态,就是在void前面添加static。
public class Demo1{
	public static void main(String[] args){
		test();
	}
	
	public static void test(){
		
	}
}



















