Java知识点滴(三)

第三章 对象和类

33、(P117) 必须特别注意避免名字之间发生冲突,解决的办法是用程序包(package)的形式组织Java程序。

34、(P118) Java源代码文件是以.java为扩展名,其内只有一个public类,该公有类的名字就是该源文件名。在一个源文件内只能有一个公有类,但可以定义多个非公有类或接口。当编译Java源文件时,对其中的每一类都将产生一个扩展名为.class的类文件。

35、(P123) 如果一个源文件开头没有package语句,则该编译单元的类和接口将隐含地(自动地)被置于由Java系统所定义的缺省包里(Default Package)。缺省包内的所有类和方法只能被缺省包内的其它类和方法调用,而不能被其它程序包内的类和方法所访问和使用。

36、(P123 - P124) 有三种类型的类:公有类(public)、私有类(private)、缺省类(或称友类,不需要 访问控制符 的修饰)。
    公有类在所有包中都是可见的。Java为用户提供的标准类几乎都是公有类。 
只有内部类才允许声明为私有类,而普通类或包含内部类的外部类不允许声明为私有类。
    当一个类没有使用访问控制符时,把该类称为缺省类或友类。友类可以被处于同一个程序包中的所有其它类所访问和使用,但不能被其它程序包中的类和方法访问和使用。一个源文件里的几个类肯定互为友类,因为它们肯定属于同一个程序包。

37、(P125) 类的访问控制符只有: public 、 private 和 缺省 这三种。
           成员变量和方法的访问控制符有: public、private、protected 和 缺省 四种。

38、(P128) 用修饰符 static 声明的成员变量称为“静态成员变量” 或者“类变量”, 没有用 static 声明的成员变量称为“实例成员变量”。  静态成员变量是它所属类所有对象共享的,只要类装载完成,它就已经存在。 实例成员变量只有在创建一个对象时才生成该对象的实例成员变量,各对象间的实例成员变量值是相互独立的。

39、(P130) 访问静态成员函数有两种方法:a)通过一个具体对象访问;b)通过类名访问;访问实例成员变量必须通过具体的对象。

40、(P130) 静态成员变量和实例成员变量没有被赋初值时,系统将会自动地对其进行初始化。(参见第23条)

41、(P131) Java提供一种用修饰符static开头的语句块对静态成员变量进行初始化。只要一个类被装载好,该类的静态成员变量就存在,并立即执行这些初始化语句块。注意:static开头的语句块必须在定义静态成员变量的语句之后。

42、(P135) 在方法定义中,用static说明的方法称为 静态方法 或 类方法, 没有用static说明的方法称为实例方法。
           在静态方法体内,只能对静态变量进行操作,不能对实例变量进行操作,也不能直接调用实例方法。  在实例方法体内,既可以访问实例变量和实例方法,也可以访问静态变量和静态方法。

43、(P138) 通过一个对象调用它所属类的一个方法,就是向该对象发送一条消息。消息名就是方法名,而方法的参数表内则指明了该消息应带来的各种信息, 方法的返回值是为响应消息而向消息发送者发送的返回信息。

44、(P143 - P145) 方法重载(overload):对于一些功能相同、而参数相异的多个不同的方法体可以使用相同的方法名,这就构成了重载方法。重载方法仅以参数的个数、每个参数的数据类型以及它们在参数表中排列的顺序加以区分。这里特别强调三点,a)、要求的是参数类型不同而不是参数名不同;b)、若仅是方法的返回类型,或者访问控制符不同是不能区分重载方法的;c)、调用重载方法时,系统按照实参表中所列的参数,选取其中与之匹配形式最接近的一个方法调用。当实参列表与各重载方法的参数列表不完全匹配时,按照c)的原则进行。
           
45、(P146) 方法的调用:Java中为了确保安全性全部采用方法的"传值调用(Call by value)"。传值调用的实现机制是系统将实参拷贝一个"副本",即复制件给形参,在方法调用时系统才给形参分配内存空间,并将对应的实参值传给形参。 在被调用方法体内,形参的改变只影响副本中的形参值,而不影响调用方法中的实参值。所以说,传值调用的特点是数据的"单方向传递"。

46、(P152) 构造方法:构造方法以类名作为方法名,且不能指定返回类型和返回值,连void也不能写。构造方法只能用public、 private、 protected访问控制符修饰, 而不能使用abstract、static、final、native、synchronized修饰。构造方法可以重载,事实上,几乎每个类都定义了多个构造方法,以适应创建对象时,对象的参数具有不同个数和类型的情况。  (P154) 每个类至少需要一个无参数的构造方法。若某个类一个构造方法都未提供,系统将提供一个什么也不做的即方法体为空的默认构造方法来初始化对象,只要某个类定义了一个构造方法,系统就不再提供默认构造方法。                                                                               

47、(P154) 复制构造方法:当创建一个新对象p2时,可用同类(class)的一个已存在的对象p1去初始化新对象。它将已存在对象p1的每个成员变量的值都复制给新对象的对应成员变量,即按每个成员变量在类中说明的顺序,每次复制一个成员变量,并称为实现“同类对象的位模式拷贝”。复制构造方法的一般格式为:X(X 引用变量名) { 同类对象的位模式拷贝操作 }。 (P155) 与C++不同,Java不提供默认的复制构造方法,所以,当用户用已存在对象去初始化新对象时,必须自行定义复制构造函数。

48、(P155 - P156) this引用变量:this引用变量是作为隐含的参数自动传递给实例方法的。在实例方法体内,可以隐含使用this引用访问该类的成员变量,不管它们是公有的、私有的还是保护的,都可以直呼其名地访问它们。 注意:a) 只有实例方法才拥有this引用,而类方法不拥有this引用。  b) 对于重载构造方法,可以在一个构造方法体内使用“ this(参数表)”形式来调用本类另一个构造方法。 但注意,“this(参数表);”这条语句必须是构造方法体内的第1条语句。  c) 通常不显式使用this引用,但是,当一个类的成员变量与其方法体内的自动变量(包括方法的形参)同名时,必须显式地使用this引用。

49、(P156 - P157) 对象的自动回收:Java虚拟机会自动地检测出那些不再使用的对象并自动地释放它们所占用的内存空间,这一功能是由Java虚拟机中的一个称为垃圾收集器(Garbage Collector)的程序模块来完成的。应注意如下两点:a) 运行垃圾收集器要耗费比较多的执行时间。因此,Java虚拟机采用一个单独的线程专门负责垃圾回收,并设置为低优先级,一般是在系统运行的空闲期间才启动,或者是内存空间已经耗尽,或者是已分配的内存空间超过某个阈值时才调用。java.lang.System类还提供了一个gc()方法,可以强制性地回收垃圾。b) 垃圾收集器只释放那些由new运算符所创建对象的内存空间,并不对系统资源进行清除和完成其他一些清除工作。因此,象c++中的析构函数一样,Java的最顶层类提供了一个finalize()方法,编程者可以根据需要在自己编写的类中重新编写一个finalize()方法,在方法体内根据需要对系统资源进行处理以及完成其他一些清除工作。

50、(P157) 数组概述: 在Java中,数组也是当成一种对象来处理,因此数组的创建也是用new运算符。当数组不再使用时,也是由Java虚拟机的垃圾收集器自动地回收数组元素所占有的内存空间。Java数组元素的数据类型可以是基本数据类型、对象的引用变量或者是对其他数组的引用。

51、(P158) 数组的创建和初始化示例:  a) 对于基本数据类型的数组 如,int [] intArray = {8, 16, 32};   b) 对于对象引用类型的数组, 在声明数组后,还必须再用 new 运算符创建每一个对象, 如,
                                 Class1 [] s = new Class1[3];
                                 for(int i = 0; i < 3; i++)
                                 {
                                   s[i] = new Class1();
                                 }

52、(P159) Java数组具有以下特点: a) 所有数组都隐含有一个只读的成员变量length; b) 用表达式"数组名[i]"可以访问数组元素,i为下标,其范围为 0 --- (length - 1)。 c) 与C++不同,它会自动检查数组下标是否越界,一旦越界,系统停止执行,并输出一条ArrayIndexOutOfBoundsException的异常错误信息。

53、(P161) 包装器类:Java仍保留有8种基本数据类型,它们不具有对象的属性和行为,这对于研究各种算法是不利的,因为算法应该与数据类型无关。为此,Java对所有基本数据类型提供了对应的包装器类。    所有Java的8种数据类型在java.lang包中都有一个对应的包装器类,它们都是抽象类Number的直接子类。对应关系如下:boolean --- Boolean ;  byte --- Byte ; char --- Character ; short --- Short ;
int --- Integer ; long --- Long ; float --- Float ; double --- Double 。

54、(P163) 数组作为一个方法的参数:由于Java的数组被看作一种对象,数组名就是这种对象的引用,所以它可以把整个数组都传递给一个方法,在该方法体内能任意改变每个元素的值。

55、(P166) 多维数组:Java的多维数组与一维数组一样,也是看作对象,同样经历声明、创建和初始化等三个步骤,只不过用多对方括号表示它的维数。两对方括号表示二维数组,三对方括号表示三维数组,如此类推。


 

原文地址:https://www.cnblogs.com/it_han_ku/p/458634.html