目录
概述:
示例代码:
抽象类特点
示例代码:
概述:
在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
}
}
下一篇文章:抽象类案例