Java的一些细枝末节

main函数必为void,static public修饰可以调换位置

正确的写法:

<code class="java">public class main{
    static public void main(String args[]){
        ...
    }
}

错误的写法:

<code class="java">public class main{
    void static public main(String args[]){
        ...
    }
}

main函数必带String[]参数

正确的写法:

<code class="java">public class main{
    static public void main(String messages[]){
        ...
    }
}
<code class="java">public class main{
    static public void main(String [] messages){
        ...
    }
}

错误的写法:

<code class="java">public class main{
    static public void main(String messages){
        ...
    }
}

shell执行java程序时,args[0]为第一个参数,往后递推

<code class="java">public class main{
    static public void main(String [] messages){
        System.out.pritnln(messages[0]);
    }
}

结果如下

<code class="shell">$java main hello
$hello

关于强制类型转换造成的数值溢出问题

正数补码 反码 原码相同

(byte)251=-5

251补码为00000000 00000000 00000000 11111011

应为byte占一位,去除前面24位为11111011

第一个符号位,代表为负数。负数求原码为求反+1

0000101(2)=5

结果为-5

java.awt.event.包并不属于java.awt.

也就是说要同时导入两个包

<code class="java">import java.awt.event.*;
import java.awt.*;

各种数据类型所占字节大小

一个字节=8位二进制有效数字,另外由于使用JVM,数据大小与平台无关。
– 1 byte = 1 字节
– 1 short = 2 字节
– 1 char = 2 字节
– 1 int = 4 字节
– 1 double = 8 字节

Java的两大数据类型

  • 基本数据类型
  • 引用数据类型
    基本数据类型包括:int double byte float …
    引用数据类型就是个种类,包括封装了基本数据类型的类(Integer …)

Java的模板机制

貌似是采用继承自Object的方式来间接实现模板功能,有待验证…

成员访问域

  • pulic修饰:公共成员,任意类都可以访问
  • private修饰:私有成员,只有自己可以访问
  • protected修饰:保护成员,包内的类都可以访问,包外的类只有子类能访问
  • 无修饰:包控制访问,包内的类都可以访问

关于lambda表达式

范例

<code class="java">List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));

采用lambda表达式的方式,直接将代码块当成参数使用,避免定义无用的函数。

使用接口,直接完成对ArrayList内自定类的排序

范例

<code class="java">Collections.sort(StudentList, new Comparator<Student>() {
                        @Override
                        public int compare(Student o1, Student o2) {
                            if(Integer.valueOf(o1.getMark())>Integer.valueOf(o2.getMark()))
                                return -1;
                            else if(Integer.valueOf(o1.getMark())==Integer.valueOf(o2.getMark()))
                                return 0;
                            else
                                return 1;
                        }
                    } );

关于多线程锁的使用

除了使用synchronized关键字来实现同步锁,也可以使用lock()函数达到同样的效果。