面向对象之雾里看花(抽象类)

  • Post author:
  • Post category:其他




抽象类(abstract)



概念

​ 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。简单来说就是类中的信息太少了描述不了一个具体的”东西“,这就是抽象类。

​ 抽象类不能实例化,但类的其它功能依旧存在,

成员变量、成员方法和构造方法

的访问方式和普通类一样。



具体描述

​ 1.用

abstract

修饰的类就是抽象类。

​ 2.若某个类中包含有抽象方法,那么该类就必须定义成抽象类。

​ 3.抽象方法

抽象方法是一种特殊的方法:它只有声明,没有具体的实现;
抽象方法必须使用abstract关键字进行修饰。

​ 4.抽象类可以有成员属性和非抽象的成员方法。

​ 5.抽象类不能有被实例化,但

可以有构造函数,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

​ 6.抽象类只能用作基类,表示一种继承关系。

继承抽象类的非抽象类必须实现其中的所有非抽象方法

,对于已经实现的的方法的参数、返回值必须要和抽象类中的方法一致。否则,

该类也必须声明为抽象类

​ 7.构造方法和静态方法不可以修饰为abstract。



抽象类的使用

使用关键字abstract定义抽象类,一般语法为:

/*
[访问权限] abstract class 类名{
	成员列表
}
*/

public abstract class Shapes{
	public abstract void draw();
}

public abstract class Shapes{
	public void draw(){
		//具体代码
	}
}

代码示例—–抽象类

/*
* 一个类中有方法是抽象方法,这个类也会变成一个抽象类
* 一个抽象类会有 0-n 个抽象方法
*/
public abstract class Person {
    //在一个类中,会有一类方法,子类对这个方法非常满意,无需重写,直接就可以使用...
    public void eat(){
        System.out.println("每天都要吃饭饭!!!!");
    }

    /*
    *  在一个类中,会有一类方法,子类对这种方法永远都不满意,会对这种方法进行重写;
    * 把一个方法的方法体去掉,然后被abstract修饰,那么这个方法就变成了一个抽象方法;*/
    public abstract void say();
    public abstract void love();

}

代码示例—继承抽象类的子类

/*
* 抽象类被其它类继承
* 抽象类被继承后必须对其中的抽象方法进行重写,否则就需要被abstract修饰为抽象类
* 但是一般子类不会加abstract修饰
* 一个类继承一个抽象类,那么这个类会变成一个抽象类
*
*/
public class Chinese extends Person {
    @Override
    public void say() {
        System.out.println("中国人说中国话!!!");
    }

    @Override
    public void love() {
        System.out.println("中国人民爱中国共产党!!!!");

    }
}

代码示例—-测试

public class Test {
    public static void main(String[] args) {
        //抽象类不可以创建对象
//        Person person = new Person();
        //子类可以创建
        Chinese chinese = new Chinese();
        chinese.eat();
        chinese.love();
        chinese.say();
    }
}

需要注意的几个问题:

1.抽象类不能创建,那么抽象类中是否有构造器?

答:抽象类中有构造器。构造器的作用:给子类初始化对象时需要先用super调用父类的构造器。

2.抽象类是否能够被final修饰?

答:不能被final修饰,因为抽象类设计的初衷就是给子类继承重写用的,如果被final修饰了,就不能被子类继承了,那抹抽象类的意义就没有了。



版权声明:本文为Lotus_dong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。