零基础学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().");
}
}