Java学习——抽象类

进行项目开发的过程中,尽可能不要直接继承直接实现好的类,而继承抽象类或接口。

对象多态性的核心本质:方法的重写

如果子类没有进行指定方法的覆写,也就不存在对象多态性了。

所以如果要对子类的方法做一些强制性的要求,就会用到抽象类。

抽象类实现了面向对象设计的一个核心原则: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声明,子类只需要重写外部抽象类中的直接抽象方法即可,内部抽象类的抽象方法可以不重写。

额外话题:关于对象实例化
对象的实例化操作实际上需要以下几个核心步骤:

  • 进行类加载
  • 进行类对象的空间开辟
  • 进行类对象中的属性初始化(构造方法)

猜你喜欢

转载自blog.csdn.net/eve8888888/article/details/83239598