抽象类的概述和特点
/*
抽象的表述:
我们之前所说的猫,狗,猪,羊驼,熊猫等等都是动物的具体的例子,而动物本身是一个抽象的
概念,而我们之前是将动物写成了一个类,而类又可以创建对象,但是呢,实际上抽象的东西本身应该不能
实例化,并且动物这个概念中吃的方法,以及动物共有的方法本身也是一个不具体的方法,
我们在今天之后,把一个不具体的功能,叫做抽象方法,而如果说一个类中包含有抽象方法的时候,
这个类叫做抽象类。
抽象类的特点:
1、抽象类和抽象方法要用abstract关键字修饰
修饰类 放在class前面
举例:
abstract class Animal3{}
修饰方法 放在访问权限修饰符的后面
举例:
public abstract void eat();
2、有抽象方法的一定是抽象类,抽象类不一定有抽象方法,具体的类中不能有抽象方法
3、抽象类不能被实例化
既然不能被实例化,那写在抽象类中具体的方法怎么去调用呢?
利用多态的形式,通过具体的子类实例化去调用方法
4、如果继承抽象类是一个具体的类,要重写抽象类所有的抽象方法
如果是一个抽象类继承抽象类,不需要重写抽象类中的方法
*/
//定义了一个抽象类,叫Animal3
abstract class Animal3{
//注意:
// 抽象方法没有方法体{},连大括号都没有,直接以分号结尾
public abstract void eat();
//Error抽象方法不能有主体
// public abstract void eat(){};
//抽象类中可以有实例方法
public void fun(){
System.out.println("这是抽象类中的具体实现的fun方法");
}
}
class Dog3 extends Animal3{
//如果继承抽象类是一个具体的类,要重写抽象类所有的抽象方法
@Override
public void eat() {
System.out.println("狗吃肉");
}
//具体的类中不能有抽象方法
// public abstract void show();
}
abstract class Demo2 extends Animal3{
//如果是一个抽象类继承抽象类,不需要重写抽象类中的方法
}
public class AbstractDemo1 {
public static void main(String[] args) {
//Animal3是抽象的; 无法实例化
// Animal3 a = new Animal3();
//使用抽象多态的形式创建
Animal3 a = new Dog3();
//通过具体的子类实例化去调用方法
a.eat();
a.fun();
}
}
程序示例
/*
在抽象的动物类中定义两个抽象方法。吃饭和睡觉。
*/
abstract class Animal4{
//定义一个抽象方法吃饭,不给出具体实现
public abstract void eat();
//定义一个抽象方法睡觉,不给出具体实现
public abstract void sleep();
}
class Dog4 extends Animal4{
@Override
public void eat() {
System.out.println("狗吃肉");
}
@Override
public void sleep() {
System.out.println("狗侧着睡");
}
public void lookDoor(){
System.out.println("看门");
}
}
class Cat4 extends Animal4{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void sleep() {
System.out.println("猫趴着睡");
}
}
public class AbstractTest1 {
public static void main(String[] args) {
//使用抽象多态创建第一个对象
Animal4 a = new Dog4();
a.eat();
a.sleep();
//多态无法使用子类特有的方法
// a.lookDoor();
//向下转型使用子类特有的方法
Dog4 d = (Dog4)a;
d.lookDoor();
//使用抽象多态创建第二个对象
Animal4 a2 = new Cat4();
a2.eat();
a2.sleep();
}
}