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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值