|
楼主 |
发表于 2003-10-12 11:58:09
|
显示全部楼层
Java认证之精屁总结
1.switch(?)里面只能是short,int,char,byte的.
2.if (a="a") 编译错, //赋值运算
if(a=false)编译ok,原因是a=false的a代表了个boolean值
3.这种写法Outer.Inner i = new Outer().new Inner(); OK!
4.文件里, 8默认是int, 8.0默认是double
5.八进制是0开头,不是O(英文o)
6.byte -128~127 ,-128是二进制的多少?
7. -1>>32还是-1, -1>>>32为什么还是-1?
8.char c=´c´; String s ="s"; s+=c;结果是 sc!!!
9.boolean b1=true; boolean b2=true; System.out.println(b1|b2); 结果是true.编译没错!
10.java的默认import包有哪些??????? java.lang.*
类和对象(Class and Object)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0.最外层的类可以声明成final: "$file a":<final class a{}>,但是不能是private、protected和static的.
1.overload是同类里同样的方法名、参数类型、顺序或个数不同,override是父子的继承
2.override的返回结果必须一样,否则编译错哦
override的modifier可以扩大,但是不能缩小。比如父类private void test(){} 子类:public void test(){} ,没问题;如果反了,就死翘翘了!
override抛出的异常只能是父类抛出异常的子类,或不抛出异常
3.super.super(),靠,错的,没这么写的。调用方法可以用super.method(),但不能用super.super.method()
4.static和非static之间永远无法override!
5.看程序
class A{
void test1(){hi();}
void hi(){System.out.println("say hi,a");}
}
class AA extends A{
void hi(){System.out.println("say hi,aa");}
}
public class test{
public static void main(String b[]) throws Exception{
A a = new AA();
a.test1();
}
}
结果是,"say hi,aa",这说明什么?说明,方法永远跟着类的原来面目走;而,变量恰恰相反!
若两个hi()都声明为static,则输出“say hi, a”,因为static方法不能overrided,只是隐藏而已。
若父类的hi()声明为private,则输出“say hi, a”,原因不知,记住就是!
6.一个非抽象方法死活也别想override成一个抽象方法
7.override的子类的方法抛出的的异常只能是父类方法抛出异常的子异常类,或者无!
8.构造器不能是native, final, static, synchronized的,可以是public, private,什么都没有的,呵呵
9.构造器函数里还可以写return呢,但后面什么都不许有,甚至null(因为其没有返回值)
10.构造器不能返回值.但如果有个"构造器"反值了,别紧张,它就不是构造器喽,只是个普通函数
11.super();this();这两个函数只能在构造函数里调用,而且必须在第一行
12.成员变量声明时候赋值比构造函数还早. int i=1; earlier than Test(){}
13.方法的参数变量可以是final,不能有访问控制修饰符(public等)和static
14.hashCode返回一个int,对象的内存地址
15.void wait() throws InterruptException,wait扔InterruptException异常
16.java.lang.Void 是void的包装类
17.Byte,Interger,Double...所有的跟数有关的包装类都是继承于Numeric
接口Interface)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.接口的所有方法默认都是abstract(没有方法体)和non-static的
2.接口的所有变量默认都是static, final的,所以接口的变量在它的实现类里不能改值
3.接口的实现类实现的方法必须和接口的方法抛出同样的异常,不许是子类,这和override不一样!
同样,如果接口方法没有抛,实现方法也不能抛。
4.Runnable接口有一个run()方法,实现类实现的方法必须声明成public void run(){…}
5.接口不能声明成final,要不它怎么被实现呢(这好像又是废话啊
6.一个类实现两个接口,如果两个接口有相同的方法,实现类就实现这个方法,没问题的.
7.接口不能实例化,只能由类/接口实现
8.接口继承接口用extends,类实现接口用implements
9.接口只可声明为public或default,前面有修饰符abstract也可以编译
内嵌类Inner Class)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.内嵌类可以访问outer类的任何变量,包括私有的
2.静态inner类,只能访问outer类的任何static变量(任何静态content只能访问静态的)
3.内嵌类可以是final, abstract的
4.方法内的内嵌类不能为static, void test(){ static class A{}} XXXXX!!!!
5.方法内的内嵌类也不能带任何modifier。 void test(){ public class A{}} XXXXX!!!!
6.方法内的内嵌类只能访问方法内的final变量,但是可以访问outer类的任何变量
7.匿名类不能有构造器,但声明时候带参数,相当于构造器的参数传递。
class ABC { }
class ABCD{private ABCD(int i){ }}
ABC test3(){return new ABC(){};}
ABCD test4(){return new ABCD(3){};}
interface iii{}
iii test5(){return new iii(){};}
//class BCD extends ABCD{} compile error,因为,看上面就知道,new iii(){};实际上匿名类实现了iii接口;new ABC(){};实际上是匿名类继承了ABC。
8. class A {private A(){System.out.println("a!");}}
class B extends A{}
没错!B实例化的时候会主动调用父类A的构造,即使是private的,看来也没问题!!!
9.内部类可以有synchronized方法,那么锁是这个内部类,跟外部类没一点关系;
在锁的问题上,内外分别的。
10.外部类不能通过this被访问,this这时候应该指的是内部类,享用外部类的成员就直接用,
不用加任何限定词。
11.如何用this呢?请看:
class Outer{
int i;
class Inner{
class InnerInner{
void Test(){
Outer.this.i=1;
}
}
}
}
看见了吧,类名.this.变量名,可以引用到i,第一次看到吧,嘿嘿,孤陋寡闻。
12.注意这两种写法都可以
Outer.Inner i = new Outer().new Inner();
或者,Outer o= new Outer();Outer.Inner i=o.new Inner();
线程Thread)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
?????去看Thread的API!!!!
1.线程启动必须通过start( )
2.run( )只能是public的.
3.线程有优先级从1到10,通过Thread.setPriority(int);来改变,不能超过10,否则会出现运行异常
4.线程优先级默认是5,即NORM_PRIORITY,是Thread的静态变量
5.Thread.yeild( );是静态方法,所以,使用格式是Thread.yield()或yield(),她强迫当前的进程放弃CUP
6.sleep(1000),是静态方法,是说线程睡觉1秒,然后进入Ready状态
注意:不是运行状态,,它还要等OS来调度来获得CUP.
java.lang.*;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.数组的克隆: int ia[][]={{1,2},null}; int ib[][]=(int[][])ia.clone();
2.什么是NaN?????然后看ceil(NaN),floor(NaN),...
3.Math.floor(-1.1f);//-2.0 Math.ceil(-1.1f);//-1.0 Math.round(-1.6d)//-2
4.0=<double random()<1
5.Math,Interger,Boolean...等类型包装类都是final的,不可继承
6.int round(float);long round(double); round永远返回不了小数点
7.static double ceil(double)
8.static double floor(double)注意,ceil, floor的只有这个double版本,什么都转成double!
9.static double sin(double 弧度); 还有cos, tan,toRadius()度转化为弧度
10. new String(?); ?可以是byte[];char[];String; StringBuffer
11. String的一些函数: int length(); char charAt(int); String toUpperCase(); String toLowerCase();
12. String("Abc").equals(String("abc"))不相等的,不然就不会有boolean equalsIgnoreCase(String)函数
13."012345678"是一个字符串,indexOf(&acute;1&acute;)、indexOf("1")都返回1,
substring(1,5)是1234,注意不是subString( )
14. trim()连tab都退毛,"\t\n java ",trim()一下就只剩下"java"了
15.关于对象的科隆,去喳喳API??????????????????????
16. "abcd".trim(),"abcd" + new String("ef")都是合理的写法
17.StringBuffer的3个构造器:()初始化容量为16、(int 初始化容量)、(String)初始化容量为串长加上16
18.StringBuffer的一些函数:String toString();append();reverse();insert();
delete(int start, int end);deleteCharAt(int);setLength(int newLength);
19. String s="";StringBuffer sb=new StringBuffer();if (s==sb){}编译错!因为s与sb类型不一样,不能比较
集合:
1.各接口和类的关系,只有最后一个是类
Collection:List:vector,ArrayList,LinkedList
Map:SortedMap:TreeMap
Collection:Set:SortedSet:TreeSet
Map:HashTable
Collection:Set:HashSet
基础Base)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.java application的main可以不是public的,不是static的,编译成功,但运行出错
2.一个文件只能有一个置顶public类,而且还得跟文件名一样,包括大小写
3.变量只能是字母、$、_开头,接下来的第二个可以是数字、字母、$、_
4.char \u0061=&acute;a&acute;; char \u0063=&acute;b&acute;; char c=&acute;\u0063&acute;; 都是合法的
5.1e-5d合法,e-5d不合法,前面必须有系数
6.int[] i[]={null,{1,2}}正确! int i[]={1,2,3,} 正确!
7. array(无论是在类中或是在方法中定义)使用前都不用初始化,
而变量不一样,类变量使用前不用初始化,自动变量(方法中定义)使用前必须初始化。
8.main方法可以为final
操作符和分配符(Operator and Assignment)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.System.out.printl(1+2+"3");//33 System.out.printl("1"+2+3);//123
2.int i=0; i=i++;i=i--; 结果,i=0! i=++i; 结果为1 i=--i;结果为-1
3.int i[];index=0; i[index]=index=5;结果是i[0]=5;!!!
4.byte b=10可以,因为10可以被自动从int转成byte
5.接下来byte b=b+10不可以!!因为10+b后的int无法被自动从int转成byte
6.byte b1 = 4; byte b2 = 6; b1 = b1 + b2;错!编译错!b1 + b2后,必须强制转成(byte)(b1+b2);
7.XOR一样的为0,不一样为1
8. x == Float.NaN编译错,应该是Float.IsNaN(x)
9. x == Double.POSITIVE_INFINITY编译可以
10.-1是1111.... 1111, <<永远右补零,>>正补零,负补一,>>>恒补零
-1>>多少位都是-1 ; 1<<31变成了最小负数,1000....0000
11.最大正数是01111....1111
12.最小负数是1000....0000(-214748364
13. a instanceof b中b必须是类/接口,不能是实例
--------补充------------------------------
1. byte, short, char都存在 var = -var;编译错误,因为这时候的-var已经自动转成个int类型了
2. int/0会扔出ArithmeticException
double,float/0得INF或者-INF
0/0得NaN
3. int a-b-c;是不符合命名规则的变量名????编译会出错.
4. char a=&acute;\u0001&acute;;对! char b=\u0001;编译错!
5. boolean b1,b2,b3,b4,b5;
b1 = b2==b3; //b1=(b2==b3)
b1 = b2==b3 && b4==b5; //b1=((b2<=b3)&&(b4==b5));
b1 = b2==b3==true; //b1=(b2==(b3==true));
b1 = b2==b3==b4都是对的!
6. 1>>1 是0
7. %= <<= =>> =>>>都是合法符号
8. --1-10*4 这种写法没错,就是 (--1)-10*4
9. k=1;++k + k++ + k ;结果是7,相当于 (++k)+(k++)+(k)=2+2+3
10.标号不能标示声明.
hi:
if (b){
break hi;
//break hi1;不行,不能向后调转
}
//hi1:不行,不能放在声明前
int i;
hi1:
i=1;
11.public static void main(String s[]) throws Exception{}可以噢,main可以扔出异常
12. hi:
if(b==true){break hi;}
break 标号,可以用在if里面,别的任何都不行,包括break,continue 标号.
13.int x = i*-j; 我靠,没问题的!!!编译没错! int x = i*j++ +i++; 这个也没问题,
变量修饰符(Modifier)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.最外面一层的类不能声明成protect和pravite的
2.同一个类的两个实例之间可以访问彼此的私有方法和私有变量,酷!
3.protect和无修饰符的具体区别???????关于外包可以访问被子类访问的是哪个?
4.成员变量被修饰成final后,必须声明时候就赋初值或者在构造器里面赋初值,别指望她可以得到default值.
5.抽象方法不能是static的!!!native方法不能是abstract
6.静态方法将随着类的变化而变化,看例子:
class Parent{
static void test(){System.out.println("hi,parent")};
}
class Child extends Parent{
static void test(){System.out.println("hi,child")};
}
Parent p = new Child();
p.test();
//打出来的是hi,parent! 静态方法是不能overrided的,只是隐藏
区别于没有声明为static的情况(输出hi,child)
7.静态方法可以通过类的实例调用.
new Child().test(); 和 Child.test(); 都OK!
8.transient只能用在类的成员变量上,不能用在方法里
9.transient变量不能是final和static的
10.native方法可以是private, final的,没有方法体,不能为abstract,
流程控制
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.不可到达的语句声明为错:while(false){} ;for(;false;){};if(false){}都无法编译
2.for(第一部分;;)的第一部分可以用来声明和赋值,如for(int i=0;i<5;i++)
3.byte b; switch (b) { case 200: // 200 not in range of byte,因为200超过b的范围,将编译错误
4.带标签的continue回达到标签的位置,从新进入紧接在标签后面的循环
5.带标签的break会中断当前循环,并转移到标签标示的的循环的末尾
转型和上溯(Converting and Casting)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Binary operators convert the smaller(less precise) operand to the type of the larger(more precise) operand.
All operators will convert things smaller than ints to ints or larger. This includes char &acute;s!
1.byte,char,short默认转成int
2.byte->short->int->long->float->double
char^
这是默认可以转型的方向,反了必须要显式cast! 特别注意:long->float是默认的,别看long64,float32,嘿嘿;)
还有就是看得出来,char和 byte,short之间无法互相默认转换
3.float f=1/3; OK!float f=1.0/3.0;编译出错,因为1.0/3.0结果是double的,噢噢~,错喽!!
错误:boolean b=-1;(只能是ture或false) char c=17c;(没有c后缀) byte b=10b;(没有b后缀)
int i=019;(八进制最大为7)
4.int i=1; byte b=i;错!需要显式cast.
final i=1; byte b=i;就ok!
我也不知道为什么,final就可以.而且,据我实验只有int和byte的关系这样,其他不行.
5.int i[]; Object[] obj=i;错! Object obj=i;对! 数组只能转成Object,而不能是Object[]
6.int i[]; Object[] obj;i=(int[])obj; 对! 对象可以通过显式来转成一个数组. |
|