继承
继承是一种根据已有类创构建新类的机制,利用继承可以先创建一个拥有共同属性的一般类,再根据该一般类创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据自身的需要添加新的状态和行为。
继承的作用:通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
例如:
运行结果为:
注意:
- 子类不能选择性继承父类;
- Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
- 构造方法不会被子类继承,但可以从子类中调用父类的构造方法。
关键字(this和super)
1.this关键字
this代表当前对象,当使用this.成员的形式可以用来调用当前对象中的成员变量或方法,当使用this()形式可以调用当前类中的构造方法。
调用成员方法
可参考如下代码
将会输出:
2.super关键字
super代表父类对象,当使用super.成员的形式可以用来调用父类对象中的成员变量或方法,当使用super()形式可以调用父类中的构造方法。
看下面简单应用
将会输出:
抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须通过继承的方式才能被使用。
定义
abstract class <类名>
{
abstract 方法名(形参列表 )
// 类体
}
范例如下:
运行结果:
接口(interface)
接口在Java语言中是一种引用类型,和类比较相似,和类的区别主要是接口中的方法全部是抽象方法并且是以interface来声明。
接口和抽象类一样无法被实例化,但是可以被子类实现(implements)。一个实现接口的子类,必须实现接口内所描述的全部方法,否则就必须将子类声明为抽象类。
关于接口的使用规范:
1、接口中可以定义常量,不能定义变量,如果你在接口中定义属性,那么通过反编译可以看见他会自动用public static final 修饰,接口中的属性都是全局静态常量,接口中的常量必须在定义时指定初始值。
2、 接口中所有的方法都是抽象方法,接口中方法都会自动用public abstract 修饰,即接口中只有全局抽象方法。
3、 接口不能实例化,接口中不能有构造。
4、 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
5、 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。
实现接口
类实现接口的语法格式如下:
1 . 创建一个名称为 IMath 的接口,代码如下:
2 . 定义一个 MathClass 类并实现 IMath 接口,MathClass 类实现代码如下:
在实现类中,所有的方法都使用了 public 访问修饰符声明。无论何时实现一个由接口定义的方法,它都必须实现为 public,因为接口中的所有成员都显式声明为 public。
3 . 最后创建测试类 NumTest,实例化接口的实现类 MathClass,调用该类中的方法并输出结果。该类内容如下:
程序运行结果如下所示:
在该程序中,首先定义了一个 IMath 的接口,在该接口中只声明了两个未实现的方法,这两个方法需要在接口的实现类中实现。在实现类 MathClass 中定义了两个私有的属性,并赋予两个属性初始值,同时创建了该类的构造方法。因为该类实现了 MathClass 接口,因此必须实现接口中的方法。在最后的测试类中,需要创建实现类对象,然后通过实现类对象调用实现类中的方法。