java总结大全包括所有java基础知识点.docx
《java总结大全包括所有java基础知识点.docx》由会员分享,可在线阅读,更多相关《java总结大全包括所有java基础知识点.docx(82页珍藏版)》请在冰豆网上搜索。
java总结大全包括所有java基础知识点
System.out.println(010);
输出八进制数010的十进制值8
注意是数字0开头,不是字母o
16进制以0x或0X开头
classValHold{
publicinti=10;
}
publicclassObParm{
publicvoidamethod(){
ValHoldv=newValHold();
another(v);
System.out.println(v.i);
}
publicvoidanother(ValHoldv){
v.i=20;
ValHoldvh=newValHold();
v=vh;
System.out.println(v.i);
}
publicstaticvoidmain(String[]argv){
ObParmo=newObParm();
o.amethod();
}
}
此题的答案是
10
20
为什么不是
10
10呢?
这样解释吧,按照sun官方的说法:
当一个引用变量作为参数传递给一个方法时,在这个方法内可以改变变量的值,即改变引用指向的对象,(本题中将vh赋给v)但是方法的调用结束后,改变量恢复原来的值,即变量仍然指向原来的对象。
(即another(v)调用结束之后,v又回复到第一次ValHoldv=newValHold();时指向的地址空间。
)
但是如果在方法内改变了引用指向的对象的数据(属性),那么当方法的调用结束后,尽管引用仍然指向原来的对象,这个对象的某个属性已经被改变了(v的i值在执行v.i=20的时候就已经被改变了,所以调用another结束后,v.i已经变成了20)
重载overload方法不能用返回值判断,而应当以参数判断(有无参数、参数类型、参数个数、参数排列顺序)
publicclassInOut{
Strings=newString("Between");
publicvoidamethod(finalintiArgs){
intiam;
classBicycle{
Bicycle(){
System.out.println(s);//这两句话可以,也就是说可以访问s
System.out.println(iArgs);//和finalint常量
//System.out.println(iOther);
}
}
newBicycle();
}
publicvoidanother(){
intiOther;
}
publicstaticvoidmain(String[]args){
InOutinout=newInOut();
inout.amethod(22);
}
}
Innerclass
Innerclass能够存取外部类的所有实例变量----无论这些实例变量有什么样的存取控制符(比如private),就像类中的方法能够存取方法所在类的所有变量一样;
如果innerclass定义在方法中,则innerclass能够存取方法所在的类中的实例变量,也能存取该方法中的局部变量,但该局部变量必须是final的,也就是只能访问方法中的常量.
(上面所说的都是普通内部类,不是静态内部类的情况)
floatf=1/3;
floatf=10;//输出10.0
inti=1/3;
intx=(int)(1.23);
doubled=999d;都是合法的表达式
如果将floatf=1/3;改成floatf=1/3f;则
f=0.0
i=0
d=999.0
f=0.33333334
Integer没有setValue方法。
instanceofTestswhetheraninstancederivesfromaparticularclassorinterface。
注意:
实现了某接口的类的对象也是该接口的实例;某类的对象也是该类父类的实例。
Interfacescannothaveconstructors接口没有构造函数
接口中的所有数据成员都是staticfinal,即静态常量(这两个关键字可以不写)但必须给常量赋初值;
接口中的所有方法都只有定义没有实现细节,并且全部为public(可以不写出来),所以接口中的方法全部是抽象方法
接口比抽象类更抽象
Runnable接口只有run()一个方法
注意:
不带参数
X位的数据类型的范围在-2x-1~2x-1-1
特例:
字符char型表示单个16位Unicode字符,所以它的取值范围0~216-1
classBase{
publicvoidBase(){
System.out.println("Base");
}
}
publicclassInextendsBase{
publicstaticvoidmain(Stringargv[]){
//System.out.println(99);//(*)
Ini=newIn();
//in.Base();显式调用Base()有输出,可见加了返回类型后,
Base()是一个普通的方法,不再是构造方法了
}
}
运行结果:
Compilationandnooutputatruntime
构造方法没有返回值,但是如果你在构造方法前加了void关键字,左边的程序将可以通过编译,也可以运行,但是没有输出Base.(很奇怪)
然而如果你将左边打*的行的注释去掉,则可以输出99,但没有输出Base.
调用有输出,
native修饰的方法没有方法体,用一个分号“;”代替大括号。
如:
staticnativevoidamethod();
staticvoidamethod(){}
▓一个文件只能有一个public类,而且文件名要以这个类命名
但是如果将public删除(即没有public方法了),程序仍然能正确运行而且有输出
1)staticmethodsdonothaveaccesstotheimplicitvariablecalledthis
静态方法不能存取隐式变量this
2)Astaticmethodmaybecalledwithoutcreatinganinstanceofitsclass
3)Astaticmethodmaynotbeoverridentobenon-static
静态方法不能重置为非静态方法
静态方法
main不是java关键字!
!
缺省构造函数没有返回类型
Interface中只有数据和方法的声明,它只是提供一个框架。
所以其中的方法不存在存取接口中定义的静态常量的问题。
4)Thesizeofastringcanberetrievedusingthelengthproperty
这句话是错误的,计算字符串的长度的length()是一个方法,不是property!
而数组则有一个length成员域,它不是方法!
,如int[]myarray=newint[3]
myarray.length返回myarray的长度
int[]array=newint[10];
array.length=15;//compileerror
数组的长度一旦确定就不能改变!
1.如果在一个方法中声明一个基本类型变量,那么在使用这个变量之前,它必须被赋值!
2.如果在类体中,方法之外定义基本类型变量,则可以不赋初值,系统自动采用该类型的缺省值;
3.对于基本数据类型的数组,无论是在方法中,还是在方法之外,如果未赋初值,系统都会为它赋相应基本类型的缺省值。
而如果数组是对象数组,则初值为null。
初值问题
非静态innerclassescannothavestaticdeclarations
non-staticinnerclasses不能有静态的方法、变量等。
内部类可以有任何的存取控制符例如protected,public,private.
Innerclass
classA{
publicstaticvoida(){
System.out.println("super!
");
}
}
classTestStaticextendsA{
publicstaticvoida(){
System.out.println("child!
");
}
publicstaticvoidmain(String[]args){
Aobj=newTestStatic();
System.out.println(obj);
obj.a();
}
}
有static,输出
TestStatic@1fcc69//可见obj是子类对象
super!
如果将static去掉,则输出(表示父类的同名方法被重置override了)
TestStatic@1fcc69
child!
按sun的说法,静态方法不能被override,只是被隐藏(hidden)了
yield()方法无参数,yield()只能使同优先级的线程有执行的机会
sleep(longmillis[,intnanos])方法有参数。
calltosupermustbefirststatementinconstructor!
而且,切记super方法只能在构造方法中写,其他方法中一概不能写!
1)Aprogramcansuggestthatgarbagecollectionbeperformedbutnotforceit
2)不同的java开发环境的垃圾处理机制不太一样。
garbagecollection
non-staticvariablecannotbereferencedfromastaticcontext
staticvariable
publicclassInc{
publicstaticvoidmain(Stringargv[]){
Incinc=newInc();
inti=0;
inc.fermin(i);
i=i++;
System.out.println(i);
}
voidfermin(inti){
i++;
}
}
睁大眼睛看仔细
结果是0!
!
对基本类型是传值,passacopy
Swicth语句中的判断条件必须是int和它以下的数据类型即short、char、byte
publicclassAgg{
staticpublicinti=10;//(*)
publicstaticvoidmain(Stringargv[]){
switch(i){
case1:
System.out.println("one");
default:
System.out.println("default");
case10:
System.out.println("ten");
}
}
}
publicclassTestswitch{
publicstaticvoidmain(String[]args){
intx=Integer.parseInt(args[0]);
switch(x){
case4:
System.out.println(4);
case3:
case2:
System.out.println
(2);
case1:
System.out.println
(1);
}
}
}
publicclassTestswitch{
publicstaticvoidmain(String[]args){
intx=Integer.parseInt(args[0]);
switch(x){
case1:
System.out.println
(1);
case2:
case3:
System.out.println(3);
case4:
System.out.println(4);
}
}
}
奇怪的switch!
1)如果有匹配的值,无论default预放哪里都没关系。
2)如果无匹配值,即,将case10去掉,则会执行default
3)如果将case1放到case10后,则case10及case1都会有输出!
4)如果i=4,输出:
default
ten
5)如果将default放case10后,输出
default
可见无匹配值时,从default语句开始往下都有输出,直到遇到break或结束。
5)总结:
从匹配的地方开始下面的语句都有输出,直到遇到break或程序结束。
这个匹配的地方包括default,参见第4点。
javaTestswitch3
输出
2
1
javaTestswitch1
1
3
4
原因是:
没有加break;语句!
!
没有break则从匹配的地方开始往下全部有输出!
只到遇到break
goto和const虽然是java关键字,但是目前还未用于Java语言。
构造方法不能加static关键字
Publicvoidinit(){
Threadt=newThread(){
//somecodes
};//匿名内部类象语句一样被定义,所以要加分号!
t.start();
}
创建了Thread的一个实例,其实是创建了Thread的子类的一个实例,这个子类我们并没有给他命名,但是我们已经给出了这个子类的定义。
匿名内部类没有构造方法!
Java隐式的调用其父类的构造方法!
InJava,anonymousclassesareoftenusedtoperformsimpleeventhandlingforuserinterface.
AnonymousClasses
Asyoucansee,thenewexpressionstatesthatitiscreatinganinstanceofclassThread.Actually,it’screatingasubclassofThreadthatwehavenotnamed,althoughwehavesuppliedadefinitionforthissubclass.
Anonymousclassescannothaveconstructors,Javainvokestheirsuperclassconstructorimplicitly.
publicclassTestinner{
intt=10;
publicvoida(){
finalintu=90;
classInMethod{//方法中内部类
InMethod(){//内部类的构造方法
System.out.println("u="+u);//封装方法内的变量必须是final
才能访问到!
System.out.println("t="+t);//外部类的变量可以任意访问!
}
}
newInMethod();
//必须在方法a()中创建内部类对象之后,
//Testinner对象才能通过a()访问到InMethod类
}
publicstaticvoidmain(String[]args){
Testinnert=newTestinner();
t.a();
}
}
方法中的内部类的演示程序
输出:
u=90
t=10
方法中的内部类不可以是static的!
如果一个内部类是静态的(当然只能是类中的内部类啦),那么这个类就自动的成为顶级(top-level)类即普通的类。
静态内部类中的方法(无论是静态的方法还是非静态的方法)只能直接访问外部类中的静态成员,要访问外部类中的非静态成员,则必须创建外部类的对象。
静态内部类的问题
staticinnerclass
<1>42e1是double型的。
<2>0x0123是int型的。
<3>GivenanActionEvent,howtoidentifytheaffectedcomponent?
用getSource()方法,记住!
(1.4不要求awt)
<4>StringBuffer中的方法是append,String中的方法是concat,并且,试图在其他方法中通过调用该方法改变String是徒劳的。
<5>system.exit(intvalue),也就是说只要是int都能使虚拟机退出,System.exit('a');同样的是合法的.
<6>whichfourtypesofobjectscanbethrownuse"throws"?
A.Error B.Event C.Object D.Excption
E.Throwable F.RuntimeException
Ansare:
ADEF
<7>whichtwoareequivalent?
A. 3/2//1
B. 3<2//false
C. 3*4//12
D. 3<<2//12
E. 3*2^2//6^2=5
F. 3<<<2(迷惑人的地方,并没有<<<操作符)
ans:
c,d
<8>& | 可以用在int和boolean上。
^(异或只能用在int上)。
&&||只能用在boolean上,作用同&|,但是与其不同在于&&||有短路运算,而位操作没有。
<9>HashtableimplementsMap,Cloneable,Serializible
<10>whichtwointerfacesprovidethecapabilitytostoreobjectsusingakey-valuepair?
A.java.util.Map
B.java.util.Set
C.java.util.List
D.java.util.SortedSet
E.java.util.SortedMap
F.java.util.Collection
Ans:
A,E
实例变量instancevariables和局部变量localvariables的区别:
1)实例变量能够在类定义的整个代码中使用(比如类中所有的方法中),他一般系统会自动为他赋缺省值;
2)局部变量则没有缺省值。
Methodinitisaspecialappletmethodthatisnormallythefirstmethoddefinedbytheprogrammerinanappletandisguaranteedtobethefirstmethodcalledineveryapplet.Methodinitiscalledonceduringanapplet’sexecution.Themethodnormallyinitializestheapplet’sinstancevariables(iftheyneedtobeinitializedtoavalueotherthantheirdefaultvalue)andperformsanytasksthatneedtobeperformedonceatthebeginningofanapplet’sexecution.
importjava.applet.Applet;
importjava.awt.*;
publicclassSampleextendsApplet{
privateStringtext="HelloWorld";
publicvoidinit(){
add(newLabel(text));
newSample("a");
}
publicSample(Strings){
add(newLabel("hahahahahah"));
}
}
==========================================================
classFirst{
publicFirst(Strings){
System.out.println(s);
}
//publicFirst(){}//加上这条语句则正常运行!
}//由于Second类初始化调用父类无参数的构造函数
publicclassSecondextendsFirst{
publicstaticvoidmain(Stringargs[]){
newSecond();
}
}
Applet中的publicvoidinit()方法
Applet中可以有构造函数
Init()中缺省调用无参构造函数(无论这个无参构造函数是系统提供的,还是用户自己写的),因此如果要写带参数的构造方法,那么用户必须显式的写出无参构造方法,因为用户自己写了有参构造方法之后,系统将不再提供无参构造方法,但是init()缺省一定要调用无参的构造方法,init()找不到无参的构造方法,这样在运行时将会出错。
左这种情况也是编译能够通过,但运行报错。
提示:
加载:
无法实例化Sample.class。
将newSample("a");去掉,将publicSample(Strings)改成无参publicSample(),则先输出hahahah,再输出HelloWorld,可见无参构造方法自动调用且是先执行的
==============
此程序则是编译错误!
不是到运行是才有错误
Second.java:
7:
cannotresolvesymbol
symbol:
constructorFirst()
location:
classFirst
publicclassSecondextendsFirst{
^
如果要调用无参数的的构造方法(已经定义了一些有参的构造方法),那么必须显式的写出无参构造方法。
publicclas