JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java关键字(2)——final java关键字finally

wys521 2024-10-30 05:55:56 精选教程 21 ℃ 0 评论

final常见的知识图解

final关键字的用途

1、修饰类

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰

2、修饰方法

final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写

3、修饰变量

当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的

深入理解final关键字

1、类的final变量和普通变量有什么区别?

public class Test { 
 public static void main(String[] args) { 
 String a = "hello2"; 
 final String b = "hello"; 
 String d = "hello"; 
 String c = b + 2; 
 String e = d + 2; 
 System.out.println((a == c)); 
 System.out.println((a == e)); 
 } 
}

这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。

2、被final修饰的引用变量指向的对象内容可变吗?

public class Test { 
 public static void main(String[] args) { 
 final MyClass myClass = new MyClass(); 
 System.out.println(++myClass.i); 
 
 } 
} 
 
class MyClass { 
 public int i = 0; 
}

这段代码可以顺利编译通过并且有输出结果,输出结果为1。这说明引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。

3、final参数的问题

public class TestFinal {
 
 public static void main(String[] args){
 TestFinal testFinal = new TestFinal();
 int i = 0;
 testFinal.changeValue(i);
 System.out.println(i);
 
 }
 
 public void changeValue(final int i){
 //final参数不可改变
 //i++;
 System.out.println(i);
 }
}

因为java参数传递采用的是值传递,对于基本类型的变量,相当于直接将变量进行了拷贝。

public class TestFinal {
 
 public static void main(String[] args){
 TestFinal testFinal = new TestFinal();
 StringBuffer buffer = new StringBuffer("hello");
 testFinal.changeValue(buffer);
 System.out.println(buffer);
 
 }
 
 public void changeValue(final StringBuffer buffer){
 //final修饰引用类型的参数,不能再让其指向其他对象,但是对其所指向的内容是可以更改的。
 //buffer = new StringBuffer("hi");
 buffer.append("world");
 }
}

用final进行修饰虽不能再让buffer指向其他对象,但对于buffer指向的对象的内容是可以改变的

public class TestFinal {
 
 public static void main(String[] args){
 TestFinal testFinal = new TestFinal();
 StringBuffer buffer = new StringBuffer("hello");
 testFinal.changeValue(buffer);
 System.out.println(buffer);
 
 }
 public void changeValue(StringBuffer buffer){
 //buffer重新指向另一个对象
 buffer = new StringBuffer("hi");
 buffer.append("world");
 System.out.println(buffer);
 }
}

原因在于java采用的是值传递,对于引用变量,传递的是引用的值,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表