在java关键字的详细解决方案
说到最后的关键词,这是必要的,很多人都不熟悉的匿名内部类的使用final关键字。此外,在java字符串类是最后一班,今天我们会找出最终的关键词的使用。主要介绍:A.最后keyword.two的基本用法。对最终关键字的深刻理解
最后关键字的基本用法
在java中,关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。从这三个方面来理解关键字的基本用法。
1。改性剂
当一个类进行了最后的修改时,结果表明该类不能被继承,也就是说,如果一个类永远不能继承,可以用最终的方法修改它。最后一个类中的成员变量可以按需要设置为最终,但是必须指出,最后类中的所有成员方法都隐式地指定为最终方法。
当你使用最终修改类时,你应该注意仔细的选择。除非在将来真正使用这个类,否则出于安全考虑,请不要将类设计为最后类。
2。改性的方法
下面的段落是从java编程思想第四版
在最终的使用方法有两个原因。第一个原因是锁定的方法在任何情况下继承类修改它的意义;二是效率。在早期的java实现的版本,最后的方法将变成嵌入式的电话。然而,如果方法太大了,它不可能可以看到任何性能增强嵌入式调用引起的。在最近的java版本,你不需要使用最后的方法,这些优化。
因此,只有在显式禁止子类中包含方法的情况下,该方法才被设置为最终方法。
注意:该类的私有方法隐式指定为最终方法。
三.改进的变
修改后的变量是最终使用的最重要的地方,也是本文的重点:
对于最后一个变量,如果它是基本数据类型的变量,它的值在初始化后不能更改。如果它是一个引用类型变量,它在初始化后不能指向另一个对象。
例如:
U3000 U3000
在一段上面的代码中,变量i的对象是错误的调动。
两。对最终关键字的深刻理解
在理解了最终关键字的基本用法之后,我们看看最终关键字容易混淆在哪里。
1者之间有什么区别。最终变量的类型和普通变量
当使用最终的功能的类的成员变量和成员变量(注意,是类的成员变量,局部变量只需要确保分配可以使用前初始化)必须在构造函数或赋值初始化定义,和最终的变量初始化一次分配不能被分配。
那么,最终变量和普通变量之间有什么区别呢下面是一个例子:
公共类测试{
public static void main(String { } args){
字符串=hello2;
最终字符串hello;
字符串;
字符串C = B+ + 2;
字符串E = d + 2;
System.out.println((= = C));
System.out.println((= = E));
}
}
真正的
假
你可以想想这个问题的第一个输出。为什么第一比较结果是真实的,和第二比较结果是假。
这是最终变量和普通变量的区别。当最后一个变量是基本数据类型和字符串类型,如果编译器可以知道其确切的值在编译时,编译器将在编译期常数使用。也就是说,在最后的变量被使用,它相当于这个常数,这是直接访问,而不需要在运行时确定的。这有点像C语言中的宏替换。
因此,在上面的代码中,由于变量B是由最终修改的,所以它将被认为是一个编译器常量,所以当它被用于B时,它将直接用它的值替换B。
差异必须被理解,但我们必须注意,只有当我们知道编译过程中最终的值时,编译器才能进行这种优化,例如,以下代码不会被优化。
公共类测试{
public static void main(String { } args){
字符串=hello2;
最终的字符串B = gethello();
字符串C = B+ + 2;
System.out.println((= = C));
}
字符串gethello(){
返回hello;
}
}
此代码的输出是false。
2。由最终修改的引用变量指示的对象内容是什么
如上所述,一旦由最终修改的引用变量在初始化赋值之后不能指向另一个对象,则是引用变量变量的内容吗请看下面的例子:
公共类测试{
public static void main(String { } args){
最终MyClass myClass =新MyClass();
System.out.println(+ +我的我);
}
}
类{
公共int i=0;
}
代码可以编译并顺利通过,输出结果为1,这表明引用变量是由最终修改的,尽管它不能再指向其他对象,但是它指向的对象的内容是可变的。
3.final静态
很多时候很容易混淆静态关键字和最终关键字。static作用于成员变量,表示只有一个副本被保存,而最后一个用于确保变量是不可变的:
公共类测试{
public static void main(String { } args){
我myclass1 =新MyClass();
我myclass2 =新MyClass();
System.out.println(myclass1。我);
System.out.println(myclass1。J);
System.out.println(myclass2。我);
System.out.println(myclass2。J);
}
}
类{
公共最终双I = Math.random();
公共静态双J = Math.random();
}
运行这个代码会发现两个j值每次都是一样的,而i的值是不同的,从这里你可以看到最终变量和静态变量的区别。
为什么在4中使用外部本地变量。匿名内部类只有最后变量吗
请看最后一条的解释,java内部类的细节
5。关于最终参数问题
至于在线传播,当您不需要将对象变量作为方法中的参数更改时,使用最终显式声明是不合适的,这将防止您无意地修改和影响调用方法之外的变量。
因为参数是基本数据类型的变量或引用类型的变量,所以使用最终声明不会达到上述效果。
这个例子很清楚:
代码的上面部分似乎让人觉得变量i的值不可改变的方法最终改性后。不知道,我在变changevalue和主要方法,根本不是一个变量,因为java的参数传递是值传递。对于基本类型变量,它相当于直接复制变量。因此,即使没有最后的修改,更改方法中变量i的值也不会影响方法之外的i。
请看下面的代码。
公共类测试{
public static void main(String { } args){
MyClass myClass =新MyClass();
StringBuffer StringBuffer(缓冲=新你好);
MyClass.changeValue (buffer);
(buffer.tostring System.out.println());
}
}
类{
无效changevalue(最终StringBuffer缓冲){
buffer.append(世界);
}
}
运行此代码会发现输出HelloWorld。显然,最终的修改不阻止,缓冲点在changevalue对象的内容。
有人说,如果最终被删除,如果缓冲点在changevalue其他对象。这有什么想法的朋友可以自己写代码来尝试这样一个结果,如果最终被删除,然后在changevalue让缓冲区的其他对象,它不会影响缓冲区的主要方法,原因是java是用来传递价值,引用变量,传递引用是说,让变量和参数同时指向同一个对象,所以参数重新定向到另一个对象和参数没有影响。
以上内容是java中的关键字的详细的解答,希望对你有帮助。