什么是继承:
后代继承先辈的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为
为什么需要继承?什么时候应该继承?
使用继承可以有效实现代码复用,避免重复代码的出现。
当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。
如何实现继承:
在java语言中,用extends(扩展)关键字来表示一个类继承了另一个类。
什么是方法的重写:
如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法重写了父类的方法。
什么是方法的重载:
方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型
override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
public class People{
private String name;
private int age;
public People(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
构造函数:
构造函数是在对象实例化时自动被系统调用,该函数名必须是独一无二的,是将类名作为函数名。
构造函数不需要程序员去定义返回值,他是系统自动决定的,void也不行。
多态:
什么是多态?不同的对象,接收的相同的消息,产生的响应不同
多态的体现:重写和重载等。
多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要
下面例子用到了继承和多态:public class Work{
public void rest(){
System.out.println("劳动者坐在凳子上休息");
}
}
public class PowerWorker extends Work{
@Override
public void rest() {
System.out.println("体力劳动者休息的方式是躺在床上睡觉");
}
}
public class MentalWorker extends Work{
@Override
public void rest() {
System.out.println("脑力劳动者休息的方式是运动");
}
}
public class WorkTest{
public static void main(String[] args) {
Work w1 = new Work();
w1.rest();
Work w2 = new PowerWorker();
w2.rest();
Work w3 = new MentalWorker();
w3.rest();
}
public void fun(Work work){
}
封装:
封装:是将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
也可以理解为:存在一个边界,边界之内的细节隐藏起来,只留下对外的借口(如:笔记本,手机,饮水机)
封装的好处:
① 只能通过规定方法访问数据,安全、易用、简单、易维护。
② 隐藏类的实现细节
③ 方便加入控制语句
④ 方便修改实现经过封装的属性,不能直接访问,要通过公共属性get/set方法访问。