问题:
一、简述 fianl 作用
二、为什么局部内部类和匿名内部类只能访问局部final变量?
解答:
一、简述 fianl 作用
答案:
final 在Java中可以用来修饰类、修饰方法、修饰变量。
如果修饰类,表示类不可被继承。
如果修饰方法,表示方法不可被子类覆盖。但是可以重载。
如果修饰变量,要分成基础数据类型和引用类型数据。
基础数据类型: 数值一旦初始化后,不可更改。
引用类型数据:初始化后便不能指向另一个对象。但是引用的值可以变。
引用型:
final int[] arr={1,2,3,4};
arr[2]=-3; // 合法
arr == null; // 非法,arr不能重新赋值。
再如,
final Person p = new Person(25); // 给p 设置 age = 25
p.setAge(24); //合法
p = null; // 非法
二、为什么局部内部类和匿名内部类只能访问局部final变量?
解答这个问题,首先需要明白什么是 内部类和外部类。(在最下面,一会解释)
答案:
首先,内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法执行完毕就被销毁。
方法执行时,局部变量复制了一份作为内部类的成员变量,当局部变量死亡后,内部类仍然可以访问它。
将局部变量复制为内部类的成员变量时,必须保证变量一样,就将局部变量设置为final,初始化就不允许修改这个变量了。
内部类和外部类(作为扩展内容)
外部类访问内部类
在外部类的main方法中创建了外部类的对象,并通过它创建了内部类的对象,并调用了内部类的方法,这里我们观察调用时,age变量的变化
public class People {
private String name;
private int age=20;
private int ID ;
public static void main(String[] args){
// 创建一个外部类对象 People
People p = new People();
// 通过外部类对象 People ,创建了内部类的对象 Student
People.Student s = p.new Student();
// 调用 内部类的方法
s.study();
}
class Student {
private String name;
private int age=18;
private int studentNumber;
public void study(){
System.out.println("输出age"+age);
System.out.println("内部类变量"+this.age);
System.out.println("外部类变量"+People.this.age);
// 输出age18、内部类变量18、外部类变量20
}
}
局部内部类
public class People {
private String name;
private int age=20;
private int ID ;
public static void main(String[] args){
People p = new People();
// 局部内部类
class Student {
private String name;
private int age=18;
private int studentNumber;
public void study(){
System.out.println("输出age"+age);
System.out.println("内部类变量"+this.age);
System.out.println("外部类变量"+p.age);
}
}
new Student().study();
}
}
匿名内部类
abstract class People {
private String name;
private int age=20;
private int ID ;
public abstract void work();
}
public class Test{
public static void main(String[] args){
Test t = new Test();
// test 里 创建一个 匿名内部类,调用 work 方法
t.test(new People(){
public void work(){
System.out.println("我在工作");
}
});
}
public void test(People people){
people.work();
}
}