JavaSE总结 - abstract抽象类

零基础学Java,肝了bilibili的6百多集JavaSE教程传送门的学习笔记!!!

下面博客分为两部分:

  • 抽象类的要点(想快速了解抽象类的小伙伴选择)
  • 案例代码,对①中的知识点进行解释(需要再花费5分钟学习的小伙伴选择)

一、抽象类要点

1、抽象类怎么定义?
       在class前面加abstract关键字。

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

3、final和abstract不能联合使用,这两个关键字是对立的。

4、抽象类的子类可以是抽象类,也可以是非抽象类。

5、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是给子类使用的。

6、抽象类不一定有抽象方法,但有抽象方法的就一定是抽象类。

7、抽象方法是怎么定义的?
public abstract void doSome();

8、一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现

面试题:Java语言中凡是没有方法体的方法都是抽象方法?
不对,例如Object类中就有很多方法没有方法体,都是以";"结尾的,
但他们都不是抽象方法。
这些方法底层调用了C++写的多态链接库程序。
前面修饰符列表中没有:abstract. 有一个native。表示调用JVM本地程序。


二、案例代码

1、abstract类的注意点

【类到对象是实例化。对象到类是抽象。】

1、什么是抽象类?

类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。
类本身是不存在的,所以抽象类无法创建对象【无法实例化】。

2、抽象类属于什么类型?

抽象类也属于引用数据类型。

3、抽象类怎么定义?

语法:
[修饰符列表] abstract class 类名 {
类体;
}

4、抽象类无法实例化,无法创建对象的。

所以抽象类是用来被子类继承的。

5、final和abstract不能联合使用,这两个关键字是对立的。

6、抽象类的子类还可以是抽象类。

7、抽象类虽然无法被实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

8、抽象类 --> 抽象方法,什么是抽象方法?
     public abstract void doSome();
      * 抽象方法特点:
         1、没有方法体(不是 “没有方法体”),以分号结尾。
         2、前面修饰符列表中有abstract关键字。

9、抽象类中不一定有抽象方法。抽象方法只能出现在抽象类。
public class AbstractTest01 {

    public static void main(String[] args) {
       new Account();    // 编译报错
        // 'Account' is abstract; cannot be instantiated;
    }
}

// 银行账户类
abstract class Account {
    int id;

    public Account() {

    }
    public Account(int id) {
        this.id = id;
    }

}

class CreditAccount extends Account {
	// 子类new对象的时候,调用构造器,super如果找不到对应的父类构造器就会报错。
    public CreditAccount() {
        super();
    }
    public CreditAccount(int id) {
        super(id);
    }
}

2、abstract方法

结论:

一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了!
这是Java语法上强行规定的,必须的!不然编译报错。

一个抽象子类继承抽象类,还必须实现父类的抽象方法吗?
答:不必须,没有强制要求。

public class AbstractTest02 {

    public static void main(String[] args) {
        // 能不能使用多态的知识点?
        // 父类型引用指向子类型对象。
        Animal animal = new Bird(); // 这就是面向抽象编程。
        animal.move();  // 向上转型

        // 面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。
        // 这种编程思想符合OCP原则。
    }
}

// 抽象动物类:抽象方法move()。
abstract class Animal {
    public abstract void move();
}

// Bird类:非抽象类,继承Animal类。
// 继承的move()方法,非抽象,因为Bird类是非抽象类。
class Bird extends Animal {

    // 重写覆盖方法不要与重载混淆。
    // 重载是发生在一个类里。
    @Override
    public void move() {
        System.out.println("Bird move().");
        // 需要将从父类中继承的抽象方法进行覆盖/重写(实现)。
        // 否则编译报错。
    }

}

abstract class Human extends Animal {
    @Override
    public void move() {
        System.out.println("Human move().");
    }
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的clz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值