一、前言
本文会梳理有关抽象类和抽象方法的知识点,这会运用在接口中,而接口是在实际开发中非常重要的,所以知识点非常重要
二、抽象方法
1.定义
抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现
2.简单记忆方法
概念听起来很复杂难懂,那我们举例说明
比如有三个人A、B、C的职业都是程序员,到了返点都要吃饭,但是每个人吃的东西不一样,有人吃爱心便当,有人吃盒饭,有人吃快餐,那么他们都有共同的方法:吃,并且他们都可以同属于一个父类:程序员,那么我们可以把共同的方法吃抽取到父类(程序员)中,由于子类(ABC三个人)吃的东西不相同,即方法体不同,所以要把该方法定义为抽象方法
3.代码格式
修饰符 abstract 返回值类型 方法名 (参数列表);
例如
public abstract void eat();]
4.使用说明
如果要继承父类中的抽象方法,则必须重写该方法,否则就让子类也变为抽象类
示例:
如果想要偷懒的话,点击 Alt+Enter来查看解决方法
我们在这里选择第二个,实现方法
一个是父类中的抽象方法,另一个一个是接口(这个下一篇文章中会讲到)我们只需要全选然后点击回车就会自动帮我们生成重写的方法了
此时我们只要改写方法体即可
三、抽象类
1.定义
当某一个类中存在抽象方法,那么这个类就要被定义为抽象类
2.代码格式
abstract class 类名 { }
例如:
abstract class Student { }
3.使用说明
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类
4.注意点
1.抽象类不能实例化
2.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。
当我们在一个非抽象的类中写抽象方法时,会报错
但是在抽象类中写非抽象方法,又不会报错
抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过而报错。
四、小练习
1.题目
属性 | 行为 | |
青蛙Frog | 名字、年龄(1) | 吃虫子、喝水 |
狗Dog | 名字、年龄(2) | 吃骨头、喝水 |
兔子 | 名字、年龄(3) | 吃胡萝卜、喝水 |
2.分析
eat是抽象方法,吃的东西不同,而drink都是喝水,所以不用使得该方法变为抽象方法
3.代码实现
1️⃣父类
public abstract class Animal { private String name; private int age; public Animal(String name, int age) { this.name = name; this.age = age; } public Animal() { } 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; } public abstract void eat(); public void drink(){ System.out.println("喝水"); } }
2️⃣Frog类
public class Frog extends Animal implements Swim { public Frog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("吃虫子"); } @Override public void drink() { System.out.println("小青蛙喝水"); } }
3️⃣Dog类
public class Dog extends Animal implements Swim { public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("吃骨头"); } @Override public void drink() { System.out.println("小狗喝水"); } }
4️⃣Rabbit类
public class Rabbit extends Animal{ public Rabbit(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("吃胡萝卜"); } @Override public void drink() { System.out.println("小狗喝水"); } }
5️⃣测试类
public class Test { public static void main(String[] args) { Frog f = new Frog("小青蛙",1); System.out.println(f.getName() + "今年" + f.getAge() + "岁\n它的行为有:"); f.eat(); f.drink(); System.out.println("---------------"); Dog g = new Dog("小狗",2); System.out.println(g.getName() + "今年" + g.getAge() + "岁\n它的行为有:"); g.eat(); g.drink(); System.out.println("---------------"); Rabbit r = new Rabbit("小白兔",3); System.out.println(r.getName() + "今年" + r.getAge() + "岁\n它的行为有:"); r.eat(); r.drink(); } }
五、结语
下一篇文章会讲述有关接口的知识点