final关键字

 final 用于修饰成员变量、局部变量、方法(不可以是构造方法)、类

修饰成员变量:定义必须赋值或者在构造方法中赋值,后期不能修改

public class Text1 {
      final int num1=0;//直接赋值

      final int num2;//构造方法赋值

    public Text1(int num2) {
        this.num2 = num2;
    }
    /*
    num1 = 2;
    num2 = 3;重新赋值会提示错误
     */
    
}

修饰局部变量:系统不会自动赋值,在声明时可以不用赋值,但在使用局部变量时,必须赋值,赋值后,不能修改

class Text2{
    public void A(final int a){
        //a=10提示错误,不能再次赋值
    }
    public void B(){
        final String name;//name 不赋值也可以
        name = "xxx";
        //或者 : final String name = "xxx";
    }
}

修饰方法:子类不能重写

final java 可以修改吗 java中final可以修饰接口吗_赋值

注意:private修饰的方法,加上final之后,如果子类“重写”这个方法的时候相当于重新定义一个方法,因为子类根本就访问不到父类的方法。

final java 可以修改吗 java中final可以修饰接口吗_赋值_02

 修饰类:final类将不能被继承,final类中的方法自动地成为final方法,成员变量不会被final自动修饰

Java中 String类,包装类等都是final类


接口

接口定义:一种特殊的抽象类,用来定义功能,更彻底的抽象

 声明接口

//声明接口 用interface 关键字,实现接口用implements关键字
public interface MyInterface {
    //接口中所有的属性默认都是public final static
    int a=10;
    public final static int b = 30;

    //所有方法都默认为public abstract
    void eat();
    public abstract void play();

    //jdk8 之后添加默认方法, 通过子类调用
    public default void test1(){
        System.out.println("default test1");
    }

    //jdk8 之后添加静态方法, 接口可直接调用
    public static void test2(){
        System.out.println("");
    }

    /*
    java9中,接口的方法可以是private,private方法可以是静态方法或实例方法,
    只能在接口本身的方法中使用,所以用法有限,只能作为接口中其他方法的辅助方法
    */
}

java语言规范建议不要提供多余的关键字,因此接口中的属性和方法建议不添加修饰符

接口的实现

实现接口用implements关键字

当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须声明为抽象的类

实现接口时,必须把方法声明为public,否则,编译器将认为这个方法的访问属性是包可见性,这是类的默认访问属性,之后编译器就会报错,指出你试图提供更严谨的访问权限。

class AA implements MyInterface{

    @Override
    public void eat() {

    }

    @Override
    public void play() {
        
    }

}

 接口也可以继承多个接口:

public interface MyInterface extends InterfaceA,InterfaceB

 类也可以实现多个接口,当然要实现所有接口中的抽象方法,称这一特性为多继承:

class AA implements MyInterface,InterfaceC

结合使用 :

class BB extends AA implements MyInterface,InterfaceC

如果一个类继承了两个接口,其中一个类提供一个默认方法,另一个类提供了同名而且参数类型相同的方法,则该类必须重写这个方法,并不是从中选择一个,例如:

public interface interfaceA {
//提供一个默认方法
    default String color(){
        return "红色";
    }
}
public interface interfaceB {
    //也可以是 String color();
   default String color(){
       return "绿色";
   }
class Color implements interfaceA,interfaceB{
    //必须覆盖这个方法

    @Override
    public String color() {
        return "橙色";
    }
}

 注:如果两个类中都没有提供默认实现,则不存在上面冲突,实现类仍然有两种选择,要么实现这个方法,要么不实现成为抽象类。

 接口的特性

  1. 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字
  2. 接口中方法可以是抽象的(默认public abstract),静态的,默认的
  3. 接口中声明的属性默认为 public static final 的
  4. 接口不是被类继承了,而是要被类实现
  5. 接口不能实例化对象
  6.  与继承关系类似,接口与实现类之间存在多态性
  7. 一个接口能继承其它多个接口
  8. 当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须声明为抽象的类
  9. 声明接口 用interface 关键字,实现接口用implements关键字