资源描述
Java学习笔记(OO部分)
1. 类仅仅创建了一种新的数据类型,类就是对象的模板,对象就是类的一个实例,对象和实例可以相互使用。
2. 在类中,没有用Private标明的变量成为实例变量,每一个对象都具有自己独立的实例变量,即任何一个对象将本身的实例变量值改变之后,并不影响其他对象的实例变量值。
3. 在声明一个对象时,一般分为两步:首先声明某类类型的变量,改变量仅仅可以用来引用该类的一个实例;接着用new运算符创建一个对象的实际物理拷贝,并且把对于该对象的引用赋给改变量,注意这里赋给改变量的是该对象的内存地址。
4. 类和对象的区别:类是一种数据类型,用于创建新的对象,是一个逻辑框架,并不占有内存空间;而对象是类的实例,占有物理内存。
5. 给对象的引用变量赋值:例如,B1为类Box的对象,而B2为类Box的引用变量,如果将B1赋给B2,那么最后的结果是它们共同指向同一个对象实体,这时,对B1或者B2所应用对象的改变都会引起另一方所引用对象的变化。
6. 类的构造函数的作用是对对象的变量进行初始化,它在对象建立之后,new运算完成之前被调用。另外,构造函数可以重载,当建立一个对象时,可以根据参数的顺序、类型、以及有无参数来调用相应的构造函数。
7. 关键字this的作用是可以在一个类方法中调用正在使用该方法的对象的引用,最常见的用法是可以使方法的自变量名和类的实例变量名相同,进而解决在方法体内后者被前者覆盖的问题。
8. Java里面的垃圾回收机制:当一个对象没有被任何变量引用的时候,该对象所占的内存将会被自动回收。如果在对象被回收之前要进行一些特殊的操作,比如释放该对象占用的特殊资源的时候,就要使用finalize()方法。在该方法中要指定该对象被销毁前要执行的操作。
9. 方法的重载:这是java实现多态性的一种机制。在类中,若干个方法可以有相同的名字,但是它们的参数有所不同,主要表现在:参数个数、类型上。当要调用某方法时,系统会根据调用时参数的类型、个数等信息调用相应的方法。注意,方法的重载和它们的返回类型无关。在方法的重载中,有时会发生隐含的数据类型转换。例如,当参数类型为int 型,而又没有自变量为该类型的方法,却有double类型自变量方法,这时该参数就会自动被转换为double 型。
10. 对象可以作为一个参数在方法中加以传递,这种情况一般应用在构造函数中,可以利用一个已经存在的对象创建一个新的对象。
11. java中的参数传递:当传递一个简单类型的参数时,采用的是按值传递方式,即方法体内对自变量的操作并不能改变方法外该参数的值;但是当传递是一个对象的时候,方法的自变量就会接受一个该对象的一个引用,它们共同指向同一个对象,这时,方法体内对自变量的任何操作都会引起该对象的变化。
12. 类成员的访问控制:public类型的成员在任何地方均可以使用;private类型的成员只能够在类的内部使用;protected类型的成员可以在包内以及该类所有的子类中使用;无修饰符的成员可以在本类所在的包内使用。
13. 类的静态成员的使用:static关键字可以用来声明类的静态成员,这时这些成员可以为所有的类实例所共享。这些成员的使用可以不依赖于该类的实例。类中一般要有一个static块,可以用来对静态变量进行初始化,而且只有在该类在第一次被加载的时候该块内的初始化代码才会被执行(而且是首先执行)。可以在类的外面直接用类名和点运算符对这些静态成员进行操作。对于静态方法,我们要遵循如下的使用规则:它们仅仅只能调用类中的静态成员,而且不能使用super和this关键字。
14. 关键字final的作用:当一个变量声明为一个final类型的变量的时候,改变量就不能进行更改。所以在声明一个final型的变量的时候一定要对其进行初始化。如果一个方法被声明为final型,那么该方法就不能被其所属类的子类覆盖掉。一个类被final修饰的时候,该类就不能被继承。
15. 注意,数组均是被作为一个对象来使用的,它们都有一个共同的变量:length,即数祖长度。
16. 内部类的使用:在一个类的内部可以声明一个内部类;内部类在外部类的外面是不可见的,而且内部类的成员变量只能在内部类内部使用,外部类的成员不能对它们进行任何操作;但是内部类可以使用外部类的所有成员。另外,还可以在方法体内,甚至循环体内使用内部类。
17. 在一个超类中声明为private的成员只能被其本身引用,其子类虽然可以继承该成员,却没有权利访问它(除非使用关键字super)。
18. 一个超类的引用变量可以被赋予一个其子类对象的引用,此时,超类的引用变量只能访问超类中已经定义的成员。此时,超类的引用所访问的成员均为其子类的对应成员(因为子类已经将超类实现了进一步的扩充,java可以利用此机制实现运行时的多态性,参考21)。
19. super有两种使用方式:第一种是调用最接近该子类的超类的构造函数;第二种是调用被子类隐藏的超类成员。Super在子类中调用超类的构造函数的时候,一定是以第一条语句在子类的构造函数中出现。Super()的主要作用是将子类继承过来的超类的变量初始化。在子类中,总是先将继承过来的变量初始化,然后再将自己的变量初始化。
20. 在类的构造函数执行过程中,有一个固定的顺序,即该类的所有父类的构造函数先依次执行完之后其本身的构造函数才执行。
21. Java的动态方法调度,即在超类中定义一个方法,此方法可以是接口形式。然后在其子类中可以重载(覆盖)此方法。所有子类对象的引用均可以赋给超类对象的引用,这时超类对象的引用就可以调用所有子类中的重载的方法,具体要调用哪一个方法就要看当时赋给超类对象引用的是哪一个子类对象的引用。Java的这种机制可以实现运行时的多态性。
22. 抽象类的使用,即类中至少有一个抽象函数,此类函数只有方法框架而无方法体实现。抽象类不能实例化,但是可以有它的引用。抽象类的子类要么必须完全实现其所有的抽象方法,要么也是一个抽象类。
23. 一个类如果是抽象类,那么将其声明为final型是非法的(矛盾)。
24. 一个类可以实现多个接口,但是只能继承一个类。
25. 包的引入是Java提供的把类名空间划分为更多易管理的块的机制。包既是命名机制又是可见度控制机制。可以在包内定义类,而且在包外的代码不能访问该类,这使包内的类之间有隐私,但是不被其他世界所知。
26. 包一般定义在文件的开始部分,表示该文件中所有的类都在该包之中。而且多个文件可以使用相同的包的声明,很多情况下,包的定义伸展到很多文件。
27. 可以创建多级层次的包。不能在没有对保存类的包进行重命名的情况下重命名一个包。
28. 对于包和类的进一步理解:二者都是封装和容纳名称空间以及变量和方法范围的方法,包就像容纳类和下级包的容器,类就像容纳变量和方法的容器。
29. 一个接口的修饰符可以为public或者没有修饰符。若为public所修饰,则其中所有的方法和变量都是public类型的。接口中的变量一般都是final或者static类型的,这意味着接口中的变量并不能通过实现类而发生改变。
30. 实现接口的类要么没有修饰符,要么只有public来修饰;实现的接口方法必须要被声明为public型,而且实现方法的类型必须要和接口中定义的该方法的类型相匹配。如果一个类要实现一个接口,那么这个类要么实现该接口的所有方法,要么部分实现该接口中的方法,此时,实现类的前面要加上abstract关键字。
31. 接口的应用很重要的一点在于实现java的动态调用方法机制,该机制类似于上述21中的介绍。由此可见,java实现动态调用方法的机制适用于子类---父类、子类----抽象类、实现类----接口这三种层次类型,这是java实现多态性的重要方法。
32. 一个接口可以继承另一个接口,同时也可以被其他的接口所继承。如果一个类要实现一个接口,那么该类就要实现一个继承自另一个接口的接口的时候,它就要实现接口链中的所有方法。
33. 异常的类型:所有的异常都是内置类Throwable的子类,因此Throwable在所有异常类层次结构的顶层。Throwable下面又分为两个子类:第一个是Exception子类,该子类用于在用户程序捕捉的异常情况,用户可以用该类来创建自己的异常类型子类,Exception有一个重要的子类RuntimeException,该类型的异常及其子类在用户程序中自动可用,也不用被Thows关键字引出(该类型的异常又称为Java的内置异常);另一个子类是Error,该类定义了在通常情况下不希望被程序捕获的异常,这样的异常一般情况下不被用户程序所控制。
34. 异常通常是在代码中发生异常情况下的对象。当异常发生的时候,一个代表该异常的对象被创建并且在导致错误的方法中被引发。该方法可以选择自己处理异常或者是传递改异常,但是最终都要被处理。
35. 当程序中不对异常进行处理,则异常会被默认的处理程序捕获,默认的处理程序会显示一个描述改异常的字符串,打印异常发生处的堆栈轨迹并终止程序。这样的方法对于调试程序错误是很有用的。
36. try和catch的使用:前者一般用来捕获一个异常,后者是对对应的异常进行处理。Catch应该包含一个用户希望捕获的异常类型。当异常发生时,程序直接由发生错误(异常)的地方转到对应的catch块儿中进行处理,而try中发生异常之后其他的代码将永远不会被执行。一个try和若干个catch构成了一个单元,不能单独使用try或者catch。当有多个catch时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行,执行之后其他的子句全被略过,执行从全部的try/catch块之后的地方继续执行。
37. 注意,在使用多catch的时候,异常子类必须在其所有的父类之前使用时至关重要的,因为若不这样,因为运用异常父类的catch语句将会捕捉该类型以及所有子类类型的异常,这样,如果子类异常在父类异常后面,则子类异常将永远不会到达,这将会是一个错误。
38. try可以嵌套使用,这时,如果一个内部的try语句所捕获的异常没有对应的catch处理程序,则外面一层的try语句对应的catch处理程序将会被检查是否与之匹配,该过程将一直持续到一个catch语句匹配成功,如果没有catch语句与之匹配,则java 运行时系统将会处理这个问题。当然,当有方法调用时,try的嵌套可以隐蔽的发生。
39. throw子句的使用:throw语句一般用来引发明确的异常,throw语句引发的异常对象可以有两种方式来创建:如果该语句在catch子句中,则在catch子句中设置参数;如果该语句在try子句中,则用new操作符创建。程序执行到该语句之后立即被停止,后面的语句将不被执行。包含该throw子句的try块将会检查自己是否有一个catch处理块与该子句的异常类型相对应,如果发现了这样的块,则转向该块。否则次级包围的try块将会被检查,以此类推。如果没有找到这样的catch块,默认的异常处理程序将会中断程序的执行并打印堆栈轨迹。
40. throws关键字的用途:可以在一个方法的声明部分来声明该方法中出现的所有不属于Error或者RuntimeException的及其子类的异常。如果不这么做,将会导致编译错误。
41. Finally关键字的使用:它在一个try/catch块之后和另一个try/catch块之前执行。Finally是可选的,一个try块至少应该有一个catch或者finally块与之对应。无论try块中发生了什么情况,Finally块都会被执行(包括有未被处理的异常或者有明显的返回语句等)。
展开阅读全文