抽象类详解

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

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

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

时间: 2024-09-29 09:13:57

抽象类详解的相关文章

连载:面向对象葵花宝典:思想、技巧与实践(9) - “抽象类” 详解

抽象类是一种特殊的类,其特殊性在于抽象类只能用于继承,不能被实例化为具体的对象.例如在Java中不能new一个抽象类,但可以extends一个抽象类.   抽象类的定义其实很简单,但其使用并不那么简单,有几个问题我们需要深入研究一下.   第一个问题是:有了类,为什么还要抽象类,为什么设计一种只能继承,不能实例化的类? 答案就在于:某些场景下普通类不够用.例如,"苹果"."桔子"."香蕉"都是"水果",这里的"水果&

详解Android中的Context抽象类_Android

关于Context我们首先应该知道: (1)它描述的是一个应用程序环境的信息,即上下文. (2)该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类). (3)通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等.. 于是,我们可以利用该Context对象去构建应用级别操作(application-level operations) .一.Con

php接口和抽象类使用示例详解

 这篇文章主要介绍了php的接口和抽象类使用示例,并做了详解讲解,需要的朋友可以参考下 一. 抽象类abstract class   1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类.   2 .抽象类不能被直接实例化.抽象类中只定义(或部分实现)子类需要的方法.子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化.   3 .如果子类需要实例化,前提是它实现了抽象类中的所有

JDOM使用详解及实例

dom|详解 一.JDOM 简介 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作. JDOM 直接为JAVA编程服务.它利用更为强有力的JAVA语言的诸多特性(方法重载.集合概念以及映射),把SAX和DOM的功能有效地结合起来. 在使用设计上尽可能地隐藏原来使用XML过程中的复杂性.利用JDOM处理XML文档将是一件轻松.简单的事. JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言.无论是C++.无论是Java.无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思想轻松的跳跃.便没有对于Java..net.PHP 之间谁强谁弱的争执了. 希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的PHPer开始转向OO的编程过程. 相对PHP4,PHP5在面向对象方面改变了很多.我们将只介绍PHP5环境下的面向对象.而我们必须改变自己来跟随PHP5的发展.如果代

详解J2EE的13种核心技术

j2ee|详解 Java最初是在浏览器和客户端机器中粉墨登场的.当时,很多人质疑它是否适合做服务器端的开发.现在,随着对Java2平台企业版(J2EE)第三方支持的增多,Java被广泛接纳为开发企业级服务器端解决方案的首选平台之一.J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持.本文将解释支撑J2EE的13种核心技术:JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS

Java多线程编程详解

编程|多线程|详解 一:理解多线程多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单.多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是不可

Java NIO API详解

详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API.对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO.从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供异步(non-blocking)IO操作的API被引入.本文对其进行深入的介绍. NIO API主要集中在java.nio和它的subpackages中: java.nio 定义了Buff

C#简介- 类和对象,选自《C#编程语言详解》,送给新手

编程|对象|详解 类(class)是C#类型中最基础的类型.类是一个数据结构,将状态(字段)和行为(方法和其他函数成员)组合在一个单元中.类提供了用于动态创建类实例的定义,也就是对象(object).类支持继承(inheritance)和多态(polymorphism),即派生类能够扩展和特殊化基类的机制. 使用类声明可以创建新的类.类声明以一个声明头开始,其组成方式如下:先是指定类的特性和修饰符,后跟类的名字,基类(如果有的话)的名字,以及被该类实现的接口名.声明头后面就是类体了,它由一组包含