注意:继承主要使用的is-a关系
在子类中用一个新的方法来覆盖超类中的方法(override),需要注意的是如果子类之中的方法或者域 被覆盖时,仍然想访问superClass中的方法和域,此时必须使用super的关键字。
比如:
class Manager extends Employee { private double bonus; public Manager(String n,double s,int y,int m,int d) { super(n,s,y,m,d); bonus=0; } public double getSalary() { double baseSalary=super.getSalary(); return baseSalary+bonus; } public void setBonus(double b) { bonus=b; } } class Employee { private String name; private double salary; private Date hireDay; public Employee(String n,double s,int year,int month,int day) { name=n; salary=s; GregorianCalendar calendar=new GregorianCalendar(year,month-1,day); hireDay=calendar.getTime(); } public String getName() { return name; } public double getSalary() { return salary; } public Date getHireDay() { return hireDay; } public void raiseSalary(double byPercent) { double raise=salary*byPercent/100; salary+=raise; } }
其中Manager中继承了Employee,重载了其getSalary的方法,其中必须使用super.salary来访问超类中的salary域。
小结:
1.super的两种用法:一、调用超类中的构造器。二、调用访问被重载了的域或者方法。可以类比与this的用法。
2.多态(polymorphism):一个对象变量可以指示多种实际类型的现象。比如说其中的e
Manager boss=new Manager("vaful wu",8000,1994,1,8); boss.setBonus(5000); Employee[] staff=new Employee[3]; staff[0]=boss; staff[1]=new Employee("aa",5000,1989,10,1); staff[2]=new Employee("bb",4000,1990,12,3);
for(Employee e: staff) System.out.println("name:"+e.getName()+" salary:"+e.getSalary());
e对应的是Employee和重载的Manager对象。
因此,可以将子类的引用赋值给超类,但反之不行。因为is-a的关系,比如说manger一定是一个employee(原则是:特殊到一般,复杂到简单)
2.多态和动态绑定、抽象abstract
多态指的就是一个对象变量可以指示多个实际类型,并在编译器的运行过程中,一般选择动态绑定。
编译器的一般执行过程:一、查看对象的声明类型和方法名。二、查看方法的类型的参数名和个数,三、如果不是private、static和final方法,则实现动态绑定在method table中选择最接近的方法。
使用关键字abstract可以使得抽象类中没有必要的方法或者形式上的方法:
类比于C++中的纯虚函数
public:vitrual string getDescription()=0;//c++中的类似用法
比如Person类中:
public abstract String getDescription();
但是需要注意的是abstract类不能被实例化。
3.Java中常见的4中修饰符
private:仅仅是本类可用
public:对所有类可用
protected:对本包及所有子类可用
默认(default)不要修饰符:对本包可见
4.object类
可以通过file:///D:/Java/docs/api/index.html查看文档。
5.可变参数方法(类比C语言中的可变参数函数)
/***********************Java*******/
public class PrintStream{
public PrintStream printf(String fmt. Object ... args){return format(fmt,args);}
}省略号是Java的一部分,表明这个方法可以接受任意数量的对象。实际上后者表示的是Object 数组,即Object[];
/********C语言*****************/
使用头文件stdarg.h,函数声明形式类似于type fun(int n_values,...)
例如:
</pre><pre name="code" class="cpp">float average(int n_values,...) { va_list var_arg; int count; float sum=0; va_start(var_arg,n_values); for(count=0;cpunt<n_values;count+=1){ sum+=va_arg(val_arg,int); } va_end(var_arg); return sum/n_values; }