java第三天学习内容回顾——java白皮书第四章

  • java面向对象程序设计中使用到名词理解:对象标识==一个实例的变量名、对象行为==一个类的方法、对象状态==类中的数据域(严格讲是可以发生变化的数据域);

  • 类之间的关系:use_a,has_a,is_a三种

  • java中的Math类有些特殊,它只封装了功能而并不涉及数据域,所以不需要也不必隐藏数据

  • java中的对象变量名更像是个指针(像),声明一个对象实例后必须用new构造对象然后用=将两者链接起来,也可以用=将两个不同的对象变量连接起来,但此时需要注意,就像指针赋值一样,两个变量自此将共享同一个对象实例,对象变量并没有包含一个对象实例,而是引用了一个对象实例,可以显式的将对象变量设置为NULL,用于表示此对象变量并没有引用任何对象实例,需要注意的是局部(对象)变量不会自动初始化,需要通过new或者null(必须小写)对其赋值

  • java中的对象变量全都放在堆中,当一个对象包含另一个对象变量时,就是这个对象包含指向另一个堆对象的指针。

  • java中深拷贝对象必须利用clone方法

  • java中Date类用于表示时间点GregorianGalendar类用于表示日历,Date类提供了before、after方法用于比较时间点,同时也提供了getDay等方法,但是作者不提倡使用

  • 更改器方法:修改类对象数据域的方法

  • 访问器方法:仅读取类对象数据域的方法、与前者在语法上并没有区别

  • 在同一个源文件中,仅允许出现一个public类用于装载main方法,当编译时会将源文件中所有的类创建对应的.class文件,然后将有main方法的类名给字节码解释器以启动,但main方法可以包含于其他的类中,这样方便单元测试,可以通过IDE选定目标类,然后单元测试目标了,此时目标类中的main将会发挥启动作用。

  • 对于变种for循环,发现整型数组在循环块中的修改并不会保存下来,但如果是对象的话将会保留修改痕迹

  • 注意构造器是没有返回值的

  • 这里有一个因果关系:因为java中所有对象都放在堆中,所以创建时用new,与c++有区别

  • java中不能再构造器中声明与数据域同名的变量,虽然不会报错。

  • java中所有的方法必须在类内部定义(外壳类),但这并不代表所有的方法都是内联的。

  • 对于访问器方法的关注:访问器方法不应该 直接 返回 状态域(数据域) 的对象,因为接收变量会与此对象共享内存,从而可以通过接收变量间接修改此对象(虽然private) 应该做的是 返回此对象的拷贝,此处利用到.clone方法;

  • 对于类的访问权限问题:一个类的方法可以访问 所有 此类的对象实例中的数据域。而不是特定的对象实例中的数据域。 与C++不同

  • static 类中若存在此类型的数据,那么此类的所有对象实例都将会共享此数据,引用时是通过类名.引用,用于强调此数据是直属类域并非属于特殊的对象实例,静态常量 类型可以使类中的公共变量很安全。

  • 虽然理论上不能修改静态常量,但是如果利用setOut方法 可以突破这一约定,原理是此方法是本地方法,它将绕过java实现

  • 对于静态方法:不需要对象实例,直接通过类名.调用,这里有一个因果:所以不能访问对象实例中的数据域,这里有一个特例:除非对象实例中的数据域中存在静态数据,这样静态方法还是可以访问此数据的。同类中的静态变量类似,调用静态方法建议使用类名直接调用,从而达到强调其不依赖对象实例,是静态方法的目的。

  • 对20进行总结:使用静态方法的要求:1.不访问实例的数据域。2.让步,仅访问数据域中的静态域

  • 这里有一个方法 :工厂方法。

  • java中对于参数的传递只有一种形式:按值传递(先进行拷贝然后将拷贝得到的值进行传递)。于是这里有一个因果:所以方法的参数如果是基本类型,那么不会对其进行修改,但这里有个看似特例但实际上是情理之中的情况:如果方法的参数是一个实例对象,是可以实现对其数据域的修改的,原因如下:对象实例本身就是一个相当于引用存在的指针(相当于),所以就算对其进行拷贝,得到的也是一个引用,然后两个变量同时共享一个内存区,于是方法中对此内存区的修改是有效的

  • 注意,java中虽然对域(对象实例中的数据域,或者再高一层:存放在堆中的变量)可以进行默认的初始化例如数值默认初始化为0,boolean默认初始化为false,对象默认初始化为null,但局部变量并不会进行默认初始化,而且作者不提倡使用默认初始化,因为影响程序可读性。此时发现,白皮书中所提到到的域应该有一个共同特性就是在存放在堆上,例如一个数组,也会被默认初始化,因为数组其实是相当于一个指针=new,因此应该存储在堆中,然后它被默认初始化了。是否所有存放在堆中的数据都将被默认初始化?

  • java中类中数据域的变量都可以被直接初始化,此处不同于C++,当然也能通过构造函数初始化。而且,java直接初始化时也可是利用到方法。详述与白皮书P128页。还涉及到初始化块/静态初始化块,以及构造器的多重调用。。。。。。。。。。。。。此处较乱,真正用到时再琢磨。白皮书P131,有关内容详述。

  • 發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章