1. 子类可以继承父类的所有成员(无论公私有属性),只是访问权限有区别。子类父类之间互不能访问保护和私有属性。
2. 子类重定义父类的方法,其访问权限不能变小。Protected不能重定义成private。
3. private int a[3];这样是错误的,应为int[] a;
4. 在子类的内部,不仅能够访问子类自己定义的所有成员,也能够访问超类中公有和受保护的成员,但不能访问超类中私有的成员。
5. 受保护成员具有公有成员与私有成员的双重角色:它可以被后代类的成员方法访问,但不可以被其他不相关的类的成员方法所访问。
6. this 是每一个对象实例的一个特殊的私有数据成员,它是一个引用变量,类型是该对象实例所属的类类型,引用的对象实例就是它所在的对象实例本身。
7. Java 语言的每一个对象实例也有一个特殊的私有数据成员,称为 super,来引用该子对象。super 也是一个引用变量,其类型则是他所属的对象实例的超类类型(准确地说,是其直接基类类型)。根类Object的对象实例的super域将是null。
8. 可通过 super 调用超类中被重定义的方法,一是只能在子类的内部,这是因为 super是私有成员;二是只能在子类的非静态成员方法,这是因为 super是非静态的私有数据成员;三是超类中的成员应该是可以访问的,即该成员在超类中是公有的或者是受保护的成员。
9. Java 语言允许子类在其构造方法中以如下方式调用超类的构造函数初始化其继承成员: super(<超类构造方法所需的参数列表>)
10.Java 语言规定,超类构造方法的这种形式调用必须作为子类构造方法的方法体的第一条语句,否则会产生编译错误。
11.Java 语言的编译器都提供一个缺省的构造方法,这个缺省构造方法惟一做的事情就是以 super()的形式调用超类的构造方法。子类的缺省构造方法只能调用超类没有参数的构造方法(不一定是编译器提供的缺省构造方法,只要是没有参数的即可)
12.若程序员为类提供了构造方法(不管是什么形式的构造方法),则编译器不再为这个类提供缺省构造函数。在进行对象收尾工作时,也需要调用超类的执行收尾工作的方法,不管这个方法是 Java 语言建议的 finalize()方法还是自己编写的执行收尾工作的普通方法。这时要注意,程序员必须将调用超类收尾工作的语句放在子类执行收尾工作方法的最后一条语句。通常执行收尾工作的方法应该没有参数.
13.与调用超类构造方法不同,Java语言的编译器不会自动帮助程序员作任何有关收尾的工作,即使程序员使用finalize()方法进行收尾工作也是如此。
14.将引用变量编译时声明的类型称为它的静态类型, 而该引用变量在运行时实际引用的对象实例的类型称为它的动态类型。显然,任何引用变量的动态类型必然是其静态类型的子类型.
15.祖先类类型的引用变量可引用后代类类型的对象实例,反之则不可,后代类类型的对象引用不能引用祖先类类型的对象实例。同理祖先类类型的对象引用不可隐式类型转换为后代类类型的对象引用,但可强制类型转换为后代类类型的对象引用,如果这种强制类型转换不成功,则程序在运行时会抛出异常。
16.Java语言的类型转换机制的基本原则是:
(1). 首先,隐式类型转换保证不丢失信息.例如将整数类型的数据转换为浮点类型不会丢失信息;
(2). 其次,隐式类型转换也保证不会带来安全问题;
(3). 再次,任何可能发生信息丢失的类型转换需要由程序员使用强制类型转换机制,例如将浮点类型的数据转换整数类型就需要强制类型转换,否则会发生编译错误;
(4). 最后,任何可能发生安全问题的强制类型转换由JVM在运行时进行检查并抛出异常。
17.由程序员设计的多态性有两种最基本的形式:编译时多态性和运行时多态性。
18.静态绑定就是绑定过程在编译时进行,而动态绑定就是绑定过程在运行时进行。
19.工程文件夹下的相对路径样式如"/icons/add.png"
20.try, catch, finally是顺序执行的,finally一定会被执行,只有执行完finally之后方法才能返 回。所以,即使catch里有return语句,也会执行finally。
21.子类可继承超类的 所有成员,继承成员在子类的访问控制与它们在超类中的访问控制相同,即原先在超类是公有的成员,被子类继承后仍然是子类的公有(继承)成员,原先在超类是受保护的成员,被子类继承后仍然 是子类的受保护(继承)成员,原先在超类是私有的成员,被子类继承后仍然是子类的私有(继承)成员(注意私有继承成员即使是子类内部也不能访问)。Java的继承类似于C++的public继承。子类能够访 问其继承自父类中公有和受保护的成员,但是不能访问其继承的private成员。
22.Java 语言也不允许重定义(覆盖)一个使用final 保留字修饰的祖先类方法。
23.Java语言规定在重定义(覆盖)祖先类的方法时,不允许降低方法的访问 控制权限。例如,在定义上述类SubClassOne的method()方法时,不允许将其访问控制改为protected 或private ,除非它重载超类SuperClass的method()方法。Java 语言允许在子类中重定义成员数据时降低其访问控制权限
24.Java 语言中既可重载静态成员方法,也可重载 非静态成员方法。另外,如果子类定义了一个与继承成员方法同名但不同参数列表的方法也是方法重载,而不是对该继承成员的重定义。方法的返回类型及访问控制和其他修饰(如是否是静态成员,是否有final修饰)等都不能区分重载方法。
25.如果这个对象引用的动态类型与它的静态 类型不同(但肯定是静态类型的子类型),而且这个动态类型所对应的类(肯定是静态类型所对应的类的后代类)重定义了这个最精确的方法,那么在运行时实际调用的就是这个重定义了的方法。
26.向下转型(SuperClass= SubClass)是父类对象将会调用子类重定义后的方 法,而不是自己的方法。总之java会尽量执行子类重定义的过的方法。
27.Java 语言的类都有一个惟一的超类。如果用户 没有为一个类指明超类,则它的超类隐含地为根类Object。
28.子类中可定义与超类中常量(即用final 修饰的成员数据)同名的成员数据,但final方法却不能被重定义。
29.只能将抽象类的成员方法定义为抽象方 法,不能将非抽象类的成员方法定义为抽象方法。
30.如果抽象类的某个抽象方法没有被它的子 类重定义给出具体实现,则这个子类也是抽象类,在声明这个子类时必须使用abstract修饰。
31.在C++ 语言中使用模板实现类属机制,Java 语言目前还没有引入类属机制,但 Java API 的java.util 提供的对象容器类是一种多态数据结构,其中可存放任何的对象,因为Java语言的任何对象所属的类都是根类Object 的后代类。
32.Java 语言是一种强类型程序设计语言,强类型程序设计语言中的所有数据的类型在编译时即可确定,并且编译程序将进行严格的类型检查,这样就可以在程序未运行之前就检查出类型不兼容的错误,对于使用类属机制实现的容器数据结构,其中所存放的数据是否符合所需的类型是在编译时检查的.
33.接口只能定义公有的静态常量数据成员(必须初始化),不能定义其他形式的数据成员,只能定义公有的抽象方法,不能定义其他形式的成员方法。接口的数据成员缺省认为是公有静态常量,成员方法缺省认为是公有抽象方法,在声明接口的成员时也可以不使用象public、static、final 、abstract之类的修饰符。
34.类实现接口,而接口是对类的一种观察. 因此接口往往使用形容词命名, 也有许多接口使用名词命名的.
35.任何需要该接口类型的变量的地方可以用实现它的类的变量去代替。
36.将(静态)类型为 A的引用变量强制转换为A 的子类型B 的数据是Java 语言最常见的一种强制类型转换,这种转换是否成功在运行时检查。当且仅当(静态)类型为A 的引用变量的动态类型为B的子类型时这种转换才成功,否则会抛出运行时异常。
37.当一个类所实现的多个接口中定义了同名的数据成员时,在这个类中都需要使用接口名方式来区分它们。
38.一个类不能同时实现两个具有同名同形式参数列表但返回类型不同的成员方法的接口。
39.如果一个非抽象类要同时实现的多个接口中有相同的(名字、参数、返回值)抽象方法则,非抽象类只需要实现一个。
40.类不允许继承接口,接口也不允许继承类。接口可以继承多个接口,当一个类实现一个接口时,实际上要实现该接口及其祖先接口所定义的所有方法时才不会被认定为抽象类。
41.允许超类和子类同时实现同一个接口并给出不同的实现。
42.一个接口不能同时将含有同名同参数但不同返回类型的方法的两个接口作为祖先接口,因为按照Java 语言的语法规则,这种接口永远都无法被类实现。
43.类成员的访问控制方式
| 私有成员 | 默认成员 | 受保护成员 | 公有成员 |
同一个类中是否可见 | 是 | 是 | 是 | 是 |
同一个程序包的后代类是否可见 | 否 | 是 | 是 | 是 |
同一个程序包的非后代类是否可见 | 否 | 是 | 是 | 是 |
不同程序包的后代类是否可见 | 否 | 否 | 是 | 是 |
不同程序包的非后代类是否可见 | 否 | 否 | 否 | 是 |
44.Java 语言的嵌套类可分为两种:一种是直接定义在类作用域范围的嵌套类,这种嵌套类是类的成员,所以称为成员类,而定义它的类称为该成员类的外围类;一种是定义在类的某个方法体甚至某个花括号对括起来的局部作用域块的嵌套类,这种嵌套类称为局部类。非静态成员类、局部类(包括有名的和匿名的局部类)通称为内部类。
45.非静态成员类的对象实例必须在有定义它的外围类的对象实例存在的情况下才能创建,其对象实例保存有指向它的直接外围类对象实例的引用,静态成员类的对象实例创建则不受此限制。非静态成员类内部不能定义静态成员,而静态成员类则可以定义任意形式的成员。
46.非静态成员类是实现回调机制的最佳选择。静态成员类实际上与顶层类没有本质的差别,可以像顶层类一样使用,只是恰巧被定义在某个类的内部,需要使用带有层次结构的类名进行访问而已。
47.内部类有与外围类某个成员同名时。在内部类中,“外围类名.this ”就是指向与内部类当前对象实例相关联的外围类对象实例,而 this 则指向内部类的当前对象实例。
48.当外围类被继承之后,它的子类可重定义该外围类的内部类,但这种重定义不会产生运行时多态;但若将捕获并处理异常的语句放在循环中则可在某种程度上模拟唤醒的效果不管try 语句块的语句是否抛出异常,也不管catch语句块是否捕获到异常,finally 语句块的语句总会执行。甚至在执行到 try语句块或catch语句块的return 、break或continue 语句时,也会在程序控制跳出语句try...catch...finally...之前执行 finally 语句块的语句。当try 语句块的语句抛出一个不与任何 catch后面声明的异常类型相匹配的异常时,仍将执行 finally 语句块中的语句,然后才将控制转向捕获该异常的(上层)方法。
49.构造函数中不适合使用finally
public ClassConstructor(...)
{
try
{
... // 申请各种资源,一旦某资源申请成功就对其设一个标志
}
catch (Exception exc)
{
//类Exception将匹配任何类型的异常(除类Error的对象之外)
// 通常当抛出类Error的对象时标志系统已经发生不可恢复的严重错误,
// 能否正确释放已经占用的资源都是问题,因此使用类Exception即可。
// 按与申请顺序相反的顺序释放那些标志已经申请成功的资源!
try
{
... // 最好将释放每一种资源的语句都放在try 语句块中,因为释放
// 资源仍然可能抛出异常,从而使得资源的释放不成功!
}
catch (...)
{
... // 释放资源时发生的异常应该捕获,并标志该资源释放不成功
}
... // 释放其它资源的语句类似
throw ... //抛出标识该对象实例没有创建成功的异常供上层程序处理
// 当然,如果有可能的话最好指明不能成功的确切原因,
// 如果有些资源申请成功,但没有释放成功也应报告相应
// 的原因。虽然这有些罗嗦,但当发生异常时(特别是使用
// 资源发生异常时报告给上层程序的信息越详细越好!
}
... //其它语句
}
50.方法的抛出异常声明不能用来区分重载,即仅是抛出异常不同的两个函数不是重载。
51.子类继承超类可重定义超类的方法,重定义时子类的方法必须与超类具有相同的参数列表和返回类型。但当超类方法有异常声明时,子类重定义的方法并不需要有与超类完全相同的异常声明。对于子类重定义方法的异常声明,Java 语言一条最基本的规则是:子类重定义方法声明抛出的每个异常类都必须是超类方法声明的某一个异常类本身或其后代类,但不是超类方法声明的每个异常类都必须在子类方法声明抛出。
52.如果方法调用时不在方法体内处理被调用者声明抛出的异常,调用者必须声明被调用者抛出异常类或者其超类异常。
53.Java 语言不直接支持程序断言机制,仅支持部分断言(assert)。类不变式(class invariant )用于描述类的所有对象实例必须满足的性质。
54.程序一般不必捕获和处理AssertionError 类型的异常。Java 语言的设计者将其作为Error的子类,因此它是无需检查的异常类。
书写检测断言的一种形式是:assert ConditionExpression
相当于
if (! ConditionExpression)
{
throw new AssertionError()
}
书写检测断言的另一种形式是:assert ConditionExpression : InitialExpression
if (! ConditionExpression)
{
throw new AssertionError(InitialExpression )
}
55.类 System 声明in 为InputStream 类型的公有静态常量,out 和err为PrintStream类型的公有静态常量,并且进行了合适的初始化,包括将对象in 关联到标准的输入设备(通常是键盘),对象out 关联到标准的输出设备(通常是显示器),对象 err关联到标准的错误输出设备(通常也是显示器)。
56.类File 不属于 Java 流系统,但它是文件流进行文件操作的辅助类,可用来操纵文件及文件目录。
57.回调(callback)涉及到两个角色,一个角色是被调用者(callee), 一个角色是调用者(caller)。被调用者提供一些可调用的方法供调用者在适当时候调用,调用者负责监听一些条件,当某条件满足时,回调被调用者提供的方法。回调在事件驱动的系统中被广泛使用。图形用户界面系统就是典型的事件驱动系统。
58.静态类是声明在外围类中, 作为外围类的静态成员的嵌套类。静态类的对象实例可以独立创建,没有指向外围类的对象实例的引用,也不与任何外围类的对象实例相关联。
59.一个方法无法简单地返回多个基本数据类型的数据。使用静态类可以很好地解决这一问题
60.Java语言只支持异常的逐层报告,不支持异常的越级报告,也不支持在处理异常之后重新唤醒被异常中断执行的方法。
61.Java 语言将异常看作一种特殊的对象,可以象其他对象一样被创建。注意创建异常对象
62.本身不是产生异常,而是因为发生了某种异常而创建标识该异常的对象,以方便报告、捕获与处理。
63.一个方法如果要抛出某种类型的异常,而它自己又没有捕获和处理该异常,则在方法体的之前要用 throws 语句声明该方法会抛出此种异常。
64.类Throwable 有两个子类 Exception 和Error。类 Exception 及其后代类标识上述意义上的“异常” ,即很少发生的一些特殊事件,而类 Error 及其后代类标识一些导致程序完全无法执行下去的“错误”
65.RuntimeException是Exception的一个子类,用于标识 Java 程序在运行时可能会发生的一些常见的异常,例如被 0 除、数组下标越界等。
66.异常类都从类Throwable 继承了一些方法,其中最常用的是printStackTrace()方法,该方法打印创建当前异常对象时的调用栈。
67.Java 编译器将所有异常划分为需要检查的异常(checked exception)和无需检查的异常(uncheckedexception)。
需要检查的异常是指当一个方法体的语句会抛出该类型的异常时, 要么在这个方法中捕获该异常,要么在方法体之前用如下形式的throws 语句声明要抛出该类型异常,否则会产生编译错误:
返回类型 方法名(<参数列表>) throws <异常类列表>
{
... // 方法体
}
类 Error和 RuntimeException, 以及它们的后代类都是无需检查的异常。