在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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)