java中final关键字
/*
1、final关键字:
java 中的一个关键字,最终的,不可变的
可以修饰变量以及方法,还有类等。
1、修饰的方法,修饰的类无法被覆盖,无法被重写,无法被继承
写的方法不希望被子类修改,就加final
2、final控制不了能不能调用的问题,final修饰的表示最后的,不能变的,
不是说你加了个final,就不能调用(父类中final是不能覆盖修改的,但是可以调用,子类中用final无意义,)
而是说你不想这个方法被修改
一句话概括:final修饰的方法不能被修改,可以被调用
3、final修饰的变量:
final int i = 100;
i = 200;
错误: 无法为最终变量i分配值
说明一旦用final 修饰变量,
则是程序员不希望,final重新赋值,
一句话概括:final修饰的变量只能赋一次值
b类继承A类,想当于对A类的功能进行拓展,
如果不希望别人对A类进行拓展
可以给A类添加final关键字,这样A类就无法继承。
H:\Java\Javajdk\bin
调用子类特有的方法是,要想下转型
A a = new B();
if( a instanceof B){
B b = (B) a;
b.teyoufangfa();
}
*/
class A{
public final void sum(int a,int b){
int c = a +b;
System.out.println("final修饰方法,进行求和:"+ a + "+ " + b + "=" + c);
}
public static void main(String[] args){
//final int i = 100;
// i = 200;
A c = new A();
int a = 100;
int b = 200;
c.sum(a,b);
B d = new B();
d.sum(a,b);
}
}
class B extends A{
}
=======================================================
/*
final 修饰的变量,如果这个变量是一个“引用”会怎样?
”引用“是不是一个变量呢? 是的
错误: 无法为最终变量p2分配值
final修饰的引用:
该引用只能指向一个对象,
并且他只能永远指向该对象,无法再指向其他对象
并且在该方法执行过程中,该引用指向对象之后,
不会被垃圾回收器回收
直到当前方法结束,才会释放空间
局部变量没有初始值,只能手动赋值,成员变量有初始值
*/
public class FinalTest02{
public static void main(String[] args){
Person p1 = new Person(12);
System.out.println(p1.age);
//代码怎么变化,p 也是一个变量(不过这里他叫引用)
final Person p2 = new Person(20);
p2.age = 40;
//这样是可以的,因为并没有指向其他对象,可以修改内部的数据
/*p2.Person(40);
错误: 找不到符号
p2.Person(40);
注意:构造方法不能用对象调用
构造方法直接new Person(123)的时候用
*/
//p2 = new Person(20);
//错误: 无法为最终变量p2分配值
}
}
class Person{
int age;
public Person(int age){
this.age = age;
}
}
=================================================
/*
final修饰的实例变量呢?
万变不离其宗,final修饰的变量只能赋值一次
实例变量如果没有手动赋值的话,系统会赋默认值
但实例变量的话,必须手动赋值
不赋值的话:
final int age;
age 未在默认构造器中初始化
*/
public class FinalTest03{
public static void main(String[] args){
}
}
class User {
final int age = 12;
final int he;
public User(){
//只要赶在系统赋默认值之前赋值就行
this.he = 180;
//系统什么时候赋默认值???
//系统赋默认值是这个时候
(是在执行系统默认的无参构造方法的时候进行赋值),
并不是说声明 int a 的时候赋值
// he = 0;
}
//这样也可以
}
=====================================================
/*
实例变量的缺点:
实例变量在堆中,一个对象一份,声明一百个,
每次为这个实例变量开一个空间,它本身又不能变,浪费内存
既然实例变量用final修饰,说明该实例变量的值不会随着对象的变化而变化
final修饰的实例变量,一般用static修饰,存储在方法区,节省内存
结论:static final 联合修饰的变量称为“常量”
常量名建议全部大写,每个单词间用下划线衔接
```j
常量:实际上和静态变量一样,区别:常量的值不能变
常量和静态变量都储存在方法区,都是在类加载时初始化
常量一般是公开的:public的,因为改不了
*/
public class FinalTest04{
public static void main(String[] args){
}
}
class Chinese{
public static final String COUNTRY = "中国";
}
/*
总结:
final 修饰的类无法继承
final 修饰的方法无法覆盖
final 修饰的变量只能赋一次值
final 修饰的引用一旦指向某个对象,则不能再重新指向其他对象,
但该引用指向的对象内部的数据可以更改
final 修饰的实例变量不能被系统默认赋值,只能手动赋值
final 修饰的实例变量一般和static联合,称为常量
*/
ACAC java中final关键字
最新推荐文章于 2022-07-07 16:10:22 发布