进行项目开发的过程中,尽可能不要直接继承直接实现好的类,而继承抽象类或接口。
对象多态性的核心本质:方法的重写
如果子类没有进行指定方法的覆写,也就不存在对象多态性了。
所以如果要对子类的方法做一些强制性的要求,就会用到抽象类。
抽象类实现了面向对象设计的一个核心原则:OCP(Open-Closed Principle)开闭原则(一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。)
一、抽象类
定义:抽象类只是在普通类的基础上扩充了一些抽象方法的类
抽象方法:指的是只声明而未实现的方法(即没有方法体)
所有抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义,表示抽象类。
注意:在Java中只声明没实现的不都是抽象方法,本地方法(用来调用c/c++的同名函数)也是只声明没实现。
抽象类中包含有抽象方法,而抽象方法不包含方法体,即没有具体实现。因此抽象类不能直接产生实例化对象。
abstract class Person{
private String name;
public String getName(){
return name;
}
public abstract void test();
}
class Student extends Person{
public void test(){
System.out.println("重写的方法");
}
}
class Test{
public static void main(String[] args) {
Person per1 = new Student();
per1.test();
}
}
1.抽象类的使用原则
a。所有的抽象类必须有子类(final与abstract不能同时出现)
b。抽象类的子类必须重写抽象类的所有抽象方法(private与abstract也不能同时出现)
c。抽象类无法直接创建实例化对象,需要通过子类向上转型为其实例化
2.抽象类的相关约定
a。抽象类一定存在构造方法,子类也一定遵循对象实例化流程。先调用父类构造再调用子类构造。
abstract class Person{
private String name;
public Person(){
System.out.println("抽象类的构造方法");
}
public String getName(){
return name;
}
public abstract void test();
}
class Student extends Person{
public void test(){
System.out.println("重写的方法");
}
}
class Test{
public static void main(String[] args) {
Person per1 = new Student();
per1.test();
}
}
/**
* 输出
* 抽象类的构造方法
* 重写的方法
*/
注:如果父类没有无参构造,那么子类构造必须使用super明确指出使用父类哪个构造方法。
b。抽象类可以没有任何抽象方法,但此时仍然不能直接创建实例化对象。
c。final与abstract不能同时出现;private与abstract也不能同时出现。
d。抽象类也分为内部抽象类和外部抽象类。对于内部抽象类,可以用static声明,子类只需要重写外部抽象类中的直接抽象方法即可,内部抽象类的抽象方法可以不重写。
额外话题:关于对象实例化
对象的实例化操作实际上需要以下几个核心步骤:
- 进行类加载
- 进行类对象的空间开辟
- 进行类对象中的属性初始化(构造方法)