Abstract详解

今天来介绍一下抽象类。我们用动物类来看,上代码:

public class Animal {

    String name;

    public Animal() {
        // TODO Auto-generated constructor stub
    }

    public void sleep() {
        System.out.println("闭上眼睛就睡觉");
    }

    public void shout() {
        System.out.println("");
    }

}
public class Cat extends Animal{

    @Override
    public void shout() {
        System.out.println("喵喵叫");
    }
}
public class Dog extends Animal{

    @Override
    public void shout() {
        // TODO Auto-generated method stub
        System.out.println("汪汪叫");
    }

}
public class Test {

    public static void main(String[] args) {
        Animal animal= new Animal();
        animal.name="动物";
        animal.shout();
        animal.sleep();
        System.out.println();

        Dog dog = new Dog();
        dog.name= "旺财";
        System.out.print("狗狗"+dog.name);
        dog.shout();
        dog.sleep();

        System.out.println();

        Cat cat = new Cat();
        cat.name="小花";
        System.out.print("猫咪"+cat.name);
        cat.shout();
        cat.sleep();
    }
}

运行结果:


闭上眼睛就睡觉

狗狗旺财汪汪叫
闭上眼睛就睡觉

猫咪小花喵喵叫
闭上眼睛就睡觉

从上面的类中我们可以发现animal类中的shout()方法在生活中几乎是不可能用到的,于是我们为了代码的简洁,shout()方法不需要方法体,但是会报错误This method requires a body instead of a semicolon。于是我们便引入了abstract关键字。当我们加上abstract之后,还是会报错误The abstract method shout in type Animal can only be defined by an abstract class。那么怎么办呢?抽象方法需要在抽象类中定义。

public abstract class Animal {

    String name;

    public Animal() {
        // TODO Auto-generated constructor stub
    }

    public void sleep() {
        System.out.println("闭上眼睛就睡觉");
    }

    public abstract void shout() ;
}
/**
 * 动物类
 * shout(); 这个方法里的方法体没有用 但这个方法不能注释 让子类重写
 * 1.abstract抽象的
 *   The abstract method shout in type Animal can only be defined by an abstract class
 * 2.如何定义一个抽象方法
 *   语法:
 *     【访问权限符】 abstract 返回值 方法名();
 *   eg:
 *      public abstract void shout();
 * 3.如何定义一个抽象类
 *   语法:
 *    【访问权限符】  abstract class 类名{}
 *   eg:
 *    public abstract class Animal {
 *    }
 * 4.总结
 *     A.抽象方法一定要在抽象类中
 *     B.抽象类中可以有   0 1 多个 抽象方法
 *     C.抽象类不能直接实例对象 只能创建子类对象 抽象类一定要被继承
 *       Cannot instantiate the type Animal
 *     D.子类继承父类 如果父类是抽象类 子类一定要实现父类里所有的抽象方法 除非子类也是抽象类
 *     E.abstract可以修饰   类  方法
 *               不能修饰   成员变量 构造方法
 *     F.抽象类中的成员
 *               成员变量   成员方法  构造方法       
 *        
 */

总结一下知识点:
1. 语法

 A.抽象类和抽象方法必须使用 abstract修饰
 B.抽象类不能直接实例 只能被继承
 C.抽象类必须有构造方法 创建子类对象时候需要
 D.抽象类可以有至少0个抽象方法
 E.抽象方法只有声明没有实现(名字  没有方法体)
 F.public abstract void shout(){} 不是抽象方法
 G.子类必须重写抽象方法,如果不重写,自己也得是抽象类  

2.意义
A.抽象类为所有子类提供了一个通用模板,子类可以在此模板上进行扩展
B.通过抽象类,可以避免子类设计随意性
C.通过抽象类,可以严格限制子类的设计,使得子类更加通用

抽象类就是用来作父类的用来被继承的

问题1:
Animal an=new Animal(); 没有一种生物叫Animal 创建Animal没有意义
拒绝实例
解决方法:
Animal类 定义为抽象类
抽象类不能直接实例但可以被继承

问题2:
dog可以重写shout也可以不重写 如果希望dog必须重写shout方法 不重写就有编译错误

解决方法:
Animal类 里的shout方法定义为抽象方法
抽象方法只有声明,没有实现

发布了27 篇原创文章 · 获赞 9 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章