继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
implements关键字
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
当存在不同类继承的时候,先引用最初始的父类,例如:
import java.math.*;
import java.util.*;
class Parent{
public Parent() {
System.out.println("Parent类");
}
}
class Son extends Parent{
public Son() {
System.out.println("Son类");
}
}
public class Main extends Son {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
Main main = new Main();
/*
运行结果:
Parent类
Son类
*/
}
}
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
import java.math.*;
import java.util.*;
class Parent{
public void GetParent() {
System.out.println(getClass().getName()+"类"+"Parent类");
}
}
class Son extends Parent{
public void GetSon() {
System.out.println(getClass().getName()+"类"+"Son类");
}
public void Test() {
this.GetSon(); // this 调用自己的方法
this.GetParent();
super.GetParent(); // super 调用父类的方法
}
}
public class Main extends Son {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
Parent parent = new Parent();
parent.GetParent();
Son son = new Son();
son.GetSon();
/*
运行结果:
Parent类Parent类
Son类Son类
*/
}
}
final关键字
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
声明类:final class 类名 {//类体}
声明方法:修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
( 注意:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final )
构造器
子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。
import java.math.*;
import java.util.*;
class Parent{
private int i;
public Parent(){
System.out.println(getClass().getName()+" 类的 "+"Parent()" + i);
}
public Parent(int i) {
System.out.println(getClass().getName()+" 类的 "+"Parent(int i)" + i);
this.i = i;
}
}
class Son extends Parent{
private int i;
public Son() {
super(2); //调用父类 Parent(int i) 构造方法
//如果这里不使用 super() 关键字调用有参构造方法,则系统会自动调用父类的无参 Parent() 构造方法。
System.out.println(getClass().getName()+" 类的 "+"GetSon()" + i);
}
public Son(int i) {
//如果没有使用super关键字,系统会自动调用父类的无参构造器。
System.out.println(getClass().getName()+" 类的 "+"GetSon()" + i);
this.i = i;
}
}
public class Main extends Son {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
Son son1 = new Son();
Son son2 = new Son(3);
/*
运行结果:
Son 类的 Parent(int i)2
Son 类的 GetSon()0
Son 类的 Parent()0 //没有使用super关键字,系统会自动调用父类的无参构造器,所以输出Parent()
Son 类的 GetSon()3
*/
}
}