- 修饰类:表示类不可以被继承
- 修饰方法:表示方法不可以被子类重写(即不可扩展),但可以在类内重载
- 修饰变量:表示变量一旦被赋值,就不可以更改它的值
1、修饰成员变量
(1)修饰类成员变量
在声明时就需要被赋值,或者静态代码块赋值。
(2)修饰成员变量
在声明时就需要被赋值,或者代码块赋值,或者构造器赋值。
2、修饰局部变量
fianl修饰局部变量,不赋值不会报错,但使用前一定要赋值。
public class FianlVar {
//final修饰类成员变量
final static int a=0;//在声明时就需要被赋值,或者静态代码块赋值
/**
static{
int a= 0;
}
*/
//final修饰成员变量
final int b = 0;//在声明时就需要被赋值,或者代码块赋值,或者构造器赋值
/**
{
b = 0;
}
*/
public static void main(String[] args) {
final int c;//fianl修饰局部变量,不赋值不会报错
c=0;//但使用前一定要赋值
System.out.println(c);
}
}
3、final修饰基本数据类型变量
在对final修饰的基本数据类型变量赋值之后,这个值就不可以再改变了。
4、final修饰引用类型变量
在初始化后不能让其指向另一个对象,但引用的值是可以改变的。(就是这个变量名不可以再直接用=号了,使用了就都不合法)
public class FianlReference {
public static void main(String[] args) {
final String aString = "jmm";
//aString = "hhh";//不合法
final int arr[] = {1,2,3};
arr[2]=3;
//arr = null;//不合法
//可以更改其属性和方法
final Father father = new Father("面包");
father.setFood("汉堡包");//合法
father=null//非法
}
}
为什么局部内部类和匿名内部类只能访问局部fianl变量
局部内部类:定义在方法中的内部类。
匿名内部类:它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类。
//匿名内部类代码示例
public class HelloWorldAnonymousClasses {
/**
* 包含两个方法的HelloWorld接口
*/
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
public void sayHello() {
// 1、局部类EnglishGreeting实现了HelloWorld接口
class EnglishGreeting implements HelloWorld {
String name = "world";
public void greet() {
greetSomeone("world");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hello " + name);
}
}
//生成对象
HelloWorld englishGreeting = new EnglishGreeting();
// 2、匿名类实现HelloWorld接口,直接创建对象
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
// 3、匿名类实现HelloWorld接口
HelloWorld spanishGreeting = new HelloWorld() {
String name = "mundo";
public void greet() {
greetSomeone("mundo");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hola, " + name);
}
};
englishGreeting.greet();
frenchGreeting.greetSomeone("Fred");
spanishGreeting.greet();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
首先需要知道一点:内部类和外部类是同级文件,都会生成class文件,内部类是不会因为外部方法执行完了就被回收的。
所以当外部类的方法结束之后,局部变量就要被销毁,但是有的时候内部类引用外部方法的变量,所以为了保证内部类正常继续运行,外部方法的变量会拷贝一份给内部类,但是为了保证内外变量值一直,不会出现内外值不一致的情况,只能将需要引用的外部参数用final修饰,这也是一种妥协。
class outclass{
private int age =13;
public void outprint(final int x) {
class InClass{
public void name() {
System.out.println(x);
System.out.println(age);
}
}
new InClass().name();
}
}