Java基础笔记1

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, 以及它们的后代类都是无需检查的异常。

68.异常的抛出可能有三种形式:一是 JVM 检测并抛出的异常,通常这种异常是 Error或 RuntimeException 的子类,例如 NullPointException;二是使用 Java API 提供的方法抛出的异常,程序员应该做出相应的处理;三是程序使用 throw语句显式地抛出某种异常, 这是一个方法向它的调用者报告异常的基本形式。但若将捕获并处理异常的语句放在循环中则可在某种程度上模拟唤醒的效果。

69.输入输出流中的字节流是一种顺序的、平坦的字节序列,因此要将对象写入输出流实际上要建立对象图与字节流之间映射关系,这种映射就是对象的串行化,而将对象从输入流读取的过程就是对象的反串行化。对象串行化使得内存中的对象可以保存到外存储器,或者在网络上进行传输,这都实现了对象的持久性。对象的持久性是指对象的生存期超过了创建它的程序的运行时间。对象保存到外存储器后,我们可以在另一个程序(或线程)读取和使用该对象.

70.使用字符串"."作为参数,表示创建的对象path 与当前目录(即工程文件夹)相关联。

71.面向字符的文件流不能处理二进制文件的主要原因是因为这种流对象在读写文件时会解释和处理文件中的特殊字符,例如回车符(\0x0d) 、换行符(\0x0a) 、文件结束符(\0x1a) 等,特别地,当它碰到文件结束符时就会认为文件已结束,而二进制文件可能在文件中间就出现文件结束符。

72.Java API 提供的输入/输出流都只能顺序读写流中的数据,Java API 提供类RandomAccessFile 以支持文件随机读写。类 RandomAccessFile 不属于Java API 的流系统,直接是根Object 的子类,但它融合了流类 InputStream 和OutStream的功能,既提供与 InputStream 类似的read() 方法,又提供与 OutStream类似的write()方法,还提供更高级的直接读写各种基本数据类型数据的读写方法,例如readInt()和writeInt() 等。

73.类RandomAccessFile设置了文件指针,该指针以字节为单位,通过从文件开头开始计算的偏移量来指明当前读写的位置。提供移动文件指针的方法seek(longpos) ,其中pos 是移动后文件指针的位置。类RandomAccessFile提供了方法 getFilePointer()返回文件指针的当前位置。

74.UTF 编码是Unicode 编码集的一种具体实现,能够正确处理中文字符(例如,一个汉字被当作一个字符,而如果是使用ASCII 编码的字符,可能会将一个汉字看作两个ASCII 编码的字符)。一个汉字UTF格式占3个字节?

75.在某些时候我们需要动态地为一些特定的对象扩充功能,而不是静态地为该对象所属的整个类扩充功能,因此需要提供一种有别于继承机制的手段来扩充已有对象的功能,这就是所谓的装饰(decorate),或者称为包装(wrap)。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值