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";
}
}
修饰方法:子类不能重写
注意:private修饰的方法,加上final之后,如果子类“重写”这个方法的时候相当于重新定义一个方法,因为子类根本就访问不到父类的方法。
修饰类: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 "橙色";
}
}
注:如果两个类中都没有提供默认实现,则不存在上面冲突,实现类仍然有两种选择,要么实现这个方法,要么不实现成为抽象类。
接口的特性
- 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字
- 接口中方法可以是抽象的(默认public abstract),静态的,默认的
- 接口中声明的属性默认为 public static final 的
- 接口不是被类继承了,而是要被类实现
- 接口不能实例化对象
- 与继承关系类似,接口与实现类之间存在多态性
- 一个接口能继承其它多个接口
- 当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须声明为抽象的类
- 声明接口 用interface 关键字,实现接口用implements关键字