1、抽象类
当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现时无法确定的,例如定义一个Animal类,其中shout()方法用于表示动物的叫声,但针对不同的动物,叫声是不同的,因此在shout()方法中无法准确描述动物的叫声。
针对上面的情况,Java中允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰。含有抽象方法的类也必须使用abstract关键字来修饰,这个类为抽象类。
①抽象类是不可以被实例化的,因为抽象类中可能包含抽象方法,抽象方法没有方法体,不可以被调用。
如果想调用抽象类中的定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。如下面代码:
// 定义抽象类Animal
abstract class Animal {
// 定义抽象方法shout()
abstract void shout();
}
// 定义Dog类继承抽象类Animal
class Dog extends Animal {
// 实现抽象方法shout()
void shout() {
System.out.println("汪汪……");
}
}
public class Example10 {
public static void main(String[] args) {
Dog dog = new Dog(); // 创建Dog类的实例对象
dog.shout(); // 调用dog对象是的shout()方法
}
}
如果一个抽象类中的所有方法都是抽象的,则这个类可以用另外一种方式来定义,即接口。
接口和抽象类一样,是不可以被实例化的,因为抽象方法没有方法体,不可以被调用。
①如果想调用接口中的定义的方法,则需要创建一个类,并使用implements关键字实现接口中所有的方法。如下面代码:
interface Animal {
int ID = 1; // 定义全局常量
void breathe(); // 定义抽象方法breathe()
void run(); // 定义抽象方法run()
}
// Dog类实现了Animal接口
class Dog implements Animal {
//实现breathe()方法
public void breathe() {
System.out.println("狗在呼吸");
}
//实现run()方法
public void run() {
System.out.println("狗在跑");
}
}
// 定义测试类
public class Example11 {
public static void main(String args[]) {
Dog dog = new Dog(); //创建Dog类的实例对象
dog.breathe(); //调用Dog类的breathe()方法
dog.run(); //调用Dog类的run()方法
}
}
②当一个类实现接口时,如果这个类是抽象类,可以只实现接口中的部分方法即可,否则需要实现接口中的所有方法。
③接口也可以继承。(可以定义一个接口使用extends关键字去继承另外一个接口)如下面代码
interface Animal {
int ID = 1; // 定义全局常量
void breathe(); // 定义抽象方法breathe()
void run(); // 定义抽象方法run()
}
// 定义了LandAnimal接口,并继承了Animal接口
interface LandAnimal extends Animal { // 接口继承接口
void liveOnland(); // 定义抽象方法liveOnLand()
}
// 定义Dog类实现Animal接口
class Dog implements LandAnimal {
//实现breathe()方法
public void breathe() {
System.out.println("狗在呼吸");
}
//实现run()方法
public void run() {
System.out.println("狗在跑");
}
// 实现liveOnLand()方法
public void liveOnland() {
// TODO Auto-generated method stub
System.out.println("狗生活在陆地上");
}
}
// 定义测试类
public class Example12 {
public static void main(String args[]) {
Dog dog = new Dog(); // 创建Dog类的实例对象
dog.breathe(); // 调用Dog类的breathe()方法
dog.run(); // 调用Dog类的run()方法
dog.liveOnland(); // 调用Dog类的liveOnland()方法
}
}
④一个类在继承另外一个类时还可以实现接口,此时,extends关键字必须位于implements关键字之前。
class Dog extends lei1 implements Animal {
......
}