抽象类、抽象方法
使用abstract修饰的类称之为 abstract类(抽象类)
使用abstract修饰的方法称之为 abstract方法(抽象方法)
abstract class People { // 使用abstract修饰的类称之为 abstract类
abstract int add(int x, int y); //抽象方法只能声明,不能实现,不允许有方法体
}
- abstract类中可以有abstract方法,也可以没有abstract方法;abstract类中也可以有非abstract方法。
- 非abstract类中不能有abstract方法。
- 不能使用final和abstract同时修饰同一个类,因为abstract类需要被继承,其子类可以是abstract类,也可以是非abstract类。
- 不能使用static修饰abstract方法。
- abstract类不能使用new关键字创建对象,abstract类需要被继承,其子类如果是一个非abstract类,需要重写abstract类中的抽象方法,即去掉abstract关键字,写出方法体。其子类如果是一个abstract类,它可以重写、也可以继承父类的abstract方法。
- abstract类虽然不能使用new创建对象,但可以声明对象,声明的对象可以作为其子类对象的上传型对象,那么该对象就可以调用子类重写的方法。
abstract类主要作用是抽象概括出一大类事物共同具有的行为标准,通过抽象方法来实现,即只需要给出方法头,不需要给出方法体。不同的子类继承同一个抽象方法时,可以重写出各自不同的方法体,这样不同子类的对象就可以产生各自不同的行为。
abstract class Human { //人类
abstract void speak(); //抽象概括出人类会说话
abstract void eat(); //抽象概括出人类会吃饭
}
class Chiness extends Human { //中国人继承人类
void speak(){ //重写父类抽象方法
System.out.println("你好,世界!");
}
void eat(){ //重写父类抽象方法
System.out.println("爱吃饺子。");
}
}
class American extends Human { //美国人继承人类
void speak(){
System.out.println("Hello world!");
}
void eat(){
System.out.println("I like steak.");
}
}
class Boy {
Human boy; //成员变量,声明一个Human类对象,Human是抽象类,只能声明,不能使用new创建对象
void setCountry(Human b){ //形参是一个Human类的对象
boy = b;
}
void act(){
boy.speak();
boy.eat();
}
}
public class test {
public static void main(String args[]){
Human jackey = new Chiness(); //jackey是上转型对象
Boy boy = new Boy();
boy.setCountry(jackey);
boy.act();
jackey = new American();
boy.setCountry(jackey);
boy.act();
}
}
面向抽象编程:abstract类只需要关心有哪些行为,不需要关心这些行为的具体实现。具体实现的部分交给子类程序设计者。使用多态进行程序设计的核心技术之一就是上转型对象的使用。面向抽象编程,即设计某种重要类时,面向抽象类,所设计类中的重要数据是抽象类声明的对象。
开-闭原则:让设计的系统对扩展开放,对修改关闭。在程序设计之初就考虑了以后的变化,设计了一个基本结构,当用户需求变化时,不需要再修改已有的模块,只需要扩展新的功能即可。符合开-闭原则的系统,更易于维护。