Thinking in Java学习笔记 第七章:复用类

如果想初始化引用,可以在代码的下列位置进行:

  • 在定义对象的地方。这意味着他们总是能够在构造器被调用之前初始化
  • 在类的构造器中
  • 就在正要使用这些对象之前,这种方式成为惰性初始化。在生成对象不值得以及不必每次都生成对象的情况下,这种方式可以减少额外的负担
  • 使用实例初始化

继承语法:

创建一个类的时候,总是在继承,除非已明确指出要从其他类继承,否则就是在隐式地从Java的标准根类Object进行继承。

即便是一个程序中含有多个类,也只有命令行所调用的那个类的main()方法会被调用。可以为每个类都创建一个main()方法。这种在每个类都设置一个main()方法的技术可使每个类的单元测试都变得简便易行。而且在完成单元测试之后,也无需删除main(),可以将其留待下次测试。

为了继承,一般的规则是将父类的所有数据成员都指定为private,将所有的方法指定为public

当创建了一个子类的对象时,该对象包含了一个基类的子对象。这个子对象与你用父类直接创建的对象是一样的。两者的区别在于,后者来自于外部,而父类的子对象被包装在子类对象内部。

  • 父类构造方法总是会被调用
  • 父类构造方法在子类构造方法被调用之前调用
  • 即使你不为子类创建构造方法,编译器也会为你生成一个默认的构造方法,该构造方法将会调用父类的构造方法

如果父类和子类的构造方法都不带参数,编译器可以轻松地调用他们是因为不必考虑要传递什么样的参数问题。但是,如果没有默认的父类构造方法,或者想调用一个带参数的父类构造方法,就必须用关键字super显式地编写调用父类构造器的语句,并且配以适当的参数列表。

虽然编译器强制你去初始化父类,并且要求你要在构造方法起始处就要这么做,但是它并不监督你必须将成员对象也初始化,因此这一点上必须时刻注意。

finally中的清理方法中,必须注意对父类清理方法和成员对象清理方法的调用顺序,以防某个子对象依赖于另一个子对象情形的发生。一般而言,所采用的形式应该与C++编译器在其析构函数上所施加的形式相同;首先,执行类的所有特定的清理动作,其顺序同生成顺序相反(通常这就要求父类元素仍旧存活);然后,调用父类的清理方法。

许多情况下,清理并不是问题,仅需让垃圾回收器完成该动作就行。但当必须亲自处理清理时,就得多做努力并多加小心。因为,一旦涉及垃圾回收,能够信赖的事就不会很多了。垃圾回收器可能永远也无法被调用,即使被调用,它也可能以任何它想要的顺序回收对象。最好的方法是除了内存之外,不能依赖垃圾回收器去做任何事。如果需要进行清理,最好是编写你自己的清理方法。但不要使用finalize()

protected指明“就类用户而言,这是private的,但对于任何继承于此类的子类或者其他任何位于同一个包内的类来说,它却是可以访问的。”(protected也提供了包内访问权限)

向上转型:

  • 向上转型是子类往父类转型
  • 因为向上转型是从一个较专业类型向通用类型转换,所以总是很安全的
  • 向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取它们。

final:

  • 一个永不改变的编译常量
  • 一个在运行时被初始化的值,而你不希望它被改变
  • 用关键字final对一个常量进行定义的时候,必须对其进行赋值
  • 一个既是static又是final的域只占据一段不能改变的存储空间

当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑。对于基本类型,final使数值恒定不变;而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的。Java并未提供使任何对象恒定不变的途径(但可以自己编写类以取得使对象恒定不变的效果)。这一限制同样使用数组,它也是对象。final意味着无法将再次指向另一个新的对象。

Java允许在参数列表中以声明的方式将参数指明为final。这意味着你无法在方法中更改参数引用所指向的对象。你可以读参数,但却无法修改参数,这一特性主要用来向匿名内部类传递数据。

final方法:

  • 使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义。这是出于设计的考虑:想要确保在继承中使方法行为保持不变,并且不会被覆盖。
  • 过去建议使用final方法的第二个原因是效率。

final和private关键字

类中所有的private方法都隐式地指定为是final的,由于无法取用private方法,所以也就无法覆盖它。可以对private方法添加final修饰词,但这并不能给该方法增加任何额外意义。

final类

当将某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这样做。或者说处于某种考虑,你对该类的设计永不需要做任何变动,或者出于安全的考虑,你不希望它有子类。

初始化和类的加载

每个类的编译代码都存在于它自己的独立的文件中。该文件只在需要使用程序代码时才被加载。一般来说,可以说:“类的代码在初次使用时才加载。”这通常是指加载发生于创建类的第一个对象之时,但是当访问static域或者static方法时,也会发生加在(构造方法也是static的,只是没有显式地写出来)

继承与初始化

新建子类对象继承初始化过程为:

  • 新建一个子类对象,先初始化根基类的static域,然后是下一个子类,以此类推
  • 对父类所有成员变量进行初始化,基本类型设置为默认值,对象引用设置为null,这是通过将对象内存设为二进制零值而一举生成的。
  • 然后父类的构造方法将会被调用
  • 子类经历相同的过程
  • 在基类构造器完成之后,实例变量按其次序被初始化
  • 最后,该类的构造方法执行

笔记主要是给我自己用来记忆和查阅用,写的比较乱,可能会给你带来困扰,不好意思


欢迎关注我的个人生活博客:小之的个人博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值