首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java起飞 - 继承

2012-11-03 
Java起航 ----继承????? 一、Inheritance????? 继承,是面向对象三大特征之一,也是实现软件复用的重要手段。

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的区别

?

热点排行