首页 > 代码库 > JAVA学习笔记--组合与继承

JAVA学习笔记--组合与继承

  JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率。这里主要介绍两种代码复用方式:组合和继承。

一、组合

  组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成,因而称之为组合。这种方法只是复用了代码的功能,而不是它的形式。

 1 public class Combine{  
 2     public static void main(String[] args){
 3          /* 以下两行代码即体现了组合 */
 4         Combine1 com1 = new Combine1();        // 在新的类中创建现有类的对象
 5         Combine1 com2 = new Combine1(100); 
 6 
 7         /* 可以在新类中添加其他的代码 */
 8     }
 9 }
10 
11 class Combine1{
12     Combine1(){                                                       // 构造方法
13          System.out.println("这是一个组合实例");   
14     }
15     Combine1(int i){
16          System.out.println(i);  
17     }      
18 }    

  利用组合可以实现代码的复用,你可以通过组合利用一个现有类的代码,并为其添加一些新特性。

 

二、继承

  继承按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。继承是所有OOP语言不可缺少的组成部分,当然这也包括JAVA。在创建一个类时,总是在继承,这有可能是继承一个明确指明的类,也有可能是隐式继承JAVA的标准根类Object。继承关系通过关键字 extends 来实现,当声明一个类A继承自类B时,可以这样编写代码:

  class A extends B{

  }

其中,B称作A的父类或基类,A称作B的子类或导出类。

1)子类继承了父类中可访问的数据域和方法,还可以为其添加新的数据域和方法;

2)子类并不能访问父类的私有数据域,但可以通过公共的访问器来访问它;

3)继承是用来为 是关系(is-a) 建模的,但不是所有的是关系都要用继承来建模;

4)JAVA不支持多继承,一个JAVA类只能继承自一个父类,即单继承。JAVA提供接口(implements)来实现多继承。

5)子类不继承父类的构造方法。

  子类不能继承父类的构造方法。当创建一个子类的对象时,该对象包含了一个父类的子对象,这个子对象与你直接用父类创建的对象是一样的,二者区别在于后者来自于外部,而前者被包装在子类的对象内部。对于父类子对象的正确初始化也很重要而且只有一种方法,那就是 在构造器中调用父类的构造器来执行初始化子类的构造器会自动调用父类的默认构造器进行初始化的,但如果父类中定义了带参的构造器,那么需要手工调用父类的构造器,这时需要使用 super 关键字显式的调用父类的构造器,并配以适当的参数列表。调用父类的构造器必须是在子类构造器中要做到第一件事。下面是一个简单的例子:

 1 class Shape{
 2     /* 父类的私有数据成员,不能被继承 */
 3     private int a = 10;
 4     private int b = 20;
 5     
 6     Shape(int i){            // 构造器1
 7         System.out.println("调用基类构造器1");
 8     }
 9     
10     Shape(int i,int j){        // 构造器2
11         System.out.println("调用基类构造器2");
12     }
13     
14     /* 父类的共有方法,可以被继承 */
15     public void get_a(){        // 通过共有方法访问父类的私有数据成员
16         System.out.println("a = " + a);
17     }
18     
19     public void get_b(){
20         System.out.println("b = " + b);
21     }
22     
23     public void set_a(int a){    // 通过共有方法修改父类的私有数据成员
24         this.a = a;
25     }
26     
27     public void set_b(int b){
28         this.b = b;
29     }
30 }
31 
32 public class Circle extends Shape{
33     /* 子类新增的数据成员 */
34     private int radius;
35     private double area;
36     
37     /* 构造方法 */
38     public Circle(){
39         super(1);            // 调用基类构造方法1
40         get_a();
41         get_b();
42     }
43 
44     public Circle(int i){
45         super(1,2);            // 调用基类构造方法2
46         set_a(100);
47         set_b(200);
48         get_a();
49         get_b();
50         get_area(2);
51     }
52     
53     /* 子类中新增的方法 */
54     public void get_radius(){
55         System.out.println("radius = " + radius);
56     }
57     
58     public void get_area(int i){
59         this.radius = i;
60         area = radius*radius*Math.PI;
61         System.out.println("area = " + area);
62     }
63     
64     public void set_radius(int i){
65         this.radius = i;
66     }
67     
68     public static void main(String[] args){
69         Circle circle = new Circle();
70         Circle circle1 = new Circle(1);
71     }
72 }

注:super关键字可以调用父类的构造器,而且必须放在导出类构造器的第一行,只能调用一次,super()和this()不能同存构造函数第一行。

 

JAVA学习笔记--组合与继承