抽象类详解

简介: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域并不是直接存在的,它就是一个抽象概念。而正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
c#中的抽象类的特征

final:在Java中final可以修饰变量、方法、类。

·使用final修饰的变量就是常量,只能赋值一次,而且常量一般使用大写字母表示常量名称。
·使用final修饰的方法不能被子类覆写
·使用final修饰的类就是太监类,不能拥有子类
抽象类:使用abstract修饰的类就是抽象类
抽象方法:使用abstract修饰的方法就是抽象方法
public abstract class OopDemo003 {//定义抽象类
	
	public abstract void eat();//声明抽象方法
	
}


抽象方法只需要声明,不需要实现,有一个抽象方法的类必须定义为抽象类。


抽象类和普通类相比区别:抽象类比普通类多了抽象方法,普通类中所有的定义都可以在抽象类中使用。
抽象类的使用规则:
·抽象类本身不能实例化
·抽象类中的抽象方法只需要声明,不需要实现
·含有抽象方法的类必须声明为抽象类
·抽象类必须要有子类,不然抽象类没有任何意义,抽象类的子类必须要覆写抽象类的全部抽象方法。
抽象类的实例化过程:
抽象类子类实例化对象的时候,会先调用抽象类的构造方法,那么肯定就构造了一个抽象类的对象,那么抽象类的对象怎么取得呢?
public class OopDemo05 {
	public static void main(String[] args) {
		OopDemo003 oop = new OopDemo04();//子类对象作为父类对象使用
	}
}

举一个实例来帮助理解它:

一个公司,有两个部门,A和B,B部门是核心技术部门,A为普通技术部门,每个部门下都有一级,二级两类技工
公司每年有涨薪制度,但每个部门涨薪幅度不一样,核心部门涨薪幅度大,定义一个抽象类,把共有的属性放在抽象类中,比如姓名和原来工资
 定义工资提升的抽象方法

public abstract class Types {
    private String name;
    private double salary;
    public abstract void upSalary();//定义工资提升的抽象方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public Types(String name, double salary) {
	super();
	this.name = name;
	this.salary = salary;
    }
    public Types() {
	super();
	// TODO Auto-generated constructor stub
    }
    
}

A继承了抽象父类,重写了父类中的抽象方法,即定义工资提升的抽象方法,为A部门不同等级技工设计了一套属于自己的涨薪类

public class A extends Types {
    private String post;//岗位等级
    @Override
    public void upSalary() {//重写抽象父类中的方法
	// TODO Auto-generated method stub
	double salary=super.getSalary();
	if(this.post.equals("一级技工")){
	    super.setSalary(salary*1.1);
	}else if(this.post.equals("二级技工")){
	    super.setSalary(salary*1.2);
	}
    }
    public String getPost() {
        return post;
    }
    public void setPost(String post) {
        this.post = post;
    }
    public A() {
	super();
	// TODO Auto-generated constructor stub
    }
    public A(String name, double salary) {
	super(name, salary);
	// TODO Auto-generated constructor stub
    }
    public A(String name, double salary, String post) {
	super(name, salary);
	this.post = post;
    }

}

B继承了抽象父类,重写了父类中的抽象方法,即定义工资提升的抽象方法,为B部门不同等级技工设计了一套属于自己的涨薪类

public class B extends Types {
    private String post;
    @Override
    public void upSalary() {//B类职位也覆写了父类的抽象方法
	double salary=super.getSalary();
	if(this.post.equals("一级技工")){
	    super.setSalary(salary*1.3);
	}else if(this.post.equals("二级技工")){
	    super.setSalary(salary*1.5);
	}
	
    }
    public String getPost() {
        return post;
    }
    public void setPost(String post) {
        this.post = post;
    }
    public B() {
	super();
	// TODO Auto-generated constructor stub
    }
    public B(String name, double salary) {
	super(name, salary);
	// TODO Auto-generated constructor stub
    }
    public B(String name, double salary, String post) {
	super(name, salary);
	this.post = post;
    }

}

接着用一个测试方法,来输出结果:

public class Test {
    public static void main(String[] args) {
	
	Types t1=new A("张三",1000,"一级技工");//子类对象作为父类对象使用
	Types t2=new B("李四",1000,"一级技工");
	t1.upSalary();
	System.out.println("该员工涨薪后的工资应该是:"+t1.getSalary());
	t2.upSalary();
	System.out.println("该员工涨薪后的工资应该是:"+t2.getSalary());
    }
}
输出的结果为:

该员工涨薪后的工资应该是:1100.0
该员工涨薪后的工资应该是:1300.0

同样的一个抽象父类,原工资一样,但设计的子类不同,输出了各自所要实现的。

通过以上程序,我们还可以发现,如果以后出现其他的部门类型,提升工资的方式不同,可以编写抽象类的子类完成,不需要更改顶层设计。也就是说抽象类的作用就是在于可以方便程序的扩展。这就是抽象类的好处。

目录
相关文章
|
1月前
抽象类
如何使用如何使用抽象类和抽象方法: 1.不能直接创建new抽象类对象。 2.必须用一个子类来继承抽象父类 3.子类必须覆盖重写抽象父类当中所有的抽象方法 4.创建子类对象进行使用 关于抽象类: 1.抽象类不能创建对象,只能创建器非抽象的子类对象 2.抽象类中,可以有构造方法,是子类创建对象时,初始化父类成员用的。 3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类 4.抽象类的子类,必须重新抽象父类中的所有抽象方法和抽象方法: 1.不能直接创建new抽象类对象。 2.必须用一个子类来继承抽象父类 3.子类必须覆盖重写抽象父类当中所有的抽象方法
10 0
|
8月前
|
Java 编译器
认识抽象类
认识抽象类
49 0
|
7月前
|
存储 监控 安全
API网关是如何提升API接口安全管控能力的
API安全性越来越重要,对API安全进行防护既有利于用户安全的使用API所提供的服务,又能够为用户的隐私数据进行保驾护航。所以,提高API安全防护能力的问题亟待解决。面对以上形势,现在越来越多的企业采用API网关来管理内部API。以下从API资产管理、API安全防护、API风险溯源三个方面介绍API网关如何对API进行全生命周期的安全管理。
|
4月前
|
编解码 数据安全/隐私保护 iOS开发
uniapp上架app store详细攻略
uniapp开发多端应用,打包ios应用后,会生成一个ipa后缀的文件。这个文件无法直接安装在iphone上,需要将这个ipa文件上架app store后,才能通过app store来安装。
|
8月前
|
JavaScript 前端开发 Linux
Vue.js + Electron 的跨平台桌面应用程序开发
本文介绍了 Vue.js 和 Electron 的基本特点和原理,并分析了它们在桌面应用程序开发中的优势和应用场景。在基于 Vue.js 和 Electron 的桌面应用程序开发实践中,本文详细介绍了项目的搭建和配置,包括环境的准备、项目的初始化和依赖的安装等步骤。然后,本文介绍了使用 Vue.js 进行界面设计和组件开发的方法,并提供了相关的示例代码和实现细节。接下来,本文探讨了 Electron 主进程和渲染进程的开发,包括窗口管理、文件系统访问和与底层系统交互等方面的内容。最后,本文对基于 Vue.js 和 Electron 的桌面应用程序开发做出了总结,并展望了未来的发展方向和应用前景
461 2
|
11月前
|
存储 算法
一文学会树形查找算法
本文主要详细介绍树形查找中的排序二叉树、平衡二叉树、红黑树、B树以及B+树。
139 5
|
11月前
|
Java
线性结构-队列
线性结构-队列
3975 0
线性结构-队列
|
12月前
|
XML 前端开发 数据格式
Python高阶教程—BeautifulSoup详讲
BeautifulSoup简介: Beautiful Soup 简称 BS4(其中 4 表示版本号)BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它提供了一些简单的方式来遍历文档树和搜索文档树中的特定元素。 BeautifulSoup可以解析HTML和XML文档,并将其转换为Python对象,使得我们可以使用Python的操作来进行数据提取和处理。它还可以处理不完整或有误的标记,并使得标记更加容易阅读。
317 0
|
算法 前端开发
笨阶乘
🎈每天进行一道算法题目练习,今天的题目是“笨阶乘”。
68 0