当前位置: 技术问答>java相关
请问声明一个对象时final修饰符有何用?
来源: 互联网 发布时间:2015-04-01
本文导语: 以下一个极简单的Swing程序,在final JLabel label = new JLabel("Hello World");中final是做什么用的?为什么frame对象没有final? //v 1.3 import javax.swing.*; public class HelloWorldSwing { public static void main(String[] args) { ...
以下一个极简单的Swing程序,在final JLabel label = new JLabel("Hello World");中final是做什么用的?为什么frame对象没有final?
//v 1.3
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
final JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
//v 1.3
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
final JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
|
final是阻止任何类继承这个类,或是一个方法不能被覆盖
|
final表示该类不能再被继承,在不需要有子类的情况下用final来定义类,这样可以使程序的运行效率更高,而且也更安全。在这儿,如果你想把frame也定义为final也未尝不可
|
因为作者可能不希望label对象被更改,所以将其前面使用final修饰符。
凡是前面有了final修饰符后,该对象或变量将不能更改
对变量使用final,类似于c++里面的const变量
对对象使用final后,你只能改变此对象属性,而不能其指向其它对象
凡是前面有了final修饰符后,该对象或变量将不能更改
对变量使用final,类似于c++里面的const变量
对对象使用final后,你只能改变此对象属性,而不能其指向其它对象
|
看看这个,你会对 java 中的 final 修饰更加理解的,因此有些时候,对有些情况应多一些小心:
主题:JAVA中的常量
作者:cstiger 时间:2001-10-18 13:11:25
最近遇到一个问题,花了不少时间才解决,原因很简单,先贴出来,请大家参考指正。
1。先看两个程序:
//+------------------
| A.java
//+------------------
public class A {
public final static String NAME = "A";
public final static String getName() {return NAME;}
}
// end of A.java
//+------------------
| B.java
//+------------------
public class B {
public static void main(String arg[]) {
System.out.println(A.NAME);
System.out.println(A.getName());
}
}
// end of B.java
2。编译两个程序,得到A.class和B.class
3。执行java -classpath . B
A
A
4。修改A.java,将"A"改为"a":
//+------------------
| A.java
//+------------------
public class A {
public final static String NAME = "a";
public final static String getName() {return NAME;}
}
// end of A.java
5。执行java -classpath . B
A
a
以上流程说明java中的常量是编译时直接连接到执行代码中的,而不是想象中在运行时确定的。
主题:JAVA中的常量
作者:cstiger 时间:2001-10-18 13:11:25
最近遇到一个问题,花了不少时间才解决,原因很简单,先贴出来,请大家参考指正。
1。先看两个程序:
//+------------------
| A.java
//+------------------
public class A {
public final static String NAME = "A";
public final static String getName() {return NAME;}
}
// end of A.java
//+------------------
| B.java
//+------------------
public class B {
public static void main(String arg[]) {
System.out.println(A.NAME);
System.out.println(A.getName());
}
}
// end of B.java
2。编译两个程序,得到A.class和B.class
3。执行java -classpath . B
A
A
4。修改A.java,将"A"改为"a":
//+------------------
| A.java
//+------------------
public class A {
public final static String NAME = "a";
public final static String getName() {return NAME;}
}
// end of A.java
5。执行java -classpath . B
A
a
以上流程说明java中的常量是编译时直接连接到执行代码中的,而不是想象中在运行时确定的。
|
对于“top-level Type"(class/interfacs)来说:
final只能用来修饰class, 表明这个类不能被继承
对于“nested Type"(method/field/nested-class/nested-interfacs)来说:
final method表明不能被override,因此,尽量把不会被override
的方法声明为final,可以加快速度,condensity软件采用这个
作为一种优化Java class的手段
final field表明不能在构造器中被再赋值/不能在其他地方被赋值
final nested-class表明不能被继承
final只能用来修饰class, 表明这个类不能被继承
对于“nested Type"(method/field/nested-class/nested-interfacs)来说:
final method表明不能被override,因此,尽量把不会被override
的方法声明为final,可以加快速度,condensity软件采用这个
作为一种优化Java class的手段
final field表明不能在构造器中被再赋值/不能在其他地方被赋值
final nested-class表明不能被继承
|
这种变量只允许赋值一次
|
不能更改,可理解为C中的const