您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 孙鑫《Java无难事》学习笔记
1:JAVA是通过JVM的不跨平台性实现字节码的跨平台。2:Window其实为自己的每个应用程序都设置了环境变量PATH=C:\ProgramFiles\Java\jdk1.5.0\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\PROGRA~1\ULTRAE~1;C:\ProgramFiles\MicrosoftSQLServer\80\Tools\BINN;C:\ProgramFiles\CommonFiles\UleadSystems\MPEG;C:\ProgramFiles\MicrosoftVisualStudio\Common\Tools\WinNT;C:\ProgramFiles\MicrosoftVisualStudio\Common\MSDev98\Bin;C:\ProgramFiles\MicrosoftVisualStudio\Common\Tools;C:\ProgramFiles\MicrosoftVisualStudio\VC98\bin按路径找到第一个就停止不用找第二个了。3:jdk提供的应用程序如javac,java等能否执行决定于系统能否根据path找到这个应用程序;而在javaDemo这个命令中,系统要做的是根据classpath来找到Demo.class这个类。所以你不一般不需要设置classpath,因为默认的classpath是当前根目录,除非你执行了setclasspath就出问题了。classpath可以在命令行下指定,但是重新打开时就恢复为无定义的classpath(如果在环境变量下设置了,则为设置的那个目录),但是只要在环境变量下设置一个classpath的路径,那就ok了,我的意思是如果你的类Demo.class都放在classpath的路径下,那么无论你在那里你都可以随便执行javaDemo而不用像以前那样非得跑到Demo.class所在目录下取执行。但是如果你在命令行中再次setclasspath,那么设置的环境变量的classpath将会在这次执行中被替换。重新打开窗口又恢复你的环境变量下的classpath函数参数类型完全一致的方法不能构成方法重载final定义常量,如同define,在运行的过程中不可以改变它的值,而且必须在申明的时候初始化,但实际上也可以在构造函数中初始化java中只能用单继承,c++中用多继承super可用来调用被子类覆盖的父类方法和成员变量实类话一个子类对象时,默认先调用父类的构造方法.java不需要放在包里而.class文件一定要放在它的定义包里包是为.class应用而生的,根本不管.java文件执行.class的时候必须在包的上层目录里,而不能在包里编译.java的时候之要能找到文件就行了javac-d自动生成包的目录结构,所以说对高手来说根本不用手动为包建立相应的目录,只要用java-d.就行了-d后面跟的是目录,用.的时候指当前目录import在包与包之间起作用,一个包里的类可以直接互相用最好不要用*来导入包,这在网络环境和手持设备环境下,是很可观的可以用*.java一次将所有当前目录下的.java文件编译final最终类,不可再被继承,String就是著名的final类方法抽象的话类一定要抽象,类抽象的话不一定要方法抽象将一个没有任何抽象方法的类声明为abstract,避免由这个类产生的任何的对象。interface里的方法都是缺省publicabstract,实现接口或者继承并且实现抽象类的方法必须将接口的所有方法或者抽象类的所有抽象方法都实现,可以空实现,但时不能不实现对一个文件种放置的很多类的情况下:文件名不一定要与含有main的类一致,也就是说文件名可以是任何一个类的名字但是在解释执行的时候一定要用含有main的类名但是如果含有main的类是public的,那么....一个好的忠告是:给每一个文件一个包,因为一个文件里有很多个类;一个类被实例化以后,默认的都有一个this引用来指向对象无法在main中直接实例化一个内部类,只能是用main来调用一个方法来实例化一个内部类!因为内部类的存在一定是在有外部类的实例后,如果在main中实例化一个内部类,次时并没有外部类。正确的方法时先实例化一个外部类,然后用这个实例调用一个方法来构造内部类对象!也可以是直接用外部类的对象.new来构造内部类,如Parcel11.Contentsc=p.newContents();无论如何必须利用外部类的一个对象生成内部类的一个对象:普通(非内部)类不可设为private或protected——只允许public或者“友好的”。所以用内部类可以更好的隐藏实施细节当实例化一个外部类的时候并没有同时产生内部类的对象同时又不能在外部类的main中直接实例化一个内部类,所以一般的做法时写一个外部类的方法,这个方法实例化了内部类,然后在main中实例化外部类的对象,然后用这个对象调用它的方法来构造内部类在内部类的外部类之外的其他类中访问内部类的正确方法是:外部类.内部类除非已拥有外部类的一个对象,否则不可能创建内部类的一个对象内部类和普通变量一样,一旦超出了它的作用范围就看不见了,比如把它定义在一个方法里或者定义在一块语句中时就要考虑这个可能;无论内部类嵌套的层次有多深,它都可以访问外部类的成员变量;C++可以多重继承,java只能单继承,用内部类可以达到多继承的效果一个好的编程风格是:在catch中把异常打印出来,便于查错用throws申明抛出异常时本段代码就不用去捕获异常了在try块内部,请注意大量不同的方法调用可能生成相同的违例,但只需要一个控制器。异常或者说违例是由方法抛出的,而不是类。有些方法就会抛出违例,有些不会。一个方法抛出违例,不一定是这个方法自己抛出的,而有可能是这个方法调用的方法抛出的,等等,一系列抛出违例一个好的做法是把catch(Exceptione)放在控制器的末尾,防止其他的特殊违例控制器失效if(t==null)thrownewNullPointerException();看起来似乎在传递进入一个方法的每个句柄中都必须检查null(因为不知道调用者是否已传递了一个有效的句柄),这无疑是相当可怕的。但幸运的是,我们根本不必这样做——它属于Java进行的标准运行期检查的一部分。若对一个空句柄发出了调用,Java会自动产生一个NullPointerException违例。所以上述代码在任何情况下都是多余的。几乎永远不必专门捕获一个“运行期违例”——RuntimeException——它在默认情况下会自动得到处理为创建自己的违例类,必须从一个现有的违例类型继承——最好在含义上与新违例近似假如我们不明确调用一个基础类构建器,编译器会自动调用基础类默认构建器,也就是它偷偷地调用了super();对于一个RuntimeException,我们完全不用理会它,无论这个RuntimeExcepion是用throws抛出来的,还是代码在运行时自动抛出的;但是对于一个非RuntimeException,无论是用throws抛出来的,还是代码在运行时自动抛出的当你要调用含有该异常的方法时,你必须在调用者方法中选择以下两种做法中的一种来解决:1,继续throws这个异常,最后的调用者main会把它抛给运行时系统2,用try...catch来捕获处理。1一般用作调试用,节省时间而已,没实际意义!归根到底,无论哪类异常如果你不想用try...catch来处理它,只要把异常交给java运行时系统就行了:RuntimeException自动交给java运行时系统了;在方法内部你将要抛出什么类型的异常就得在throws句子中申明什么类型的异常,不可以不匹配非RuntimeException通过throws逐级抛给了java运行时系统。throws和throw的区别:throws使凡是发生在本方法内的异常都被抛给上一级调用者处理,自己不用处理,并不代表该方法就一定会抛出异常,它只是在未知异常的情况下提前把责任说清楚:交给我的上级处理。throw是在本方法内部抛出一个事实在在的异常。如果方法已经申明了throws,那代表本方法不会管这个异常的,换句话说,如果你在本方法中还用try...catch来处理,那是徒劳的!finally的必要性:如果有异常发生,try块将执行不完,如果没有异常发生,catch块将不会执行。总之,try和catch不可能都得到执行。那么将会出现这样的场景:有一个必须执行的语句,为了保证它必须执行,你需要将它分别写在try和catch中。多麻烦,用finally来解决,无论有没有异常发生,finally都将得到执行。更重要的是finally会在函数返回之前执行,这个特性在当try和catch中都有return语句的时候特别管用当然如果用System.exit(3)来终止虚拟机,则finally不会执行了,这个特性通常用在异常为非常严重的错误的情况下。如果父类中的方法抛出多个异常,则子类中的覆盖方法要么抛出相同的异常,要么抛出异常的子类,但不能抛出新的异常(构造方法例外)原因解释:如果我们基于父类写一段代码,这段代码中明确捕获处理了父类的所有异常,根据多态原理,有人也可以传递一个这个父类的子类给这段代码去执行,这时候它发现了一个或多个子类的异常不被识别。这是面向对象的基本素质。String类是final的;系统为变量在栈内存中分配引用空间,为对象(只要用new)在堆内存中分配空间;==与equals的区别:==是比较两个变量的值是否相等,变量的值实际是栈内存中存的地址;equals是比较两个对象变量所代表的对象的内容是否相等。System.out.println()方法将会打印对象的内容,而不是该对象的引用的值。String字符串对象可以和任何基本数据类型或者引用类对象进行相加!其他对象不行。String对象是常量,其值不可以被改变:你只能尝试着改变一个引用变量的值,使得它指向另一个String对象,而原先所指向的对象就成为垃圾;而不能改变原来的引用所指向的String对象的值或者说是内容。StringBuffer是对同一个内存块操作;String是不可改变的,指的就是它在同一块内存中是不可改变的,当尝试重新给引用赋值时,就会重新开辟内存块。StringBuffer的方法toString():在打印对象的时候会自动调用它;实际上当你试图打印一个对象的时候都会自动调用toString()来打印这个对象的一个描述。如果你不希望打印这个对象的一个简单描述而是打印这个对象中的元素或者想作它用,那么你只需要在你的类中覆盖来自object的这个方法toString()就ok了。这是面向对象的特性的胜利。所以如果你觉得某个基类的方法用起来不够精确或者不够爽,不太符合你的习惯,那就去覆盖它,改成符合你的要求的方法!操!面向对象太牛比了。java中的索引起作用的部分是=〈index〈StringBuffersb=fuck;这样的赋值只适合String而不是StringBuffer;如果想要让某个对象为垃圾内存,只要将保存了这个对象引用的变量赋值为null;对象数组你可以理解为多维指针。new出了数组对象,还得一个个new出每个数组元素的对象,因为数组元素本身只是个引用,不new就是null;不用第三个cache的互换方法的写法:x=x+y;y=x-y;x=x-y;当函数传递引用类型的参数时,引用和传递基本类型时一样被拷贝了,但时引用所代表的对象还是一份。所以结论是:若将基本数据类型传递进入一个方法,会明确得到基本数据类型的一个副本。但若将一个句柄传递进入方法,得到的是句柄的副本。所以人们认为“一切”都按值传递我们的一个共识是:很少需要调用一个方法来处理它的参数,所以应该尽量避免改变参数。而传递引用参数时恰好会导致参数的改变,所以我们就发明了科隆来改变这个状况。对象的科隆方法:
本文标题:孙鑫《Java无难事》学习笔记
链接地址:https://www.777doc.com/doc-6473772 .html