现实世界中,人们表征世界时,会把现实世界中的很多类具有相同特征的事物归为一个抽象类。比如水果是许多植物果实的总称,我们可以定义一个苹果类、定义一个西瓜类,可以实例化一个苹果对象,可以实例化一个西瓜对象,我们也可以定义一个水果类,但是你无法实例化一个水果对象,因为水果的实例必定是某个具体的植物果实,这时候,水果类就是一个抽象类,水果类可以被苹果类继承扩展,可以被西瓜类继承扩展,这是水果类的唯一用途。

又比如,如果进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

抽象类的定义形式:

一般格式如下:

abstract  class  类名{

类体

}

说明:

l  抽象类是不能直接实例化对象的类。也即抽象类不能使用new运算符去创建对象。

l  抽象类一般包括一个或几个抽象方法。所谓抽象方法需在abstract修饰符进行修饰,抽象方法只有方法的声明部分,没有具体的方法实现部分。抽象类的子类必须重写父类的抽象方法,才能实例子化,否则子类也是一个抽象类。

l    抽象类中不一定包含抽象方法,但是包含抽象方法的类必须说明为抽象类。

举例:Dog类继承于抽象类Animal。

abstract class  Animal{

String   name;

Animal(Stringname){         //非抽象方法

this.name=name;

}

void getname(){            //非抽象方法

System.out.println("Animal's name is"+name);

}

abstract void  move();            //      抽象方法,用abstract 修饰

}

class Dog extends Animal{

intage;

Dog(String name,int age){

super(name);

this.age=age;

}

void  move(){

System.out.println("Dog  is running!");

}

void getage(){

System.out.println("Dog is"+age+"  years  old");

}

}

Public class AbstractDemo{

public static void main(String args[]){

Dogd=new Dog("wangwang",5);

d.move();

d.getname();

d.getage();

}

}

程序运行结果:

Dog is  running!

Animal's name is wangwang

Dog is  5  years old

举例二、具有启动(startUp)方法的抽象车辆类Car,其每种具体子类都必须实现其自己的、专属于某种类型车辆的具体启动(startUp)方法

//定义抽象类Car

abstract class Car {

//定义抽象方法startUp

public abstract void startUp();

}

//定义抽象类Audi并使该类继承自Car

abstract class Audi extends Car{

//定义抽象方法turbo

public abstract void turbo();

}

//定义非抽象类Audi_A6继承自Audi

class Audi_A6 extends Audi{

//实现startUp方法

public void startUp()    {

System.out.println("调用了奥迪A6的启动功能!!!");

}

//实现turbo方法

public void turbo()  {

System.out.println("调用了奥迪A6的加速功能!!!");

}

}

//定义非抽象类Audi_A8继承自Audi

class Audi_A8 extends Audi{

//实现startUp方法

public void startUp(){

System.out.println("调用了奥迪A8的启动功能!!!");

}

//实现turbo方法

public void turbo(){

System.out.println("调用了奥迪A8的加速功能!!!");

}

}

public class AbstractClassDemo{

public static void main(String[] args) {

//创建Audi_A6对象并使该类引用a6指向该对象

Audi_A6 a6=new Audi_A6();

//调用Audi_A6对象中的方法

a6.startUp();

a6.turbo();

//创建Audi_A8对象并使该类引用a8指向该对象

Audi_A8 a8=new Audi_A8();

//调用Audi_A8对象中的方法

a8.startUp();

a8.turbo();

}

}

程序执行结果:

调用了奥迪A6的启动功能!!!

调用了奥迪A6的加速功能!!!

调用了奥迪A8的启动功能!!!

调用了奥迪A8的加速功能!!!

java的抽象类的更多相关文章

  1. JAVA:抽象类VS接口

    JAVA中抽象类和接口的区别比较,以及它们各自的用途. 1.JAVA抽象类: 抽象类除了不能实例化以外,跟普通类没有任何区别.在<JAVA编程思想>一书中,将抽象类定义为“包含抽象方法的类 ...

  2. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  3. 关于JAVA中抽象类和接口的区别辨析

    今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解. 1 抽象类 用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为.也就是说,抽象类中的方法,需要在子类中进行重写 ...

  4. [ Java学习基础 ] Java的抽象类与接口

    一.抽象类 1. 抽象类 Java语言提供了两种类:一种是具体类:另一种是抽象子类. 2. 抽象类概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的 ...

  5. java中抽象类的定义和使用

    java虽然比较简单,但是细节的知识点还是很多的,现在,介绍一下抽象类的定义和实现基础. 指的是在类中定义方法,而不去实现它,而在它的子类中去具体实现,继承抽象类的子类必须实现父类的抽象方法,除非子类 ...

  6. Java基础-抽象类和接口

    抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...

  7. JAVA的抽象类和接口

    抽象类 在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对 ...

  8. Java中抽象类也能实例化

    在Java中抽象类真的不能实例化么? 在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方法却是可以有自己的构造方法的.这样就把我搞糊涂了,既然 ...

  9. Java中抽象类也能实例化.RP

    在Java中抽象类真的不能实例化么? 在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方法却是可以有自己的构造方法的.这样就把我搞糊涂了,既然 ...

  10. Java 中抽象类与接口的区别

    TypeScript 中的接口,有点类似抽象类的概念.Java 中抽象类属于包含属性与抽象行为,而接口通常只是抽象行为.抽象类可以实现模板模式. 参考 https://www.cnblogs.com/ ...

随机推荐

  1. hadoop笔记之MapReduce的运行流程

    MapReduce的运行流程 MapReduce的运行流程 基本概念: Job&Task:要完成一个作业(Job),就要分成很多个Task,Task又分为MapTask和ReduceTask ...

  2. 简单的表单验证(js、jquery)

    //javascript代码 function valForm(){ var username=document.getElementById("username"); var p ...

  3. ajax防止重复提交请求1

    ajax防止重复提交请求 A. 独占型提交 只允许同时存在一次提交操作,并且直到本次提交完成才能进行下一次提交. module.submit = function() {   if (this.pro ...

  4. 移动端下网页border:1px显示

    解决这个问题之前首先要了解移动前端开发viewport的概念,自己写了一篇很粗糙viewport详解的文章对它有了一个很简单的理解.这里推荐一篇很详细的博文<<移动前端开发之viewpor ...

  5. 3000本IT书籍下载地址

    http://www.shouce.ren/post/d/id/112300    黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299    黑 ...

  6. android ViewHolder 使用

    android中使用ListView   ExpandableListView  数据适配器adapter很多都是自己定义,自己定义数据适配器时,要重写getView.重写getView为了不让每次调 ...

  7. VS中C++代码折叠

    用VS编写C#时,可以用#region name和#endregion,将代码分段,这样可以将代码折叠起来,当类过大,方法过长时,这种方法可以提高阅读效率,是人看着更舒服. 对于C/C++语言,#re ...

  8. [Leetcode][Python]31: Next Permutation

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 31: Next Permutationhttps://oj.leetcode ...

  9. oracle定时执行计划任务

    show parameter job_queue_processes; alter system set job_queue_processes=10; 1,创建测试表 create table jo ...

  10. saiku导出excel单元格格式与中文列宽自动适应

    在saiku导出excel后打开发现单元格的整数也显示为小数,并且含有中文的列宽没有自动适应,解决办法如下: 打开ExcelWorksheetBuilder.java文件,找到applyCellFor ...