虽然接触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();
4. for (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", 50000, 1989, 10, 1);
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 类和方法详解 Abstract 类和方法是 Java 编程语言的重要组成部分,它们在面向对象编程(OOP)中扮演着关键角色。 Abstract 类和方法提供了一种方式来定义蓝图,供其他类继承和实现。 Abstract ...
这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...
JAVA抽象类和抽象方法实例分析 JAVA抽象类和抽象方法是Java面向对象程序设计中非常重要的概念,它们是Java编程语言的基础组成部分。抽象类和抽象方法可以帮助开发者更好地组织和设计程序架构,提高代码的可读性和...
Java基础类(JFC,Java Foundation Classes)是Sun Microsystems为提升Java GUI功能而引入的一个综合框架,它包含了多个API子集,包括AWT(Abstract Window Toolkit)、Java2D、Accessibility、Drag & Drop以及Swing...
在Java编程语言中,抽象类是用来作为其他类的基类,它定义了一组抽象方法,这些方法必须在子类中实现。由于抽象类自身不能被实例化,这意味着你不能使用`new`关键字直接创建一个抽象类的对象。然而,尽管不能直接...
在Java编程语言中,`abstract`关键字用于定义抽象类(abstract class),这是一个非常重要的概念,它为多态性提供了基础。抽象类是不能被实例化的,它们的主要目的是作为其他类的基类,提供一个公共的接口或者部分...
在Java编程语言中,抽象类(abstract class)和接口(interface)都是用于实现抽象化的重要工具,它们可以帮助程序员更好地组织代码,提高代码的可复用性和扩展性。尽管二者在功能上有一些相似之处,但在实际使用中...
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 class)是面向对象编程的一个重要概念,它为其他类提供了一个模板设计。这个压缩包"Java_abstract_example.rar"包含了一个关于抽象类的实例,名为"AbstractTest.java",这非常...
Abstract类实现接口 马克-to-win java视频 implement
### Java图形类与学生类知识点解析 #### 一、Java图形类详解 ##### 1. 抽象类 Shape 在给定的代码片段中,首先定义了一个名为 `Shape` 的抽象类,它作为所有具体图形类(如矩形、圆等)的基类。这个抽象类包含两...
在Java中,如果一个类包含至少一个抽象方法(没有具体实现的方法),那么这个类必须声明为抽象类,使用abstract关键字。抽象类不能被实例化,但可以被其他类继承,以便子类可以提供缺失的实现。这是Java实现多态性的...
在Java编程语言中,抽象类是一种特殊的类,它不能被实例化,但可以作为其他类的基类。这种设计模式的引入是为了支持多态性,它允许我们定义一个通用的接口,而具体的实现则由其子类来完成。抽象类在Java中扮演着重要...
在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...
在Java编程语言中,`interface`接口和`abstract class`抽象类是两种重要的面向对象设计概念,它们都用于实现多态性,但有着显著的区别。理解这些差异对于编写可扩展和可维护的代码至关重要。 首先,接口是完全抽象...
在深入探讨Java抽象类与抽象方法之前,我们首先需理解其基本概念以及它们在面向对象编程中的作用。Java作为一种广泛使用的编程语言,提供了多种机制来实现代码的复用性和灵活性,其中抽象类和抽象方法是关键特性之一...
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性...
成员内部类可以使用final、abstract、public和private四种修饰符,它们的作用与普通类的修饰符相同。 静态嵌套类 静态嵌套类是指使用static关键字定义的内部类。静态嵌套类不能访问外部类的非静态成员变量和方法,...
1. **Java基础类**:在`java`目录下,你会找到Java基础类库,包括`lang`、`io`、`util`等包。`lang`包是所有Java程序的基础,包含了如`Object`、`String`、`System`等基本类。`io`包提供了输入/输出功能,如`File`、...