java进阶路线,java进阶书籍推荐
说到最后一个关键词,很多人都很熟悉。当使用匿名内部类时,它们可能经常使用final关键字。另外,Java中的String类是final类,所以今天我们将学习关键字final的用法。
1.final关键字的基本用法在Java中,final关键字可以用来修改类、方法和变量(包括成员变量和局部变量)。下面从这三个方面来看看final关键字的基本用法。
1.1装饰类当用final装饰类时,表示该类不能被继承。也就是说,如果你永远不会让一个类被继承,你可以用final来修饰它。final类中的成员变量可以根据需要设置为final,但是需要注意的是,final类中的所有成员方法都被隐式指定为final方法。
用final来装饰一个班级的时候,要慎重选择。除非这个类将来真的不会用于继承,或者出于安全原因,否则尽量不要把这个类设计成final。
1.2修改方法以下段落摘自《Java编程思想》第四版第143页:
“使用最后一种方法有两个原因:
锁定该方法以防止任何继承的类修改其含义;第二个原因是效率。在Java实现的早期版本中,最终的方法将被内联调用。但是,如果方法太大,您可能看不到内联调用带来的任何性能改进。在最近的Java版本中,这些优化不需要使用final方法。因此,如果该方法被设置为final,只有当您希望显式禁止它在子类中被重写时。
注意:该类的私有方法被隐式指定为最终方法。
1.3修改变量修改变量是final中使用最多的地方,也是本文接下来要重点介绍的内容。首先,理解最终变量的基本语法:
对于一个final变量,如果是基本数据类型的变量,其值一旦初始化就不能更改;如果是引用类型的变量,初始化后就不能指向另一个对象。
例如:
2.深入了解final关键字2.1类中final变量与普通变量的区别?用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要在使用前初始化赋值)必须在定义时或构造函数中初始化赋值,final变量一旦初始化赋值就不能再赋值。
那么最终变量和普通变量有什么区别呢?请看下面的例子:
公共类测试{
公共静态void main(String[] args) {
String a= hello2
最终字符串b= hello
String d= hello
字符串c=b ^ 2;
字符串e=D2;
system . out . println((a==c));
system . out . println((a==e));
}
}结果:
真实的
false这就是最终变量和普通变量的区别。当最终变量是基本数据类型和字符串类型时,如果在编译期间可以知道它的确切false,编译器将把它用作编译时常数。也就是说,在使用final变量的地方,相当于直接访问的常量,不需要在运行时确定。
所以在上面的代码中,因为变量B是被final修改的,所以会被当作编译器常量来处理,所以变量B在使用的时候会被直接替换成它的值。然而,对变量D的访问需要在运行时通过链接来完成。
但需要注意的是,只有在编译时可以确切知道最终变量值的情况下,编译器才会进行这样的优化。例如,以下代码将不会被优化:
公共类测试{
公共静态void main(String[] args) {
String a= hello2
最终字符串b=get hello();
字符串c=b ^ 2;
system . out . println((a==c));
}
公共静态字符串getHello() {
回‘你好’;
}
}这段代码的输出是假的。
2.2被final修改的引用变量所指向的对象的内容是可变的吗?如上所述,final修改的引用变量一旦初始化,就不能指向其他对象,那么引用变量所指向的对象的内容是可变的吗?请看下面的例子:
公共类测试{
公共静态void main(String[] args) {
final my class my class=new my class();
system . out . println(my class . I);
}
}
MyClass类{
public int I=0;
}这段代码可以编译成功并有输出结果,输出结果为1。这说明引用变量被final修饰后,虽然不能再指向其他对象,但是它所指向的对象的内容是变量。
2.3 final和static经常混淆static和final关键字。static作用于成员变量以指示只保存一个副本,而final用于确保变量不可变。请看下面的例子:
公共类测试{
公共静态void main(String[] args) {
my class my class 1=new my class();
my class my class 2=new my class();
system . out . println(my class 1 . I);
system . out . println(my class 1 . j);
system . out . println(my class 2 . I);
system . out . println(my class 2 . j);
}
}
MyClass类{
公共final double I=math . random();
公共静态double j=math . random();
}运行这段代码,你会发现每次打印出来的两个J值是一样的,但是I的值是不一样的。从这里可以知道final和static变量的区别。
2.3为什么匿名内部类中使用的外部局部变量只能是final变量?
版权归作者所有:博主曲乐优香原创作品,转载授权请联系作者,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。