复用代码是java众多引人注目的功能之一,有两种方式可以达到复用的目的。

  • 组合,非常直观,只需要在新的类中产生现有类的对象,该方法只是复用了现有程序的代码的功能,而非它的形式。
  • 继承,按照现有类的类型来创建新类。

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

初始化基类

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

  • 对基类子对象的正确初始化至关重要,在构造器中调用基类构造器来进行初始化。
  • 如果没有默认的基类构造器或者想调用一个带参数的基类构造器使用super显示地编写调用基类构造器的语句,并配上合适的参数列表。
  • 调用基类构造器必须是你在导出类构造器中要做的第一件事。

protected关键字

在理想世界中,仅靠关键字private就够了,但在实际项目中经常会想要将某些事物尽可能地对这个世界隐藏起来,单仍然允许导出类的成员访问它们,关键字protected就是起这个作用的。

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


final 关键字

final数据

  1. 一个永不改变的编译时常量
  2. 一个在运行时被初始化的值,而你不希望它被改变。

对于编译期常量这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译时执行计算式,还可以减轻了一些运行时的负担。在java中,这类常量必须是基本数据类型,并且以关键字final表示。在对这个常量进行定义的时候,必须对其进行赋值

一个既是static有事final的域只占据一段不能改变的存储空间

当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑,对于基本类型数据,final使数值恒定不变,而对于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象,然而,对象其自身确实可以被修改的。

空白final

java允许生成“空白final”,所谓空白final是指被申明为final但是又没有给定初值的域,无论什么情况,编译器都确保空白final在使用前必须被初始化。但是空白final在关键字final的使用上提供了更大的灵活性,为此一个类中的final域就可以做到根据对象而有所不同,却又保持其恒定不变的特性。必须在域的定义处或者每个构造器中用表达式对final进行赋值,这正是final域在使用前总是被初始化的原因。

final参数

java允许在参数列表中以申明的方式将参数指明为final,这意味着你无法在方法中更改参数引用所指向的对象。

package finalUse;

public class Gizmo {
    public void spin(){
    }

}

java中基类 Java中基类和复类的区别_编程

final方法

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

package finalUse;

public class Gizmo {
    public final void spin(){
        System.out.println("Gizmo method spin()");
    }
}

java中基类 Java中基类和复类的区别_java中基类_02

final类

当将某个类的整体定义为final时(通常将关键字final置于它的定义之前),就表明了你不打算继承该类,而且也不允许别人这样做。换句话说,处于某种考虑,你对该类的设计永不需要做出任何改动,或者处于安全的考虑,你不希望它有子类。请注意,final类的域可以根据个人的意愿选择为是或不是final。不论类是否被定义为final,相同的规则都适用于定义为final的域。然而,由于final类禁止继承,所以final类中所有的方法都隐式的指定为final的,因为他们无法被覆盖。在final类中添加final修饰词,不会有其它意义。