一、抽象类的概念
包含一个抽象方法的类就是抽象类,其本质是对多个普通类中相同的部分的抽象。
二、抽象类的特点
1.抽象方法和抽象类使用 abstract 修饰;
2.有一个抽象方法的类必须是抽象类;
3.抽象类中一定有抽象方法,反之不成立;
4.抽象类不能够实例化 ,即不能创建对象;
5.抽象类的成员一般使用 public 或者 protected修饰;
6.抽象类的抽象方法强制子类重写;
7. 抽象类中所有的内容均是用来给子类使用;
三、抽象类与普通类的区别
抽象类和普通类在结构上的区别:抽象类有抽象方法,而普通类没有。
四、抽象类的子类的特点
1 如果子类想要继承抽象类,就必须实现抽象类中所有的抽象方法;
2 如果子类不想实现父类的抽象方法,那么子类必须升级为抽象类。
五、代码演示
例:编写一个交通工具类,具有前进run()功能,其子类有自行车、小轿车、地铁,重写父类方法。
主人有属性name,age属性,方法回家goHome(交通工具),需要使用交通工具,使用抽象类优化程序。
public static void main(String[] args) {
Hoster hoster = new Hoster("张三", 30);
Vehicle v = new Bike(); //使用多态创建对象
hoster.goHome(v); //调用goHome()方法
//创建匿名对象new Car(),并将其作为goHome()方法的形式参数
hoster.goHome(new Car());
//创建匿名对象new Hoster("李四", 31)并赋值,再调用goHome()方法
new Hoster("李四", 31).goHome(new Subway());
}
class Hoster {
private String name;
private int age;
public Hoster() {
super();
}
public Hoster(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void goHome(Vehicle v) {
v.run(this); //将参数传递给此处goHome方法,再调用this所指向对象 // (谁调用的goHome就指向谁)的run()方法。
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
abstract class Vehicle { //abstract修饰的抽象类
public abstract void run(); //abstract修饰的抽象方法
public abstract void run(Hoster hoster); //abstract修饰的抽象方法
}
class Bike extends Vehicle {
@Override //run()方法重写
public void run() { //实现父类中的抽象方法
System.out.println("自行车在跑");
}
@Override //run(Hoster hoster)方法重写
public void run(Hoster hoster) { //实现父类中的抽象方法
System.out.println(hoster.getName() + "骑着自行车回家"); //执行
}
}
class Car extends Vehicle {
@Override //run()方法重写
public void run() { //实现父类中的抽象方法
System.out.println("小轿车在跑");
}
@Override //run(Hoster hoster)方法重写
public void run(Hoster hoster) { //实现父类中的抽象方法
System.out.println(hoster.getName() + "开着小轿车回家"); //执行
}
}
class Subway extends Vehicle {
@Override //run()方法重写
public void run() { //实现父类中的抽象方法
System.out.println("地铁在跑");
}
@Override // run(Hoster hoster)方法重写
public void run(Hoster hoster) { //实现父类中的抽象方法
System.out.println(hoster.getName() + "坐着地铁回家"); //执行
}
}