一、Inheritance
继承,是面向对象三大特征之一,也是实现软件复用的重要手段。 Java的继承支持单继承(接口除外),即每个子类只有一个直接父类
在Java中,继承的关键字是extends。实现继承的类被称为子类,被继承的类称为父类,也可称之为基类、超类。父类与子类的关系,是一种一般与特殊的关系,比如动物和猫。
1、一旦发生继承关系,子类将获得父类的全部属性和方法(除了私有的),值得指出的是: Java的子类不能获得父类的构造器。
2、如果定义一个类时并未显式指定这个类的直接父类,那么这个类默认扩展 java.lang.object 类,所以我们建的类虽然没有定义equals( )和hashCode( )方法,但是却可以使用这2个方法(本篇的代码就不做介绍了)
3、大部分时候,子类总是以父类为基础,额外增加新的属性和方法。如果子类认为父类的方法不能满足当前行为,则可以进行方法重写(注意与方法重载进行区别),也称方法覆盖(Override)。
方法重写的要求如下:
两同:方法名相同、形参列表相同
两小:子类方法返回值类型应比父类的小或相等,子类抛出的异常类应比父类的小
一大:子类方法的访问权限应比父类的更大或相等
需要指出的是,重写方法和被重写方法要保持一致性,即要么都是类方法,要么都是实例方法。
关于方法重写的每个要求就不一一示例
相关代码如下:
package com.Inheritance;
/**************************************************
* simply access the variable and methods from superclass
*
* @author: 瘋叻ハ.兩
* @revision: 1.0
* @create-time: 2011-9-4 下午07:01:05
***************************************************/
public class InhertanceTest1 {
public static void main(String[] args) {
// construct a Manager object, ①、but it can't invoke(调用) Employee's construction
// Manager bo = new Employee("Mike", 28, 6000); it's a wrong way
Manager boss = new Manager("John", 35, 8000);
// ①、invoke the Employee's filed by boss
System.out.println(boss.getName());
boss.setBonus(500);
// it's a new way for me to achieve the Polymorphism, so i want to share for you ahead of time
Employee[] em = new Employee[3];
em[0] = boss;
em[1] = new Employee("Mike", 25, 4000);
em[2] = new Employee("Kevin", 28, 5000);
// print out everyone's salary
for(Employee e : em){
System.out.println(e.getName() + "的工资是:" + e.getSalary());
}
}
}
class Employee {
/**
* @param name the employee's name
* @param age the employee's age
* @param salary the employee's salary
*/
private String name;
private int age;
private int salary;
public Employee(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
// Getters
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getSalary() {
return salary;
}
}
class Manager extends Employee{
/**
* @param bonus the manager's bonus(奖金)
*/
private int bonus;
public Manager(String name, int age, int salary){
// invoke superclass's constructor
super(name, age, salary);
bonus = 0;
}
public void setBonus(int bonus){
this.bonus = bonus;
}
public int getBonus(){
return bonus;
}
// ③、override method depend on itself
@Override
public int getSalary(){
int baseSalary = super.getSalary();
return bonus + baseSalary;
}
}
运行结果:
John
John的工资是:8500
Mike的工资是:4000
Kevin的工资是:5000
分 析: 看代码注释
如果父类中的方法被private修饰,则该方法归父类私有,对其子类是隐藏的。所以子类并不能访问该方法,也就无法重写该方法。如果子类中定义了一个与父类私有方法一样方法名、形参和返回值的方法,那么它属于什么呢?
且看代码:
package com.ExtendstTests;
/**************************************************
*
* @author: 瘋叻ハ.兩
* @create-time: 2011-5-29 下午08:19:23
* @revision: 1.0
* @purpose:
*
***************************************************/
class Parent2{
private void say(){
System.out.println("此为父类对象的私有方法,它只能被同一个类里的父类的对象调用");
}
void run(){
this.say();
}
}
public class Sun2 {
// 因为不是重写,所以可以被static修饰却不报错
static void say(){
System.out.println("此非重写父类方法");
}
public static void main(String[] args) {
Sun2.say();
new Parent2().run();
}
}
运行结果:
此非重写父类方法
此为父类对象的私有方法,它只能被同一个类里的父类的对象调用
分 析 : 看代码注释
二、super
在上述代码中,如果你是个新手,你会看到有个super关键字。它代表什么呢,敬请期待个人小结与this的区别