final修饰符,意为最终的,无法修改的,一旦一个变量被final修饰,那么它将无法再被赋值,一个方法被final修饰,它将无法被重写。例如:
public class Truck extends Car { public final int v1=0; @Override public void Speedup() { System.out.println("卡车加速"); v1=100; } }
在将速度v1用final修饰后,在加速方法中我们想给速度v1再次赋值,会发现系统报错,显示无法给被final修饰的变量v1赋值,显然被final修饰的变量此时已经相当于一个常量了。
public class Truck extends Car { @Override public void Speedup() { final int v1=0; System.out.println("卡车加速"); v1=100; } }
连局部变量被final修饰后也无法再赋值
public class Car { public final void Speedup(){ System.out.println("车子加速"); } }
public class Truck extends Car { @Override public void Speedup() { System.out.println("卡车加速"); } }
此时,在子类Truck中报错。显示被final修饰的父类Car中的方法不能被重写。
但当我们用final修饰引用变量时,又会发生不同的情况。
public class Test { public static void main(String[] args) { final Truck t=new Truck(); t.v1=100; System.out.println(t.v1); t=new Truck(); } }
此时我们可以给引用变量t的速度赋值,并且输出新的数值,这是因为final修饰的是引用变量t的地址,t里面储存的属性v1并没有被final修饰,可以被重新赋值。
由此,我们可知,被final修饰的方法不能被重写,成员变量和局部变量也无法被赋值,它修饰的引用类型的地址也不能改变,但是地址里储存的内容可以修改。
接口是一种公共的规范,只要符合了规范,就能实现通用。
接口用关键字interface修饰,定义接口的格式如下:
public interf 接口名{};
类调用接口用implement修饰,调用接口的格式如下:
public class 类名 implement 接口名{}
public interface Speedup {//定义一个接口Speedup public abstract void speedup(); }
public class Car implements Speedup {//创建一个子类Car调用Speedup接口 @Override public void speedup() { System.out.println("汽车加速!"); } }
public class Train implements Speedup{//创建一个子类Train调用Speedup接口 @Override public void speedup() { System.out.println("火车加速!"); } }
public class Test { public static void main(String[] args) { Car c=new Car(); c.speedup(); Car c1=new Train(); c1.speedup(); } }
另外,在接口中如果定义了变量,会发现在Test测试类中无法再次为它们赋值:
public class Car implements Speedup{ }
public interface Speedup { int speed=40; int time=5; }
public class Test { public static void main(String[] args) { Car c=new Car(); System.out.println(c.speed); System.out.println(c.time); c.speed=30; } }
我们可以看到系统提示这是一个被final修饰的变量,他是无法被再次赋值的,也就是说在接口中定义的其实都是常量,它们的完全写法应该是public static final int speed=40;
接口中也不能存在构造方法,跟默认值存在常量一样,只能存在抽象方法。