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

通常使用java 的接口时都是不带修饰符的

public interface Test {
  int a = 0;
  void test();
}

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

正确的类型应该是:

public interface Test {
  public static final int a = 0;
  public void 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接口的功能还是需要在使用中慢慢理解,掌握其中微妙的变化带来的不同功能。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值