`

Java abstract 类

    博客分类:
  • Java
阅读更多
    虽然接触Java已经快一年了,也系统的学过Java语法,不过很多概念到现在都搞不清楚,现在决定重新把这些模糊的概念重新温习一遍,今天就现总结一下抽象类(abstract class)。

1、使用abstract类的动机:可以参考 Cay S. Horstmann, Gary Cornel 写的书《Core Java™ 2 Volume I - Fundamentals, Seventh Edition 》(顺便罗嗦一下,该书是偶见过最好的Java入门书) “Classes, Superclasses, and Subclasses ”一节,定义一个abstract class的格式是:修饰符(public, private, etc)+abstract+类名 或者 abstract + 修饰符 + 类名。

2、如果一个类至少存在一个抽象方法(abstract method),则它自身必须声明成一个抽象类。但一个类可以被声明成一个抽象类即使它没有任何抽象方法。声明一个abstract method的格式是:修饰符(public, private, etc)+abstract+返回类型 + 方法名 或者 abstract + 修饰符 + 返回类型 + 方法名。

3、一个抽象类可以有数据域和非抽象方法(concrete data and concrete methods)。

4、当一个子类继承某个抽象类时,它可以有两个选择:
    (1)    部分实现或完全不实现父类的所有抽象方法,但此时子类必须声明为抽象类。
    (2)    实现父类所有的抽象方法,此时之类不比声明为抽象类。

5、抽象类不能被实例化(be instantiated),但可以实例化非抽象子类(concrete subclass)。
   可以声明抽象类变量,但该变量必须指向一个非抽象子类
.看下面一个例子:
<!---->   1.  Person [] people = new Person[2];    
   
2. people[0= new Employee();    
   
3. people[1= new Student();  
   
4for (Person p : people)  
   
5.    System.out.println(p.getName() + "," + p.getDescription());  
注意代码中的一个调用:p.getDescription().可能有人会担心这里调用了一个没定义的方法。但是, 由于不能构造抽象类Person的对象,所以p永远不会调动Person对象,而是只会调用诸如Employee或Student这样的具体子类方法。注意,如果没有定义Person中抽象方法getDescription()但是通过p调用getDescription()则会产生编译错误,编译器只允许调用在类中声明的方法。

6、摘自《Core Java 2》的一个例子:
PersonTest.java
<!---->/**
   
@version 1.01 2004-02-21
   
@author Cay Horstmann
*/

import java.text.*;
import java.util.*;

public class PersonTest
{  
   
public static void main(String[] args)
   {  
      Person[] people 
= new Person[2];

      
// fill the people array with Student and Employee objects
      people[0= new Employee("Harry Hacker"500001989101);
      people[
1= new Student("Maria Morris""computer science");

      
// print out names and descriptions of all Person objects
      for (Person p : people)
         System.out.println(p.getName() 
+ "" + p.getDescription());
   }
}

abstract class Person
{  
   
public Person(String n)
   {  
      name 
= n;
   }

   
public abstract String getDescription();

   
public String getName()
   {  
      
return name;
   }

   
private String name;
}

class Employee extends Person
{  
   
public Employee(String n, double s,
      
int year, int month, int day)
   {  
      
super(n);
      salary 
= s;
      GregorianCalendar calendar 
= new GregorianCalendar(year, month - 1, day);
      hireDay 
= calendar.getTime();
   }

   
public double getSalary()
   {  
      
return salary;
   }

   
public Date getHireDay()
   {  
      
return hireDay;
   }

   
public String getDescription()
   {  
      
return String.format("an employee with a salary of $%.2f", salary);
   }

   
public void raiseSalary(double byPercent)
   {  
      
double raise = salary * byPercent / 100;
      salary 
+= raise;
   }

   
private double salary;
   
private Date hireDay;
}


class Student extends Person
{  
   
/**
      
@param n the student's name
      
@param m the student's major
   
*/
   
public Student(String n, String m)
   {  
      
// pass n to superclass constructor
      super(n);
      major 
= m;
   }

   
public String getDescription()
   {  
      
return "a student majoring in " + major;
   }

   
private String major;
}

参考资料:

Core Java 2 Volume I - Fundamentals, Seventh Edition

by Cay S. Horstman, Gary Cornell



分享到:
评论

相关推荐

    java编程abstract类和方法详解

    Java 编程 abstract 类和方法详解 Abstract 类和方法是 Java 编程语言的重要组成部分,它们在面向对象编程(OOP)中扮演着关键角色。 Abstract 类和方法提供了一种方式来定义蓝图,供其他类继承和实现。 Abstract ...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

    JAVA抽象类和抽象方法(abstract)实例分析

    JAVA抽象类和抽象方法实例分析 JAVA抽象类和抽象方法是Java面向对象程序设计中非常重要的概念,它们是Java编程语言的基础组成部分。抽象类和抽象方法可以帮助开发者更好地组织和设计程序架构,提高代码的可读性和...

    \Java基础类 \Java基础类

    Java基础类(JFC,Java Foundation Classes)是Sun Microsystems为提升Java GUI功能而引入的一个综合框架,它包含了多个API子集,包括AWT(Abstract Window Toolkit)、Java2D、Accessibility、Drag & Drop以及Swing...

    Java实例化一个抽象类对象的方法教程

    在Java编程语言中,抽象类是用来作为其他类的基类,它定义了一组抽象方法,这些方法必须在子类中实现。由于抽象类自身不能被实例化,这意味着你不能使用`new`关键字直接创建一个抽象类的对象。然而,尽管不能直接...

    abstract抽象类

    在Java编程语言中,`abstract`关键字用于定义抽象类(abstract class),这是一个非常重要的概念,它为多态性提供了基础。抽象类是不能被实例化的,它们的主要目的是作为其他类的基类,提供一个公共的接口或者部分...

    java abstract class interface之间的区别介绍

    在Java编程语言中,抽象类(abstract class)和接口(interface)都是用于实现抽象化的重要工具,它们可以帮助程序员更好地组织代码,提高代码的可复用性和扩展性。尽管二者在功能上有一些相似之处,但在实际使用中...

    java abstract

    java abstract s3c44b0 led测试

    Abstract Java game library based on JavaFX. 基于JavaFX的抽象Java游戏库

    Abstract Java game library based on JavaFX. 基于JavaFX的抽象Java游戏库 Abstract Java game library based on JavaFX. 基于JavaFX的抽象Java游戏库 Abstract Java game library based on JavaFX. 基于JavaFX的...

    Java_abstract_example.rar_abstract class_抽象

    在Java编程语言中,抽象类(abstract class)是面向对象编程的一个重要概念,它为其他类提供了一个模板设计。这个压缩包"Java_abstract_example.rar"包含了一个关于抽象类的实例,名为"AbstractTest.java",这非常...

    Abstract类实现接口---马克-to-win java视频

    Abstract类实现接口 马克-to-win java视频 implement

    java图形类与学生类

    ### Java图形类与学生类知识点解析 #### 一、Java图形类详解 ##### 1. 抽象类 Shape 在给定的代码片段中,首先定义了一个名为 `Shape` 的抽象类,它作为所有具体图形类(如矩形、圆等)的基类。这个抽象类包含两...

    java的类和对象

    在Java中,如果一个类包含至少一个抽象方法(没有具体实现的方法),那么这个类必须声明为抽象类,使用abstract关键字。抽象类不能被实例化,但可以被其他类继承,以便子类可以提供缺失的实现。这是Java实现多态性的...

    Java 抽象类

    在Java编程语言中,抽象类是一种特殊的类,它不能被实例化,但可以作为其他类的基类。这种设计模式的引入是为了支持多态性,它允许我们定义一个通用的接口,而具体的实现则由其子类来完成。抽象类在Java中扮演着重要...

    Java中抽象类和接口的区别

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    Java中interface接口与abstractclas

    在Java编程语言中,`interface`接口和`abstract class`抽象类是两种重要的面向对象设计概念,它们都用于实现多态性,但有着显著的区别。理解这些差异对于编写可扩展和可维护的代码至关重要。 首先,接口是完全抽象...

    Java抽象类和抽象方法

    在深入探讨Java抽象类与抽象方法之前,我们首先需理解其基本概念以及它们在面向对象编程中的作用。Java作为一种广泛使用的编程语言,提供了多种机制来实现代码的复用性和灵活性,其中抽象类和抽象方法是关键特性之一...

    深入理解abstract class和interface

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性...

    Java语法总结 - 内部类

    成员内部类可以使用final、abstract、public和private四种修饰符,它们的作用与普通类的修饰符相同。 静态嵌套类 静态嵌套类是指使用static关键字定义的内部类。静态嵌套类不能访问外部类的非静态成员变量和方法,...

    java各个类的源代码

    1. **Java基础类**:在`java`目录下,你会找到Java基础类库,包括`lang`、`io`、`util`等包。`lang`包是所有Java程序的基础,包含了如`Object`、`String`、`System`等基本类。`io`包提供了输入/输出功能,如`File`、...

Global site tag (gtag.js) - Google Analytics