1.所有标识符的首字符只能是字母、美元夫或者下划线,首字符以后可以是字母、美元符、下划线或者数字的任意组合。
2.byte是8位有符号数,short是16位有符号数,char是16位无符号数,char能存储任何字符
3.Java的异常分为受检异常和非受检异常两类,非受检异常包括RuntimeException及其子类、error及其子类;受检异常指除了非受检异常之外的异常。由此,我们可以知道error也是一种异常。所以,所有异常的父类的Throwable,而不是Exception。
4.Java接口中声明的变量默认都是final的。假设接口的成员变量x不是final的,且默认有值。那如果我们在某接口的实现类A中把x改为其它值,那么另一个实现类B中对x有依赖的方法全都出错了,那这样的接口就不能起到“模板”的作用了。
5.集合框架包括三大块内容:对外的接口、接口的实现和对集合运算的算法。 1)接口:表示集合的抽象数据类型。接口提供了让我们对集合中所表示的内容进行单独操作的可能(接口表示的是类的能力)(比如Collections,Set,List,Map这四个都是接口) 2)实现:也就是集合框架中接口的具体实现类。实际它们就是那些可复用的数据接口。 比如,声明一个ArrayList实例:
List mylist=new ArrayList();6.Float、Short、Long、Byte、Double、Boolean是类,它们和对应的基本数据类型的关键字的区别仅仅是首字母大小写不同
7.任何Java源文件都属于某个包。如果没有package语句,那么该源程序会被放在默认包下(默认包是指如果未在类中包含一条包语句时系统默认给出的包)
8.抛出NullPointerException只可能发生于访问值为 null的对象 的方法或属性
9.重载调用的决定取决于编译时的类型。如果有多个条件满足,将会选择继承树中深度最深的类型,继承数是类似下面这样的结构:这时候机动车的深度就比车辆的深度要大 比如如果有两个重载过的方法:fun(Object o),fun(String s),那么运行fun(null)时,由于String比Object更具体,所以会调用fun(String s)方法。
10.switch能够接受的类型的值是整型数及其包装类(byte、char、int、long),enum,String。
11.对于参数为变长参数的函数,比如fun(String… ss ),有以下两种调用需要注意一下: 1)fun(null)这种调用得到的参数列表为空 2)fun(),这种调用得到的参数列表非空,长度为0 如果是fun(String[] ss),不能用fun()来调用。
12.Java的保留字指现有Java版本尚未使用,但以后版本可能会作为关键字使用:byValue,cast,false,future,generic,inner,operator,outer,rest,true,var,goto,const,null
13.反正在构造函数里调用自己的构造函数时不能用类名来调用就是了。
14.接口可以继承接口(extends),但是不能实现接口(implements)。接口只能被接口继承,但是可以被抽象类和普通类实现。
15.在方法中声明变量,但是没有赋初值不会产生编译错误,只有你要去调用这个没有赋初值的变量时才会产生编译错误。如:
16.String是不可变类型。我们来看一下下面这个代码片段:
// Test.java public class Test { public static void main(String[] args) { String a = "a";//此时a指针指向的是“a”这块内存 String b = a;//此时b指针指向的也是“a”这块内存 a += "b";//此时a指针就指向了"ab"这块内存 System.out.print(b);//上面没有改变b指针的指向,所以最终输出仍是a } }最终的输出是a。
17.直接用System.out.println(null)会报错,因为null和char[],String两个类型都匹配,编译器无法搞清楚。我们来看看下面两种方式:
String s=null; System.out.println(s);运行结果是输出null。
char[] s=null; System.out.println(s);运行会出错:
18.类装载的工作清单: 1)加载class文件 2)为static属性分配空间并全部设置默认值 3)装载父类(前提是该类有父类且父类还没有被装载过) 4)进行类初始化
19.对象构造的工作清单: 然后我们来看一下下面的代码:
class A { int n = 1; A() { System.out.println(this.n); System.out.println(sfun(this.fun())); } public int fun() {return this.n; } static int sfun(int num) { return num; } } class B extends A { int n = 10; B() {} public int fun() { return this.n; } static int sfun(int num) { return -num; } } public class Test { public static void main(String[] args) { new B(); } } //最终的输出是第一行为1,第二行为0B 类的构造器没有任何代码,所以我们直接去看A类的构造器。A类的构造器里调用了两个函数,一个属性,众所周知,属性无法体现多态,所以第一行的this.n取的是A.n=1;然后我们看this.fun(),它是非静态方法,可以体现多态,所以调用的是B类的方法,返回B类的n,此时n只是被赋了默认值,所以返回0。然后到了外层sfun方法,它是静态方法,没有多态,所以调用的也是A类的方法,所以返回0.涉及到这些子类套父类,父类套子类的就看能不能体现多态,能体现的(非静态方法)用的就是子类,不能体现的(属性,静态方法和私有方法)用的就是父类
// Test.java class A { static { System.out.print("A"); } } class A1 extends A { static { System.out.print("1"); } } class A2 extends A { static { System.out.print("2"); } } class B { static { System.out.print("B"); } static public A a; static A2 getA2() { return new A2(); } static { System.out.print("B"); } } public class Test { public static void main(String[] args) { if(B.a == null) { B.a = new A1(); } else { B.a = B.getA2(); } } }上面这段代码的输出是BBA1。为什么我当时没有想到呢?因为我把B类的最后一个静态代码块给忘了。看类的组成的时候,要从第一个大括号一直看到最后一个大括号。
21.这次期中考主要的错误点在于: 1)初始化的顺序 2)对类的组成认识不清晰(静态代码块,非静态代码块,静态方法,非静态方法) 3)需要选错误选项却选了正确的项
22.提一下命令行参数在Java和C中的不同。Java中的命令行参数用数组args存,args[0]存的是第一个参数;C中命令行参数用数组argv存,argv[0]存的是程序的名称。例子:
//java public class Main { public static void main(String[] args) { System.out.println("args[0]="+args[0]); } }运行截图:
// C++/C #include<iostream> #include<cstdio> int main(int argc,char* argv[]) { printf("argv[0]=%s",argv[0]); }