final关键字修饰的变量为什么可以修改

图片说明我发现final关键字修饰的变量可以修改,我想知道这两个C是不是一个,如果是一个岂不是被修改了吗?不是得话又是同一个栈地址指向的,怎么回事大神

这两个a对象是不同的对象,因此a.c不是同一个变量,你给不同的变量赋值,谈不上可以不可以修改

可以修改内容,,,不可以修改指的是引用的那个地址

final修饰变量:
如果是基本类型,那么变量不能被改变,
如果是引用类型,那么是引用不能被改变,但是对象是可以变的
比如:
final StringBuilder build=new StringBuilder("hello world“);
build.apped("hello kitty");
这样是可以的
但是;
build=new StringBuilder("");
是会报错的

fianl 修饰符修改的变量如果不对其进行初始化编译器会报错的。
但是有两种情况可以不对其进行初始化,第一种情况是在静态代码块中初始化。(当然这要求成员变量也是静态的)
第二种情况是在构造方法中进行初始化。
你的情况是第二种,在构造方法中初始化,这个是Java允许的。
一旦初始化之后,普通类型变量是没法修改值的,引用类型不能修改地址。

你这个两个a都不是同一个对象哒,两个c那就更加没关系了,又不是static的,

第一个a.c的对象是new(2),第二个a.c的对象是new(3)。对象不同,所以两个c不是同一个。如果你在第一条输出语句下加一句a.c =3;就会报错的。

你可以试试
final int a = 1;
a =2
然后打印a的值

public final int c;
public A(int s ){
c= s;
}
不知道是怎么定义的,我这么写程序都报错,定义成final的变量必须给值啊