标签:java
java中,复用代码有两种途径:
继承采用关键字extends实现。
java用super关键字表述超类的意思。
当创建一个子类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类创建的对象是一样的。对基类子对象的正确初始化也至关重要,而且也只有一种方法来保证这一点:在构造器中调用基类的构造器执行初始化。看下面这个例子:
public class Cartoon extends Drawing{ public Cartoon() { System.out.println("Cartoon constructor"); } public static void main(String [] args){ Cartoon cartoon = new Cartoon(); } } class Art{ Art() { System.out.println("Art constructor"); } } class Drawing extends Art { public Drawing() { System.out.println("Drawing constructor"); } }
可以发现,构建过程是从基类“向外”扩散的。如果构造器要带有参数,则子类构造其需要显示的用super调用基类的构造器。
在组合与继承之间选择
组合和集成都允许在新的类中放置子对象,组合是显示的这样做,而继承则是隐示的这样做。这二者该如何选择呢?这里有个规则:“is-a”(是一个)的关系用继承来表达的。而“has-a”(有一个)的关系则是用组合来表达的。
每个子类都可以看作为它基类的类型。这个过程称为向上转型。
final关键字通常指的是“这是无法改变的”。final常用于基本类型,表示final使数值恒定不变。而对于对象引用设为final,则表示引用恒定不变。一旦引用被初始化指向一个对象,将无法在把它指向其他对象。然而,对象自身的值确实可以被改变的。
空白final,指被声明为final但又未给定初值的域。这种情况将要求你一定在类构造器为其初始化。如:
public class Cartoon extends Drawing{ private final int i; public Cartoon() { i = 0; System.out.println("Cartoon constructor"); } public static void main(String [] args){ Cartoon cartoon = new Cartoon(); } }
final方法,用于将方法锁定,以防任何继承类修改它。
类中所有的private方法都隐示的指定为final的。由于无法取用private方法,所以u也就无法覆盖它。可以对private方法添加final修饰词,但并未产生额外的意义。但这个问题很容易造成误解。因为,如果你试图覆盖一个private方法(隐含是final的),似乎是奏效的,而且编译器也不会给出错误信息。如下所示:
public class Cartoon extends Drawing{ public Cartoon() { System.out.println("Cartoon constructor"); } private void play(){ System.out.println("Cartoon play"); } public static void main(String [] args){ Cartoon cartoon = new Cartoon(); } } class Drawing { public Drawing() { System.out.println("Drawing constructor"); } private void play(){ System.out.println("Drawing play"); } }
final类表示禁止继承该类。
标签:java
原文地址:http://blog.csdn.net/chenlei0630/article/details/40651045