目录
在Java中,一个没有 方法体 的方法应该定义为 抽象方法,而类中如果有 抽象方法,该类必须定义为抽象类。
抽象类和抽象方法用 abstract 关键字来修饰
- 抽象类:abstract class 类名{}
- 抽象方法:public abstract void eat();// 抽象方法中没有方法体
AnimalParent.java
- package com.面向对象.Demo24;
-
- //public class AnimalParent {
- public abstract class AnimalParent {
- /**
- * eat()方法没有方法体 具体 都是交给子类 重写的
- * 如果在方法上加上 abstract 进行修饰 为抽象方法
- * 如果在一个类中存在一个抽象方法 则该类必须是抽象方法
- */
- // public void eat(){
- // System.out.println("我在吃");
- // }
- public abstract void eat();
- }
Cat.java
- package com.面向对象.Demo24;
-
- public class Cat extends AnimalParent {
- // 在我们抽象类中 的抽象方法 子类必须是要重写的
- @Override
- public void eat() {
- System.out.println("Cat-eat()-鱼");
- }
- }
Dog.java
- package com.面向对象.Demo24;
-
- public class Dog extends AnimalParent{
- // 在我们抽象类中 的抽象方法 子类必须是要重写的
- @Override
- public void eat() {
- System.out.println("Dog-eat()-骨头");
- }
- }
Test01.java
- package com.面向对象.Demo24;
-
- public class Test01 {
- public static void main(String[] args) {
- // AnimalParent animalParent = new AnimalParent(); //报错,'AnimalParent' is abstract; cannot be instantiated
- // 动物类是一个抽象的概念 没有具体的事物
-
- AnimalParent dog = new Dog();
- AnimalParent cat = new Cat();
- dog.eat(); //Dog-eat()-骨头
- cat.eat(); //Cat-eat()-鱼
- }
- }
- 抽象类中不一定有抽象方法,但是有抽象方法的类必须为抽象类;
- 抽象类不能实例化;
- 抽象类由具体的子类进行实例化;
- 子类必须对父类(抽象类)中的所有抽象方法进行重写;
- 在抽象类中可以定义非抽象方法;
- 子类如果不重写抽象类中的抽象方法,则该类还是为抽象类;
- 抽象类中可以有构造方法,用于子类访问父类时的数据初始化。
AnimalParent.java
- package com.面向对象.Demo25;
-
- public abstract class AnimalParent {
- /**
- * 在抽象类中 是可以定义 成员属性
- */
- private int age;
- private final int code = 200;
-
- /**
- * 1.在方法上加上 abstract 进行修饰,则该方法是为抽象方法
- * (如果在该类中存在一个抽象方法,则该类必须是为抽象类)
- * 2.在一个抽象类中是可以存在多个抽象方法的
- * 3.在抽象类 可以定义 非抽象方法
- * 4.子类是必须重写父类中 所有 的抽象方法 (非抽象方法 子类没有必须 强制 重写的)
- * 5.如果子类 没有重写 父类中的抽象方法,则该类 也需要是为 "抽象类" 继承父类中的抽象方法
- * 6.抽象类——不能够实例化的 没有明确具体的事物 所以 抽象类必须 通过子类 实例化
- * 7.在抽象类中,不一定有抽象方法的(但是这样做不合理)
- * 8.抽象类中可以有构造方法,用于子类访问父类时的数据初始化。
- */
- public abstract void eat();
-
- public abstract void play();
-
- public AnimalParent() {
- System.out.println("AnimalParent-无参构造方法...");
- }
- // 抽象类 是可以定义 有参构造方法,子类访问父类初始化时 可以给父类的成员属性进行赋值
- public AnimalParent(int age) {
- this.age = age;
- System.out.println("AnimalParent-有参构造方法...");
- }
-
- /**
- * 非抽象方法(子类不需要强制重写的)
- */
- public void show() {
- System.out.println("非抽象方法-show()");
- System.out.println("age:"+age);
- System.out.println("code:"+code);
- }
- }
Dog.java
- package com.面向对象.Demo25;
-
- public class Dog extends AnimalParent {
- /**
- * 默认每个类中都有一个无参构造方法 默认是可以不用写的
- */
- public Dog(int age) {
- super(age); //如果这里调用父类的有参构造方法,程序会默认在这里加上 super(),帮我们调用无参构造
- // 思考 在Dog类中 的有参构造方法中,会调用父类中的 有参构造方法吗?
- System.out.println("Dog-有参构造方法...");
- }
-
- @Override
- public void eat() {
- System.out.println("Dog-eat-骨头");
- }
-
- @Override
- public void play() {
- }
- }
Cat.java
- package com.面向对象.Demo25;
-
- // 如果子类 没有重写 父类中的抽象方法,则该类 也需要是为 "抽象类" 继承父类中的抽象方法
- public abstract class Cat extends AnimalParent{
- }
Test01.java
- package com.面向对象.Demo25;
-
- public class Test01 {
- public static void main(String[] args) {
- // new AnimalParent();//报错,'AnimalParent' is abstract; cannot be instantiated
- // 抽象类 没有明确具体的事物 所以 抽象类必须 通过子类 实例化
-
- AnimalParent dog = new Dog(20);
- dog.show();
- // AnimalParent cat = new Cat();//报错,∵ Cat类是 abstract
- }
- }
下一篇文章:抽象类案例