抽象类详解.

终极结论:

类到对象是实例化,对象到类是抽象

抽象类:
    1、什么是抽象类?
     类和类之间有共同特征,将这些特征提取出来,形成的就是抽象类
     类本身是不存在的,所以抽象类无法创建对象(实例化)
    2、抽象类属于什么数据类型?
      抽象类也属于引用数据类型
    3、抽象类怎么定义?
    语法:
      [修饰符列表] abstract class 类名{
            类体;
      }
    结论:
    4、抽象类无法实例化的,无法创建对象,所以抽象类是用来被子类继承的
    思考:抽象类也是类 那么能不能加final不让其他类继承呢? 答案:不能
    5、final和abstract不能联合使用,这两个关键字是对立的
    6、抽象类的子类可以是抽象类
    7、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的[构造方法当中有super();子类可以通过super();调用父类的构造方法]
    8、抽象类关联到一个概念:抽象方法   / 抽象类当中也可以有非抽象方法 public void doSome(){}
    什么是抽象方法? 例如:public abstract void doSome();
         特点1:没有方法体,以分号结束
         特点2:前面修饰符列表中abstract关键字
    9、抽象类中不一定有抽象方法,但抽象方法一定在抽象类当中
    10、【重点】:一个非抽象类,继承抽象类,必须将抽象类当中的抽象方法进行覆盖/重写

一、抽象类的概述

二、抽象类的应用

1、抽象类无法实例化的,无法创建对象,所以抽象类是用来被子类继承的

代码演示:

public class homework01 {
    public static void main(String[] args) {
        // 将抽象类实例化对象
        // 报错:Animal是抽象的; 无法实例化
        // 因为抽象类本身是由类抽象出来的 但是类也是凭借对象空想出来的(如猫[对象]----->空想成Animal[类])
        Animal a =new Animal();
    }
}
// 动物类(假设是抽象类)
abstract class Animal{

}
思考:抽象类也是类 那么能不能加final不让其他类继承呢? 答案:不能
2、final和abstract不能联合使用,这两个关键字是对立的

代码演示: 

public class homework01 {
    public static void main(String[] args) {

    }
}
// 动物类(假设是抽象类)
final abstract class Animal{
    // 报错:非法的修饰符组合: abstract和final
}
3、抽象类的子类可以是抽象类
public class homework01 {
    public static void main(String[] args) {

    }
}
// 动物类(假设是抽象类)
abstract class Animal{

}
// 来个抽象子类进行继承抽象的动物类[假设Dog是抽象类]
abstract class Dog extends Animal{
    // 能够运行 不报错
}
4、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的[构造方法当中有super();子类可以通过super();调用父类的构造方法]

public class homework01 {
    public static void main(String[] args) {
        // 抽象类无法实例化对象
        // 报错:Dog是抽象的; 无法实例化
        // Dog d =new Dog();

        // Cat类是由对象抽象出来的 可以实例化对象
        Cat c =new Cat();
    }
}
// 动物类(假设是抽象类)
abstract class Animal{
    // 抽象类当中默认由一个无参构造方法
    public Animal() {
        System.out.println("抽象动物类的无参构造方法开始执行");
    }
}

// 来个抽象子类进行继承抽象的动物类[假设Dog是抽象类]
abstract class Dog extends Animal{

    // 无参构造方法
    public Dog() {
        // 构造方法当中第一行默认有一个super();调用父类的无参构造方法
        System.out.println("抽象Dog类的无参构造方法开始执行");
    }
}

// 假设猫是由对象抽象出来的一个类
class Cat extends Dog{
    public Cat() {
        // 默认一个super(); 去调用父类Dog的无参构造方法
        System.out.println("子类Cat的无参构造方法开始执行");
    }
}

运行结果:

5、抽象类关联到一个概念:抽象方法   / 抽象类当中也可以有非抽象方法 public void doSome(){}

  代码演示:

public class homework01 {
    public static void main(String[] args) {

    }
}
// 动物类(假设是抽象类)
abstract class Animal{
    public abstract void doSome();
    
    // 也可以有非抽象方法
    //public void doSome(){}
}
6、抽象类中不一定有抽象方法,但抽象方法一定在抽象类当中
public class homework01 {
    public static void main(String[] args) {

    }
}
// 动物类(假设是抽象类)
class Animal{
    // 抽象方法
    // 报错:Animal不是抽象的, 并且未覆盖Animal中的抽象方法doSome()
    public abstract void doSome();

}

三、非抽象类继承抽象类必须想实现抽象方法

public class homework01 {
    public static void main(String[] args) {
         // 能不能使用多态?
        // 答案:可以
        // 因为Dog类是非抽象类 所以可以创建对象 又因为Animal类是Dog的父类 所以可以使用多态(向上转型)
        // 又因为子类继承父类重写了方法 所以可以通过父类"引用."进行访问方法
        Animal a =new Dog(); // 向上转型
        // 分析:
        // 编译时:move()方法是Animal类来进行找move()方法进行静态绑定
        // 运行时: move()方法是Dog类来进行找move()方法进行运行(也就验证了非抽象类继承抽象类[有抽象方法]时,要重写该方法)
        a.doSome(); // 输出结果: 鸟儿在飞翔
        /*
        这里就是面向抽象编程
        以后你都是调用的a.方法名
        a的类型是Animal,Animal是抽象的
        面向抽象编程,不面向具体编程,降低程序的耦合度,提高程序的扩展力
        这种编程思想符合OCP原则
         */
    }
}
// 动物类(假设是抽象类)
abstract class Animal{
    // 抽象方法
    public abstract void doSome();
    }

// 定义非抽象类
class Dog extends Animal{
    // 方法体中什么也不写时报错:Dog不是抽象的, 并且未覆盖Animal中的抽象方法doSome()
    // 报错原因:Dog类继承抽象类Animal会将抽象方法也继承下来,但是规定抽象方法一定在抽象类当中 所以报错
    // 如何把抽象方法在非抽象类中实现呢?
    // 需要将从父类中继承过来的抽象方法进行覆盖/重写,或者也可以叫做"实现"
    public  void doSome(){
        System.out.println("鸟儿在飞翔");
    }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值