1.java中的final关键字:http://www.importnew.com/7553.html
final关键字的含义?
final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。
- final变量经常和static关键字一起使用,作为常量。final变量是只读的
- final成员变量必须在声明时初始化或者在构造器中初始化,否则会报编译错误。
- final本地变量(在方法中的或者代码块中的变量称为本地变量)必须在声明时赋值。
- 不能够对final变量再次赋值。
- final方法不可以被子类覆写
- final类不能被继承,它们通常是完整的类。java中有许多类是final的,如String,Integer以及其他包装类。
2.java中的static关键字:http://www.cnblogs.com/dolphin0520/p/3799052.html
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途
简而言之:方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
- static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。 - static变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。 - static代码块
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
在C/C++中static是可以作用于局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。
3.toArray()中参数的作用
String[] result = set.toArray(new String[0]);
- 使用无参数的toArray()有一个缺点,就是转换后的数组类型是Object[]。 虽然Object数组也不是不能用,但当你真的想用一个具体类型的数组时转化就非常麻烦。
需要用到这个String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
还是一开始就弄成String[]比较好。所以需要使用带参数的toArray. -
String[] a = collection.toArray(new String[0]);
如果指定的数组能容纳该 collection,则返回包含此 collection 元素的数组。否则,将根据指定数组的运行时类型和此 collection 的大小分配一个新数组。这里给的参数的数组长度是0,因此就会返回包含此 collection 中所有元素的数组,并且返回数组的类型与指定数组的运行时类型相同。
4. java可变参数
Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
注意:可变参数必须位于最后一项。当可变参数个数多余一个时,必将有一个不是最后一项,所以也只支持有一个可变参数。
因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。
可变参数的特点:
- 只能出现在参数列表的最后;
- ...位于变量类型和变量名之间,前后有无空格都可以;
- 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
示例代码:
public class Varable {
public static void main(String [] args){
System.out.println(add(2,3));
System.out.println(add(2,3,5));
}
public static int add(int x, int... args){
int sum=x;
for(int i=0;i<args.length;i++){
sum+=args[i];
}
return sum;
}
}
5.Arrays.asList()
public class NodeNetwork {
private List<Node> nodes;
public NodeNetwork(Node... nodes) {
this.setNodes(Arrays.asList(nodes));
}
public void setNodes(List<Node> nodes) {
this.nodes = nodes;
}
}
Node[] nodes = new Node[3];
nodes[0] = node1;
nodes[1] = node2;
nodes[2] = node3;
nnw=new NodeNetwork(nodes);
nnw.addNode(node2);
此时会报错:UnsupportedOperationException
原因:
Returns a fixed-size list backed by the specified array.
it is documented not to support any structural modification (i.e. removing or adding elements)
因为Arrays.asList()返回的是一个固定大小的列表,故无法对其进行add操作。
6.StringBuilder()
String对象是不可改变的。每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,创建新的 String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能。
7.transient 详见http://www.importnew.com/21517.html
一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
8. Scanner用法
当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。
public class TestScanner {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入字符串:");
while (true) {
String line = s.nextLine();
if (line.equals("exit")) break;
System.out.println(">>>" + line);
}
}
}
请输入字符串:
234
>>>234
wer
>>>wer
bye
>>>bye
exit
Process finished with exit code 0