在1.8版本之前
接口中的常量必须复制,且接口中的方法都是抽象方法
public interface Bird {
int a; //这里会报错,因为常量必须赋值才行
int b=10;
void shout1(){} //这里报错,因为抽象方法没有方法体
void shout(); //前面有默认修饰符 public abstract
}
1.8版本中接口的新特性
可以有default修饰的方法或者static修饰的静态方法
public interface Bird {
public default void fly(){} //非抽象方法用default修饰,前面的public可以省略
public static void shout(){} //静态方法用static修饰,前面的public可以省略
}
运行一下default定义的方法
public interface Bird {
public default void shout(){
System.out.println("渣渣渣");
}
}
class RedBird implements Bird {
}
public class TEST {
public static void main(String[] args){
//Bird test =new Bird(); //编译报错,接口就算是jdk1.8也不能创建对象,接口不能被实例化。
//test.shout();
//Bird.shout(); // 编译报错。因为default方法不是静态不能用类名调用
// default就不是给你接口准备的,
RedBird redBird=new RedBird();
redBird.shout();
// 多态除了 重写的方法 是调用的子类之外, 其他的所有的东西 都是调用的父类 父类没有那就只能报错了。
Bird test = new RedBird();
test.shout();
}
}
渣渣渣 渣渣渣 Process finished with exit code 0
子类重写父类的方法 权限修饰符 必须大于等于父类的权限修饰符
public interface Bird {
default void shout(){ //default方法前面的public不写会默认添加
System.out.println("渣渣渣");
}
}
class RedBird implements Bird {
//这里会报错,的加上public 子类重写重写父类的方法 权限修饰符 必须大于等于父类的权限修饰符
void shout(){ //加上public才行
System.out.println("红鸟叫渣渣渣");
}
}
当一个类实现了多个接口,而多个接口中出现了 一样的 方法, 那么子类必须重写,谁都不用
public interface Animal {
void shout();
public default void eat(){
System.out.println("Animal吃吃吃");
}
}
public interface Bird {
void shout();
public default void eat(){
System.out.println("Bird吃吃吃");
}
}
class RedBird implements Bird,Animal {
@Override
public void shout() {
System.out.println("重写的shout");
}
@Override
public void eat(){
System.out.println("重写的eat eat eat");
}
}
public class TEST {
public static void main(String[] args){
RedBird redBird=new RedBird();
redBird.eat();
redBird.shout();
}
}
重写的eat eat eat 重写的shout
静态方法不存在重写,是谁的 就是谁的。接口中的静态方法可以直接通过接口名调用
public interface Animal {
//抽象方法
public void method();
public static void Activity(){
System.out.println("这是Animal接口的静态方法");
}
}
public interface Bird {
//抽象方法
public void method();
public static void Activity(){
System.out.println("这是Bird接口的静态方法");
}
}
class RedBird implements Bird,Animal {
@Override
public void method() {
System.out.println("这是redBird中重写的method方法");
}
public static void Activity(){
System.out.println("这是RedBird的静态方法");
}
}
public class TEST {
public static void main(String[] args){
//正常实例化
RedBird test =new RedBird();
test.method();
//向上转型
Animal animal=new RedBird();
animal.method();
//调用接口实现类(可能也算子类)RedBird中的静态方法
RedBird.Activity();
//直接调用接口Animal中定义的静态方法
Animal.Activity();
//直接调用接口Bird中定义的静态方法
Bird.Activity();
}
}
这是redBird中重写的method方法 这是redBird中重写的method方法 这是RedBird的静态方法 这是Animal接口的静态方法 这是Bird接口的静态方法 Process finished with exit code 0



