首先回顾之前学习的知识可知:一个类的组成有三个部分,构造函数、成员变量、成员方法(也就是成员函数)。
在面向对象的世界当中,继承就是一个类得到了另外一个类当中的成员变量和成员方法,在JAVA中只支持单继承;
如下两处代码:
代码段一:
class Lesson7{
String str;
int a;
void funA{
System.out.println("FunA:the Str = " + str + " the a = "+ a);
}
}
代码段二:
class Lesson7_2 extends Lesson7{
}
代码段一是一个普通的类。
代码段二就使用了继承的方式定义。在是是有那个的时候用到了一个关键字"extends"。
其中Lesson7_2是子类,Lesson7是父类,在子类Lesson7_2中并没有定义任何的成员变量和成员方法,但是由继承的定义可知,Lesson7_2是包含有父类Lesson7中的成员变量和成员方法的。
编写测试代码如下:
class Test{
public static void main(String args []){
Lesson7_2 A = new Lesson7_2();
A.str = "Lesson7_2";
A.a = 20;
A.funA();
}
}
测试输出结果如下:
D:\Android\src>javac Lesson7.java
D:\Android\src>javac Lesson7_2.java
D:\Android\src>javac Test.java
D:\Android\src>java Test
FunA:the Str = Lesson7_2 the a = 20
D:\Android\src>
这也验证了子类Lesson7_2拥有父类Lesson7_2中的成员变量和成员函数。当然了,子类当中也可以加入一些父类没有的成员变量和成员函数。
如:
class Lesson7_2 extends Lesson7{
String str2;
int a2;
void funA2(){
System.out.println("It is funA2!");
}
}
通过把共同的成员变量和成员函数放在父类里面去,用继承的方式也可以减少代码的重复量,同时在工程中修改代码上会减少很多工作量。
/**************************************************华丽分割线*******************************************/
上述已经提到,子类可以集成父类的成员函数和成员变量,但是父类的构造函数是无法集成的。这就有了子类调用父类构造函数super的用法,同样使用super调用父类的构造函数也是为了子类为成员变量赋值和减少重复代码。
如:
class Lesson7{
String str;
int a;
void Lesson7(String str,int a){
this.str = str;
this.a = a;
}
}
class Lesson7_2 extends Lesson7{
super("Lesson7_2",20);
System.out.println("this Lesson7_2 fun()");
}
这里需要注意以下几点:
当在生成子类的过程中没有使用super调用父类的情况下,编译器会自动的生成一条super();也就是默认调用父类中无参数的构造函数。使用super来调用父类的构造函数,在编程的时候需要把super函数放在第一句。super调用父类中哪一个构造函数取决于传入的形参,根据形参的顺序、类型、个数等相匹配得到将要调用的父类中的构造函数,这一特征跟之前讲述的this用法也比较相像。
By Urien 2017年8月28日 21:08:22