Java起航 ---- 继承
????? 一、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 wayManager boss = new Manager("John", 35, 8000);// ①、invoke the Employee's filed by bossSystem.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 timeEmployee[] 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 salaryfor(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 constructorsuper(name, age, salary);bonus = 0;}public void setBonus(int bonus){this.bonus = bonus;}public int getBonus(){return bonus;}// ③、override method depend on itself @Overridepublic 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的区别
?