问题描述
1.Java没有任何unsigned类型2.float类型的数值后面有一个后缀F,没有后缀F的浮点数默认为double类型3.if(x=0)在C++中可以编译通过,其结果总为false,而在Java中,整数表达式x=0不能转化为布尔值4.不能使用一个未被初始化的变量5.使用strictfp关键字标记的方法或者类要使用严格计算,这种方式计算可能产生溢出6.&&和||按照短路的方式求值,如果第一个操作数已经能够确定值,第二个操作数就不必计算&和|不是按短路运算,在得到结果之前一定要计算两个操作数的值7.+=是又结合的a+=b+=c就是a+=(b+=c)8.代码点和代码单元?9.String对象称为不可改变的字符串,编译器可以将字符串共享10.只有字符串常量是共享的,而+或者substring等操作产生的结果都不是共享的。不要用==测试字符串的相等性,==运算符只能确定两个字符串是不是被放置在同一个位置11.不能在嵌套的两个块中声明相同的变量,但在C++中可以Publicstaticvoidmain(Stirng[]argc){Intn;{Intn;//这是错误的}}12.Case标签必须是整数或者枚举常量,不能检测字符串13.带标签的break只能跳出程序快而不能跳入程序块14.两个大数值类的应用:BigInteger和BigDecimal任意精度的数值(在java.math.*)中15.Java中可以允许数组的长度为0newelementType[0]数组长度为0和nul值不同16.一个数组的所有元素拷贝到另一数组中的方法System.arrayCopy(from,fromIndex,to,toIndex,count);17.Java数组与C++数组在堆栈上有很大不同,不过基本上与分配在堆上的数组指针一样,也就是int[]a=newint[100],不同于inta[100]而等同于int*a=newint[100];18.对数组排序使用Arrays类中的sort方法,此方法使用的快速排序19.foreach循环访问二维数组:for(type[]row:Arrayname){for(typex:row){dosomething}}20.一个对象变量并没有实际包含一个对象,而仅仅引用一个对象,在Java中任何对象的变量都是对存储在另外一处的一个对象的引用,new操作符的返回的值也是一个引用。下面的语句:Datedeadline=newDate();有两个部分,表达式newDate()构造了一个Date类型的对象,并且它的值是对新创对象的引用,这个引用被存储在变量deadline中。21.可以将Java的的对象变量看做C++的对象指针,Datebirthday等同于Date*birthday22.Java中所有的对象都存储在堆中,当一个对象包含另一个对象变量时,这个变量依然包含的是指向另一个堆对象的指针。23.对实例属性做出修改的方法被称为更改器方法,仅访问实例属性而不加修改的方法被称为访问器方法。24.构造函数总是伴随着new操作符的执行被调用,Java对象都是在堆中构造的25.将某个方法设置为内联方法是Java虚拟机的任务26.不要编写返回引用可变对象的访问器方法(get方法)。在Employee类中classEmployee{publicDatagetHireDay(){returnhireDay;}}这样会破坏封装性Employeeharry=...;Dated=harry.getHireDay();doubletenYear=10*365.25*24*60*60*1000;d.setTime(d.getTime()–(long)tenYear);出错的原因是d和harry.hireDay引用同一个对象,对d的使用set方法就能够自动的改变这个雇员对象的私有状态。如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone).对象克隆指存放在另一个位置的对象副本修改后的代码calssEmployee{publicDategetHireDay(){return(Date)hireDay.clone();}}27.将属性设置为final,构建对象时必须初始化这样的属性。28.publicstaticfinalPI=3.1415;类访问而publicfinalPI=3.1415类的实例访问29.System类中的setOut方法是一个本地方法,不是用Java语言实现的,本地方法可以绕过Java语言的存取控制机制30.静态方法是没有this参数的方法,在一个非静态的方法中,this参数是表示该方法的隐式参数,因为静态方法不能操作对象,所以不能在静态方法中访问非静态属性,但是可以访问自身类中的静态属性。31.publicstaticgetNextId(){returnnexId;//nextId是静态属性}访问:intn=Employee.getNextId();在这里是可以省略static的,但是要通过Employee类的实例来访问32.使用静态方法的两种情况:1.当一个方法不需要访问对象的状态,其所有的参数都是通过显示参数提供的(ex:Math.pow())2.当一个方法只需要访问类的静态属性33.值调用表示方法接收的是调用者提供的值,而引用调用表示方法接收的是调用者提供变量的位置,Java程序设计语言使用的值调用34.1.一个方法不能修改一个基本数据类型的参数(即数值型和布尔型值)2.一个方法可以改变一个对象参数的状态3.一个方法不能让对象参数引用另一个新的对象35.对象属性和局部变量的不同之处,必须明确的初始化方法中的局部变量,但是如果没有初始化类中的属性,将会被初始化为默认值(0或者false或者null)。36.在一个构造函数中调用另一个构造函数用this(...)参数列表37.初始化块:首先运行初始化快,然后在运行构造函数的主体部分,建议将初始化块放置在属性定义之后38.在类第一次加载的时候将会进行静态块的初始化,可以写一个没有main方法的打印39.可以为任何类添加finalize方法,finalize方法将在垃圾回收器清楚对象之前被调用,在实际应用中不要使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法在什么时候被调用,有个名为System.runFinalizersOnExit()的方法可以确保finalize在Java关闭前被调用,但是这个方法不安全,一种替代的方法是使用RunTime.addShoutdownHook()添加关闭钩。40.导入静态方法和静态属性两个实际应用:1.算术运算2.笨重的常量41.没有指定public和private,这个部分(类、方法、变量)可以被同一个包中的所有方法访问42.Java中所有继承都是公用继承43.通过super实现对父类构造函数的调用,使用super调用构造函数的语句必须是子类构造函数的第一条语句,如果子类的构造函数没有显式的调用构造函数父类的构造函数,则将自动调用父类默认的构造函数。44.this的用途:1.引用隐式参数2.调用该类的其他的构造函数45.super的用途:1.调用父类的构造函数2.调用父类的方法46.一个对象变量可以引用多种实际类型的现象被称为多态。在运行是能够自动的选择调用适当的方法的现象称为动态绑定。47.允许子类将覆盖方法的返回类型定义为原返回类型的子类型48.如果方法是private、static、final或者构造函数,那么编辑器将可以准确的知道该调用那个方法,这种调用方式称为静态绑定。49.在覆盖父类一个方法的时候,子类的方法不能低于父类方法的访问权限,父类是public子类一定是public50.阻止继承final类和final方法,类中的方法被声明为final,子类就不能覆盖这个方法,final类中的方法自动成为final方法。但是属性不成为final51.如果一个方法很短并且没有被覆盖,编译器能够对它进行优化处理这个过程称为内联52.只有在继承层次内进行类型转换,在将父类转换成子类之前,应该使用instanceof进行检查。53.如果x为null,那么进行xinstanceofC不会产生异常,只是会返回false,null没有引用任何对象,当然也不会引用C类型的对象。54.包含一个或者多个的抽象方法的类必须被声明成抽象的。55.扩展抽象类的可以有两种选择:一种是在子类中定义部分抽象方法或者抽象方法也不定义,这样就必须将子类也标记成抽象类,另外一种是定义全部的抽象方法,这样子类就不是抽象的了。56.抽象类不能被实例化。可以定义抽象了的变量,只能够引用非抽象子类的对象。57.Java中protected部分对所有子类和同一包中的所有其他类可见。58.在子类中定义equals方法时,首先要调用父类的equals方法,如果父类中的属性都相等,就需要比较子类中的属性59.equals方法具有下面的特性:1.自反性:对于任何非空引用x,x.equals(x)应该返回true2.对称性:对于任何引用x,y,如果x.equals(y)返回true那么y.equals(x)也应该返回true3.传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。4.一致性:对于x,y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回相同的结果5.对于任何非空引用x,x.equals(null)应该返回false。60.用instanceof用缺陷,比如说父类引用子类的对象,但是子类的对象拥有和父类某个对象相同的属性,如果没有考虑子类特有的信息,则instanceof就不怎么好。61.如果子类能够拥有自己的相等的概念,那么对称性需求将强制采用getClass进行检测。如果父类决定相等的概念,那么就可以使用instanceof进行检测,这样就可以在不同的子类的对象之间进行相等比较。62.编写完美equals方法的建议:1.显示参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。2.检测this与otherObject是否引用同一个对象:if(this==otherObject)returntrue;3.检测otherObject是否为null,如果为null,返回false,这项检测是很必要的,if(otherobjec==null)returnfalse;4.比较this和otherObject是否属于同一类,如果equals的语义在每个子类中有所改变,使用getClass检测if(getClass()!=otherObject.getClass)returnfalse;如果所有的子类都拥有统一的语义,就是用instanceof进行检测if(!(otherObjectinstanceofClassName))returnfalse;5.将otherObject转换为相应的类类型变量:ClassNameother=(ClassName)otherObject6.现在开始对所有需要比较的属性进行比较了使用==比较基本类型,使equals比较对象属性,如果所有都匹配返回true,否则返回false。7.如果子类中重新定义equals就要在其中包含调用super.equals().63.hashCode方法,注意String类的hashCode方法,见源代码。两个相等对象要求返回相同的散列码。64.使用add方法为ArrayList添加新元素,而不用set方法,它只能替换数组中已存在的元素。65.自动装箱与拆箱中注意基本类型与包装器的关系,自动打包规boolean,byte,char<=127,介于-128-127之间的short和int被包装到固定的对象中。Integera=100,Intergerb=100,a==b是成立的。但是大于127就是不成立的。66.包含在包装器中的内容不会改变,不能使用包装器类创建修改数值参数的方法。67.Class类的使用68.异常有两种类型,一种是未检查异常,另一种是已检查异常。69.反射的机制:在java.lang.reflect包中有三个类Field,Method,Constructor分别描述类的属性,方法和构造函数。Field中有一个getType函数,由于描述属性所属类型的Class类对象。Method和Constructor类含有能够报告参数类型的方法,Method类还可以报告返回值类型,这三个类还有一个getModifiers的方法,它将返回一个整型数值,用不同的位开关设置描述public和static这些修饰符的使用状况,还可以利用java.lang.reflect包中的Modifier类的静态方法分析getModifiers返回的整型数值。可以使用Modifier类中的isPublic、isPrivate,isFinal判断方法或者构造函数是否是public,private,或final。调用Modifier类的相应方法,并对getModifiers返回的整型数值进行分析,另外还可以利用Modifier.toString方法将修饰符打印出来。70.getFields()方法返回包含Filed对象的数组,这些对象记录了该类或其父类的公有属性,getDeclaredField()方法返回包含Field对象的数组,这些对象记录了该类的全部属性。getMethod()将返回所有的公有方法,包括从父类继承的公有方法,getDeclared()返回该类或者接口的所有方法,但是不包括由父类继承的方法。71.反射机制的默认行为受限于Java的访问控制,如果一个Java程序没有受到安全管理器的控制,就可以覆盖访问控制,为了达到目的,需要调用Field,Method,或Constructor对象的setAccessible方法。72.为了编写通用扩展数组的代码,需要能够创建与原数组类型相同的新数组,为此,需要java.lang.reflect包中的Array类中的一些方法,其中最关键的是Array类中的静态方法newInstance,它能够构造新数组,在调用时必须提供两个参数,一个是数组元素的类型,另一个是数组的长度。ObjectnewArray=Array.newInstance(componentType,newLength)为了执行这条语句,需要知道新数组的长度和元素类型,书上有一段很有水平的代码,ArrayGrowTest.java73.Java没有提供方法指针,即将一个方法的存储地址传给另一个方法,以便第二个方法能够随后调用它。74.Method类中的invoke方法Objectinvoke(Objectobj,Object...args)第一个参数是隐式参数,其余的对象提供了显式参数,以前的版本中,必须传一个对象数组,如果没有显式参数就传递一个null,对于静态方法,第一个参数可以被忽略,即可以将它设置为null。Invoke的参数和返回值必须是Object类型的。75.在比较两个枚举值时,永远不需要调用equals方法,而直接使用==就行了。
解决方案
解决方案二:
LZ在发博客呢,还是在发博客呢不过总结的比较全
解决方案三:
lz是来分享的吗
解决方案四:
谢谢分享。。
解决方案五:
解决方案六:
你发篇博客吧这样大家看着会舒服点
解决方案七:
解决方案八:
12.Case标签必须是整数或者枚举常量,不能检测字符串JDK7已经支持String了。
解决方案九:
LZ好辛苦
解决方案十:
解决方案十一:
解决方案十二:
解决方案十三:
解决方案十四:
总结的比较全
解决方案十五:
好牛,大神呀,我的JAVA都白学了
解决方案:
解决方案:
我好菜
解决方案:
CoreJava是本好书,正在拜读。。。
解决方案:
解决方案:
哇、好精辟、应该发博客吧、