java 接口中用private、protected、public、default和status修饰方法和变量

来源:互联网 发布:淘宝网的盈利模式答案 编辑:程序博客网 时间:2024/05/20 10:56
通常使用java 的接口时都是不带修饰符的
public interface Test {  int a = 0;  void test();}

其实这个里面有好多修饰符都是默认省略掉了。

正确的类型应该是:

public interface Test {  public static final int a = 0;  public void test();}
省略的都是默认必须要带的修饰。

接口中除了这几个常见的方法和属性外还有一些其他用法。

1、静态方法

静态方法必须要有方法体,并且静态方法是不能被实现类实现的,只能通过接口调用这个方法,例如:Test.test2();

public interface Test {  public static final int a = 0;  public void test();  public static void test2(){  //正确的      }    public static void test3();//错误的}

2、java1.8  default修饰方法

default加入就是为了解决接口中不能有默认方法的问题,在实现类中可以重写这个default方法也可以不重写。

default修饰的方法跟接口中的静态方法区别是default方法可以被实现类重写,这样可以得到扩展并且不修改原来接口中功能,而静态方法就有点太苛刻了,还不如把静态方法写在实现类中,这样每个实现类都可以自己写自己的功能实现。

public interface Test {  public static final int a = 0;  public void test();  public static void test2(){    System.out.println("test2");  }  default void test3(){  }  default void test4();//错误,default修饰方法必须要有实现体}

3、错误情况

在接口中方法都是不能用private和protected修饰的,这两种修饰就违背了面向对象的原则。

private好理解,接口是需要被实现才有意义的,不能被实现也就没有意义了。

protected需要理解面向对象的概念,protected是不在一个包内不能被访问,所以在类和接口不在同一个包内时就会有问题。

假设public接口I有一个protected方法M,那么位于其他包的public类C就可以实现这个接口(方法M依然是protected)。那么C的同包类D调用方法M只能这样访问:

C c = new C();c.M();
无法这样访问:
I c = new C();c.M();

这样就失去了使用接口的重要意义:提供统一的接口,面向接口编程思想也无法体现。

4、为什么接口中的属性必须是public static final 修饰的

public跟方法的原因一样了

static:我们假设有两个接口A和B,而类C实现了接口A和B。假设,此时,A和B中都有一个变量N,如果N不是static类型的,那么在C中该如何区分N到底是A的还是B的呢?而,如果是static类型的,我们可以通过A.N和B.N来区别调用A或者B中的成员变量N。

final:接口是一种通用的协议存在的,多个类实现同一个接口可以方便针对这个接口的调用类对接,所以final就是为了禁止在接口中不同的实现类修改属性造成混乱。如果变量不是final,那么每个实现接口的类就可以更改这个变量的值,也就违反了OCP(开闭原则)原则。

对于java接口的功能还是需要在使用中慢慢理解,掌握其中微妙的变化带来的不同功能。

阅读全文
0 0
原创粉丝点击