抽象类
先看下面三个类:
public class Father
{
public void eat()
{
System.out.println("吃饭...");
}
}
public class Student extends Father{
@Override
public void eat() {
System.out.println("正在吃饭...");
}
}
public class Tool {
public static void main(String[] args) {
Father father = new Student(); //多态。
father.eat();
}
}
输出:
正在吃饭…
Father father = new Student(); //多态。
father.eat();
上面是多态的形式,因为子类改写了eat方法,所以eat方法的内容与父类eat的方法体没有实质作用,因此,引入了抽象方法:没有方法体的方法。进而,引入了抽象类:一个类中如果有一个抽象方法,则该类必须为抽象类。
public abstract class Father //抽象类。
{
public abstract void eat(); //抽象方法。
}
抽象类需要注意几点:
1、抽象类有构造方法,但是不能创建对象。
创建了构造方法并没有报错,但创建对象时报错。
2、如果一个类没有重写完父类中的所有抽象方法,则该类必须为抽象类。
当父类有多个方法时:
如果子类没有重写完,将会报错:
此时若将子类改为抽象类,则不会报错:
3、抽象类中可以没有抽象方法。
抽象类中有不是抽象方法的main方法并没有报错。
4、抽象类与普通类的区别:
① 抽象类有abstract修饰 ,普通类没有。
抽象类有abstract修饰:
普通类:
② 抽象类不能创建对象,普通类可以创建对象。
抽象类创建对象时会报错:
普通类不会报错:
③ 抽象类中可以有抽象方法,普通类绝对不能有抽象方法。
抽象类可以有抽象方法,也可以没有:
但普通类一定没有抽象方法:
思考:
abstract final class Mammal{ } 能编译通过吗, why?
不能通过。如果抽象类前面加final意味着该类不能继承,则抽象类的抽象方法永远不能实现,所以不能加final。
Mammal抽象类中move抽象方法的访问权限可以为private吗,即“private abstract void move();”, why?
不可以,被private修饰的类只能在本类起作用,则抽象方法不能被实现。
Mammal抽象类中move抽象方法可以由static修饰吗,,即“public static abstract void move();” why?
不可以,如果加static修饰,则可以通过类名直接调用方法,可是抽象方法不能直接被调用,所以是无意义的。