java入门(二十四) | OOP(十一)之抽象类
抽象类
1.1 概念
Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。
该没有方法体的方法我们称之为抽象方法。
含有抽象方法的类我们称之为抽象类。
抽象类可以理解为是一个只有方法声明没有方法体的特殊类。
abstract 修饰符 返回值 方法名(参数列表);
抽象的 class Animal{
抽象的 public void eat();//父类方法体提供了显得多余,那就不提供方法体,没有方法体的方法 -- 抽象方法
}
class Cat extends Animal{
@Override
public void eat(){
syso("猫吃鱼");
}
}
class Dog extends Animal {
}
1.2 特点
- 通过java关键字abstract实现
- 可以修饰方法或者类
- 抽象类中可以没有抽象方法(由子类去实现)
- 如果类中有抽象方法,那该类必须定义为一个抽象类
- 子类继承了抽象类以后,要么还是一个抽象类,要么就把所有抽象方法都重写
- 多用于多态中
- 抽象类不可以被实例化
1.3 入门案例
package cn.qile.abstractdemo;
//测试抽象类入门案例
public class Test1_Abstract {
public static void main(String[] args) {
//5、抽象类不能被实例化new
// Student s = new Student();
// s.eat();s.sleep();
//TODO 创建多态对象测试
Person p = new Teacher();//父类的引用指向子类的对象
//编译看左边,运行看右边
p.eat();
p.game();
p.sleep();
}
}
//创建抽象类
//3、如果一个 类中 包含抽象方法 -- 这个类必须是一个抽象类,用abstract修饰
abstract class Person{
//1、父类中的方法体没必要提供时,这个方法就是没有方法体的方法 叫 抽象方法
//2、用关键字abstract修饰抽象的
abstract public void eat();
abstract public void game();
public void sleep() {
System.out.println("睡觉");
}
}
//创建子类
//4、子类如果继承了抽象类,子类如果只不重写,或者只重写一部分,那子类仍然是抽象类
abstract class Student extends Person{
//TODO 重写eat()
public void eat() {
System.out.println("吃菜");
}
}
//4.1、子类如果继承了抽象类,要把所有抽象方法都重写 变成 普通子类
class Teacher extends Person{
public void eat() {
System.out.println("不吃");
}
public void game() {
System.out.println("不玩");
}
}
抽象类的用法
2.1 构造函数
常用于子类的实例化
package cn.qile.abstractdemo;
//抽象类的用法
public class Test2_UseAbstract {
public static void main(String[] args) {
//TODO 创建多态对象测试
Animal a = new Dog();
}
}
//创建父类
abstract class Animal{
//抽象类提供构造方法:不是为了创建抽象类的对象(也不能创建),而是为了创建子类对象
public Animal() {
System.out.println("构造方法");
}
}
//创建子类
class Dog extends Animal{
public Dog() {
super();//默认就有
}
}
2.2 成员变量
既可以有变量,也可以有常量。
package cn.qile.abstractdemo;
//抽象类的用法
public class Test2_UseAbstract {
public static void main(String[] args) {
//TODO 创建多态对象测试
Animal a = new Dog();
}
}
//创建父类
abstract class Animal{
//提供构造方法:不是为了创建抽象类的对象,而是为了创建子类对象
public Animal() {
System.out.println("构造方法");
}
int sum ;//抽象类中可以写变量
final int count = 10;//抽象类中可以写常量
}
//创建子类
class Dog extends Animal{
public Dog() {
super();//默认就有
}
}
2.3 成员方法
抽象类里,既可以有普通方法,有可以有抽象方法。
package cn.qile.abstractdemo;
//抽象类的用法
public class Test3_UseAbstract {
public static void main(String[] args) {
//创建多态对象测试
Animal a = new Dog();
System.out.println(a.count);
System.out.println(a.sum);
a.sleep();
a.eat();
a.jiao();
}
}
//创建父类
//1、抽象类中可以有 抽象方法 也可以有 普通方法
abstract class Animal{
//提供构造方法:不是为了创建抽象类的对象,而是为了创建子类对象
public Animal() {
System.out.println("构造方法");
}
int sum ;//抽象类中可以写变量
final int count = 10;//抽象类中可以写常量
public abstract void eat();
public abstract void jiao();
public void sleep() {
System.out.println(sum);//0
System.out.println("正在睡觉");
}
}
//创建子类
class Dog extends Animal{
public Dog() {
super();//默认就有
}
//2、抽象类中如果有抽象方法,子类继承后,必须全都重写,否则子类就是抽象类
@Override
public void eat() {
System.out.println("狗吃肉");
}
@Override
public void jiao() {
System.out.println("汪汪汪");
}
}