在研究到抽象类的时候突然有个想法,为什么必须要用抽象类呢,不会直接用普通的继承关系不就行了吗?为什么要定义一个抽象类,在抽象类中定义抽象方法,然后在子类中实现具体方法。
但是在普通的父类子类的继承中,不是子类可以扩展父类的方法吗?那样的话我不是可以不要用抽象类了?
是不是抽象类中的抽象方法是多此一举呢?直接在子类中扩展不是一样嘛。如下例子: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;
}
-------------------------------
改成这样不是一样正常运行吗?
/**
@version 1.01 2004-02-21
@author Cay Horstmann
*/import java.text.*;
import java.util.*;public class PersonTest1
{
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());
}
} class Person
{
public Person(String n)
{
name = n;
}
public String getDescription()
{
return "hello person ";
}
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;
}
但是在普通的父类子类的继承中,不是子类可以扩展父类的方法吗?那样的话我不是可以不要用抽象类了?
是不是抽象类中的抽象方法是多此一举呢?直接在子类中扩展不是一样嘛。如下例子: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;
}
-------------------------------
改成这样不是一样正常运行吗?
/**
@version 1.01 2004-02-21
@author Cay Horstmann
*/import java.text.*;
import java.util.*;public class PersonTest1
{
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());
}
} class Person
{
public Person(String n)
{
name = n;
}
public String getDescription()
{
return "hello person ";
}
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;
}
如果你修改了接口或抽象类中的方法,
在其他使用的地方就可以不修改了.
其优点:
1.很好的限制性.抽象类标识其子类的共有特性和必须实现的方法.2.很好的多态性.可以变化为任何他的子类.3.很好的扩展性.子类可以有其自己本身的属性,方法.
但是普通的父类,子类继承关系也具备这些优点啊
当代码量到一定程度的时候,就自然会明白了。