一、介绍
Java中提供了两种类:具体类和抽象类。
1、abstract意思为“抽象的”,用abstract关键字来修饰一个类时,这个类就叫做抽象类。
语法:访问修饰符 abstract 类名{
}
public abstract class A{
}
2、用abstract关键字来修饰一个方法时,这个方法是抽象方法。
语法:访问修饰符 abstract 返回值类型 方法名(参数类表);
public abstract void hello();
注意:抽象方法无方法体,只声明。
二、特点
1、抽象类不能实例化。
public class C {
public static void main(String[] args) {
System.out.println("hello!");
// D d=new D() ;----->报错
}
}
abstract class D{
}
2、一个类中含有抽象方法则这个类一定为抽象类。
3、抽象类中可以不含有抽象方法。
4、abstract只能修饰类和方法,不能修饰属性和其他的。
5、抽象类可以有任意成员(抽象类的本质还是类),比如:非抽象方法、构造器、静态属性、静态方法等。
public abstract class D{
public int a =10;
public String name="jack";
public D(){
System.out.println("抽象类D的无参构造方法!");
}
public void hi(){
System.out.println("Hello World!");
}
public static void ok(){
System.out.println("ok!");
}
public abstract void hello();
}
6、抽象方法不能有主体,即不能实现。
7、如果一个类继承了抽象类,则它必须实现抽象类中所有的抽象方法,除非它自己也声明为abstract类
public abstract class E{
public abstract void walk();
}
abstract class F extends E{
}
class G extends E{
@Override
public void walk() {
}
}
8、抽象方法不能使用private、final和static来修饰,因为这些关键字都是与重写相违背的。
三、抽象类的作用
当父类知道子类要完成某种行为,但每个子类的实现方式又不一样时,于是该父类就把行为定义为抽象方法的形式,具体实现交给子类去完成,此时这个类就可以声明为抽象类。
例如:
先声明一个Cat类,Cat需要有睡觉这一方法
public class Cat{
public void sleep(){
System.out.println("我正在睡觉!");
}
}
再声明一个Dog类,Dog也需要睡觉这一方法
public class Dog{
public void sleep(){
System.out.println("我正在睡觉!");
}
}
这里的Cat与Dog都有共同的行为,若存在一个父类Animal类同样有睡觉的方法,且父类与子类“睡觉”这一方法完全相同,则子类可以完全继承父类这一方法。
public class Aniaml{
public void sleep(){
System.out.println("我正在睡觉!");
}
}
public class Cat extends Animal{
@Override
public void sleep() {
super.sleep();
}
}
public class Dog extends Animal{
@Override
public void sleep() {
super.sleep();
}
}
若在此时给Dog和Cat添加一个eat()的行为,不同的是,Dog吃的是骨头,Cat吃的是鱼,此时就可以将Dog和Cat作为子类,抽象出eat()这个行为作为抽象方法放在父类中
public abstract class Aniaml{
public void sleep(){
System.out.println("我正在睡觉!");
}
public abstract void eat();
}
子类Cat重写eat()方法
public class Cat extends Animal{
@Override
public void sleep() {
super.sleep();
}
@Override
public void eat() {
System.out.println("小猫吃鱼!");
}
}
子类Dog重写eat方法
public class Dog extends Animal{
@Override
public void sleep() {
super.sleep();
}
@Override
public void eat() {
System.out.println("小狗吃骨头!");
}
}
创建一个测试类:由于父类Animal是抽象类,无法实例化对象,只能通过对子类的实例化对象来调用方法。
public class AbstractTest {
public static void main(String[] args) {
System.out.println("狗的行为--------------------");
Dog dog= new Dog();
dog.sleep();
dog.eat();
System.out.println("猫的行为--------------------");
Cat cat= new Cat();
cat.sleep();
cat.eat();
}
}