深入解析Java编程中的抽象类_java

Java程序用抽象类(abstract class)来实现自然界的抽象概念。抽象类的作用在于将许多有关的类组织在一起,提供一个公共的类,即抽象类,而那些被它组织在一起的具体的类将作为它的子类由它派生出来。抽象类刻画了公有行为的特征,并通过继承机制传送给它的派生类。在抽象类中定义的方法称为抽象方法,这些方法只有方法头的声明,而用一个分号来代替方法体的定义,即只定义成员方法的接口形式,而没有具体操作。只有派生类对抽象成员方法的重定义才真正实现与该派生类相关的操作。

在各子类继承了父类的抽象方法之后,再分别用不同的语句和方法体来重新定义它,形成若干个名字相同,返回值相同,参数列表也相同,目的一致但是具体实现有一定差别的方法。抽象类中定义抽象方法的目的是实现一个接口,即所有的子类对外都呈现一个相同名字的方法。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。对于抽象类与抽象方法的限制如下:

 (1)凡是用abstract 修饰符修饰的类被称为抽象类。凡是用abstract修饰符修饰的成员方法被称为抽象方法。
 (2)抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法。
 (3)抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类。
 (4)对于抽象方法来说,在抽象类中只指定其方法名及其类型,而不书写其实现代码。
 (5)抽象类可以派生子类,在抽象类派生的子类中必须实现抽象类中定义的所有抽象方法。
 (6)抽象类不能创建对象,创建对象的工作由抽象类派生的子类来实现。
 (7)如果父类中已有同名的abstract方法,则子类中就不能再有同名的抽象方法。
 (8)abstract不能与final并列修饰同一个类。
 (9)abstract 不能与private、static、final或native并列修饰同一个方法。

Java语言规定,当一个类里面有抽象方法的时候,这个类必须被声明为抽象类。

  子类继承父类时,如果这个父类里面有抽象方法,并且子类觉得可以去实现父类的所有抽象方法,那么子类必须去实现父类的所有抽象方法,如:

/**
 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
 * @author gacl
 *
 */
class Dog extends Animal {
  /**
   * Dog类添加自己特有的属性
   */
  public String furColor;

  public Dog(String n, String c) {
    super(n);//调用父类Animal的构造方法
    this.furColor = c;
  }

  @Override
  public void enjoy() {
    System.out.println("狗叫....");
  }

}

 这个父类里面的抽象方法,子类如果觉得实现不了,那么把就子类也声明成一个抽象类,如:

/**
 * 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),
 * 但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,
 * 那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。
 * @author gacl
 *
 */
abstract class Cat extends Animal {

  /**
   * Cat添加自己独有的属性
   */
  public String eyeColor;

  public Cat(String n, String c) {
    super(n);//调用父类Animal的构造方法
    this.eyeColor = c;
  }
}

 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。如:

/**
 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
 * @author gacl
 *
 */
class BlueCat extends Cat {

  public BlueCat(String n, String c) {
    super(n, c);
  }

  /**
   * 实现了抽象方法enjoy
   */
  @Override
  public void enjoy() {
    System.out.println("蓝猫叫...");
  }

}

完整的测试代码如下:

package javastudy.summary;

/**
 * 父类Animal
 * 在class的前面加上abstract,即声明成这样:abstract class Animal
 * 这样Animal类就成了一个抽象类了
 */
abstract class Animal {

  public String name;

  public Animal(String name) {
    this.name = name;
  }

  /**
   * 抽象方法
   * 这里只有方法的定义,没有方法的实现。
   */
  public abstract void enjoy(); 

}

/**
 * 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),
 * 但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,
 * 那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。
 * @author gacl
 *
 */
abstract class Cat extends Animal {

  /**
   * Cat添加自己独有的属性
   */
  public String eyeColor;

  public Cat(String n, String c) {
    super(n);//调用父类Animal的构造方法
    this.eyeColor = c;
  }
}

/**
 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
 * @author gacl
 *
 */
class BlueCat extends Cat {

  public BlueCat(String n, String c) {
    super(n, c);
  }

  /**
   * 实现了抽象方法enjoy
   */
  @Override
  public void enjoy() {
    System.out.println("蓝猫叫...");
  }

}

/**
 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
 * @author gacl
 *
 */
class Dog extends Animal {
  /**
   * Dog类添加自己特有的属性
   */
  public String furColor;

  public Dog(String n, String c) {
    super(n);//调用父类Animal的构造方法
    this.furColor = c;
  }

  @Override
  public void enjoy() {
    System.out.println("狗叫....");
  }

}

public class TestAbstract {

  /**
   * @param args
   */
  public static void main(String[] args) {

    /**
     * 把Cat类声明成一个抽象类以后,就不能再对Cat类进行实例化了,
     * 因为抽象类是残缺不全的,缺胳膊少腿的,因此抽象类不能被实例化。
     */
    //Cat c = new Cat("Catname","blue");
    Dog d = new Dog("dogname","black");
    d.enjoy();//调用自己实现了的enjoy方法

    BlueCat c = new BlueCat("BlueCatname","blue");
    c.enjoy();//调用自己实现了的enjoy方法
  }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
抽象类
深入解析wpf编程、深入解析wpf编程 pdf、java深入解析、java深入解析 pdf、java深入解析 pdf下载,以便于您获取更多的相关知识。

时间: 2024-09-20 15:55:04

深入解析Java编程中的抽象类_java的相关文章

深入解析Java编程中final关键字的作用_java

final class当一个类被定义成final class,表示该类的不能被其他类继承,即不能用在extends之后.否则在编译期间就会得到错误. package com.iderzheng.finalkeyword; public final class FinalClass { } // Error: cannot inherit from final class PackageClass extends FinalClass { } Java支持把class定义成final,似乎违背了面

深入解析Java编程中接口的运用_java

接口的本质--接口是一种特殊的抽象类,这种抽象类里面只包含常量和方法的定义,而没有变量和方法的实现. 抽象类所具有的一些东西接口可以具有,假如一个抽象类里面所有的方法全都是抽象的,没有任何一个方法需要这个抽象类去实现,并且这个抽象类里面所有的变量都是静态(static)变量,都是不能改变(final)的变量,这时可以把这样的抽象类定义为一个接口(interface).把一个类定义成一个接口的格式是把声明类的关键字class用声明接口的关键字interface替换掉即可. 接口(interface

深入解析Java编程中面向字节流的一些应用_java

文件输入输出流 文件输入输出流 FileInputStream 和 FileOutputStream 负责完成对本地磁盘文件的顺序输入输出操作. [例]通过程序创建一个文件,从键盘输入字符,当遇到字符"#"时结束,在屏幕上显示该文件的所有内容 import java.io.*; class ep10_5{ public static void main(String args[]){ char ch; int data; try{ FileInputStream a=new FileI

深入解析Java编程中final关键字的使用_java

在Java中声明属性.方法和类时,可使用关键字final来修饰.final变量即为常量,只能赋值一次:final方法不能被子类重写:final类不能被继承.1.final成员声明 final 字段有助于优化器作出更好的优化决定,因为如果编译器知道字段的值不会更改,那么它能安全地在寄存器中高速缓存该值.final 字段还通过让编译器强制该字段为只读来提供额外的安全级别.  1.1关于final成员赋值1)在java中,普通变量可默认初始化.但是final类型的变量必须显式地初始化.   2)fin

深入解析Java编程中的boolean对象的运用_java

只能是true或false两个值之一的变量就是布尔(boolean)类型变量,true和false是布尔型直接量.你可以用下面的语句定义一个名称为state的布尔型变量: boolean state=true     该语句用true值对变量state进行了初始化.你也可以使用赋值语句为一个boolean型变量赋值.例如,语句, state=false     设置变量state的值为false.     目前,我们除了为布尔变量赋值外,还不能进行更多的操作,但正像你在下一章中将要看到的,布尔型

深入解析Java编程中方法的参数传递_java

在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value public static class Value { private String value = "value"; public String getValue() { return value; } public void

解析Java编程中对于包结构的命名和访问_java

包的命名包的名字应该避免与其他包冲突,所以选择一个既有意义又唯一的名字是包设计的一个重要方面.但是全球的程序员都在开发包,根本就没有办法获知谁采用了什么包名,因此选择唯一的包名是一个难题.如果我们确定某个包只在我们的组织内部使用,那么我们就可以让内部仲裁者(internal arbiter)来确保项目之间不会发生名字冲突. 但是对于整个世界而言,这种方法是不实际的.包的标识符都是简单的名字,一种比较好的能够确保包名唯一的方法是使用Internet域名.如果我们所就职的公司的名字为Magic.ln

完全解析Java编程中finally语句的执行原理_java

可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱.问题分析首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子. 清单 1. public class Test { public static void main(Stri

在Java编程中定义方法_java

方法包含一个方法头和一个方法体.下面是一个方法的所有部分: 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法.定义了该方法的访问类型. 返回值类型 :方法可能会返回值.returnValueType是方法返回值的数据类型.有些方法执行所需的操作,但没有返回值.在这种情况下,returnValueType是关键字void. 方法名:是方法的实际名称.方法名和参数表共同构成方法签名. 参数类型:参数像是一个占位符.当方法被调用时,传递值给参数.这个值被称为实参或变量.参数列表是指方法的参数类型.