继承 --> 面向对象(Java版本)
2012-10-07 11:36
197 查看
Tutorial 1: 公司的雇员与经理
Term: superclass --> 超类 subClass --> 扩展类
继承使用的前提:
满足"is-a"的关系.例如:经理也是职员,但是经理却拥有雇员没有的属性(经理有员工没有的分红部分)
继承设计的原则:
将一般性的,通用的属性和方法放置到父类中,而将特殊的属性以及方法放置到子类中
View Code
由于设计类时,需满足封装的特性:所以Employee的salary无法直接被父类Manager访问到. 而需要有public访问控制权限的才能访问到。然而直接使用getSalary是调用自己的方法,而不是父类的方法。所以编译器额外提供super关键字来声明调用父类的方法,而非自己的方法。
this 和 super
this关键字和super有着可类比的地方:
1. 访问当前对象的某个方法可以使用:this.方法名,而访问父类的方法:super.方法名
2. 调用另外一个构造函数:this(参数列表) 调用父类的构造函数 super(参数列表) 并且该两种使用构造函数的方式必须是构造函数方法体的第一句句
3. 访问当前对象的某个属性:this.属性名,而访问父类的属性名: super.属性名 (当发生了属性覆盖的时候,根据属性最近原则来确定是哪个对象)对属性进行覆盖的情况很少出现
然而这两个概念有着一定的区别:
this表明的是当前对象的引用,而super关键字只是表明需要运行父类的方法,或者构造方法。其并非引用,不可能给super字段进行对象引用的赋值。
继承可以增加字段,增加方法,甚至修改方法(通过方法的覆盖来实现)然而继承无法删除字段,删除方法。
继承关系的构造函数的调用:
1. 在扩展类中,如果不显式的调用基类的构造函数,那么扩展类将会调用基类的默认的构造函数(无参构造函数--当基类不提供该默认的构造函数,将会报错)
2. 扩展类中,如果显式的调用了某基类的构造函数,那么扩展类将不会自动的调用基类的默认的构造函数
默认构造函数是否被自动的添加到基类中:
1. 该类是否已经显式的编写过构造函数,如果已经编写了构造函数,那么编译器并不为我们自动添加默认的构造函数。
2. 当某类没有显式的编写任何一个构造函数时,那么将会添加一个默认的构造函数
Term: superclass --> 超类 subClass --> 扩展类
继承使用的前提:
满足"is-a"的关系.例如:经理也是职员,但是经理却拥有雇员没有的属性(经理有员工没有的分红部分)
继承设计的原则:
将一般性的,通用的属性和方法放置到父类中,而将特殊的属性以及方法放置到子类中
View Code
public class Employer { public Employer() { } public Employer(String name) { this.name = name; this.salary = 0; //不需要,默认会初始化为0 } public Employee(String name,double salary){ this.name = name; this.salary = salary; } public void setName(String name) { this.name = name; } public void setSalary(double salary) { this.salary = salary; } public String getName() { return name; } public double getSalary() { return salary; } private double salary; private String name; } public class Manager extends Employee{ public Manager(){ //super(); //Default } public Manager(String name){ super(name,0); } public Manager(String name,double salary){ super(name,salary); } public void setBonus(double bonus){ this.bonus = bonus; } public double getSalary(){ double baseSalary = super.getSalary(); //Why not use: salary + bonus OR getSalary() + bonus; return baseSalary + bonus; } private double bonus; }
由于设计类时,需满足封装的特性:所以Employee的salary无法直接被父类Manager访问到. 而需要有public访问控制权限的才能访问到。然而直接使用getSalary是调用自己的方法,而不是父类的方法。所以编译器额外提供super关键字来声明调用父类的方法,而非自己的方法。
this 和 super
this关键字和super有着可类比的地方:
1. 访问当前对象的某个方法可以使用:this.方法名,而访问父类的方法:super.方法名
2. 调用另外一个构造函数:this(参数列表) 调用父类的构造函数 super(参数列表) 并且该两种使用构造函数的方式必须是构造函数方法体的第一句句
3. 访问当前对象的某个属性:this.属性名,而访问父类的属性名: super.属性名 (当发生了属性覆盖的时候,根据属性最近原则来确定是哪个对象)对属性进行覆盖的情况很少出现
然而这两个概念有着一定的区别:
this表明的是当前对象的引用,而super关键字只是表明需要运行父类的方法,或者构造方法。其并非引用,不可能给super字段进行对象引用的赋值。
继承可以增加字段,增加方法,甚至修改方法(通过方法的覆盖来实现)然而继承无法删除字段,删除方法。
继承关系的构造函数的调用:
1. 在扩展类中,如果不显式的调用基类的构造函数,那么扩展类将会调用基类的默认的构造函数(无参构造函数--当基类不提供该默认的构造函数,将会报错)
2. 扩展类中,如果显式的调用了某基类的构造函数,那么扩展类将不会自动的调用基类的默认的构造函数
默认构造函数是否被自动的添加到基类中:
1. 该类是否已经显式的编写过构造函数,如果已经编写了构造函数,那么编译器并不为我们自动添加默认的构造函数。
2. 当某类没有显式的编写任何一个构造函数时,那么将会添加一个默认的构造函数
相关文章推荐
- Java基础<六>---> 面向对象与java特性(封装、继承、多态
- 黑马程序员<java基础<面向对象(封装,继承,多态,抽象)>>
- Java 面向对象的三大特征:继承、封装【隐藏】、多态<为了适应需求的多种变化,使代码变得更加通用>
- java基础<面向对象>总结(函数、封装、继承、多态)
- 黑马程序员 JAVA基础<二> 面向对象之封装 继承 多态
- Java基础-->面向对象<继承,内部类,多态,包,抽象与接口>
- java-面向对象<二>-《下篇》
- Java 入门 之 面向对象 封装、继承与多态(二)
- java 基础---面向对象(继承)
- 黑马程序员——java-面向对象二(继承,多态,抽象,接口,包,内部类)
- java面向对象的三大特征:封装,继承,多态
- Java基础——面向对象——继承、抽象类、接口、多态、包、内部类、异常等
- java面向对象的继承以及方法重写和重载
- Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上)
- 黑马程序员-(8)Java基础之面向对象(三)继承
- [疯狂Java]面向对象:继承、覆盖、super
- <JavaSE学习笔记>面向对象(2):Java内存机制
- Java基础语法(五)----面向对象(2) 继承
- 黑马程序员--Java学习日记之面向对象(封装,继承和构造方法)
- Java的面向对象的三大特性 封装 继承 多态