类,对象及继承关系概述
(OOP)面向对象程序设计是当今主流的程序设计范型,由于Java是面向对象的,所以熟悉OOP才能很好地使用Java;传统的结构化程序设计通过一系列过程(即算法)求解问题,这个方法首先要确定如何操作数据,然后再决定如何组织数据结构,而OOP相反,其将数据放在第一位,然后再考虑操作数据的算法。总的来说面向对象适合解决规模较大问题,而面向过程可能对于规模较小的问题更加理想。
面向过程与面向对象对比
1.类与对象简述
类:类似于现实中一类事物所具有的属性的集合,是构造对象的模板
对象:是这一类事物中的某个个体,例如汽车属于一个大类,那么奔驰汽车就是这一类事物的实例化。
我们可以将类想象成制作小甜饼的模具,将对象想象成小甜饼!
封装:这是处理对象的重要概念,从形式上看,即将数据(实例字段)和行为(方法)组合在一个包里,并对对象的使用者隐藏具体方式,其关键在于不能让类中的方法访问其他类的实例字段,封装给对象赋予“黑盒”特征,这提高了可靠性和重用性。
2.继承
即“is a”,基本思想是基于已有的类创建新的类,继承已存在的类复用这些类的方法,而且增加新的方法和字段,使得新类适应新的情况。
关键字 extends;例如:
public class Manager extends Employer{
add methods and fields
}
方法覆盖:超类中的某些方法对子类不一定适用,此时需要新方法来覆盖超类的方法。
public class Manager extends Employee{
public double getSalary()
{
return salary+bonus//error
double salary=getSalary();
return salary+bonus;//error
double salary = super.getSalary();//right
return salary+bonus;//right
}
}
经理的工资为员工基本工资加上奖金,可一方面从Employee继承的salary为私有变量,子类无法访问;另一方面如果调用getSalary(),则程序会陷入死循环;Java中提供了关键字super来专门调用超类的方法。(super还可调用超类构造方法,类似super(x1,x2),这里不仔细叙述)
多态
Java中对象变量是多态的,一个student类型变量既可以引用student类型对象,也可以引用student类的子类的对象。
public class student{
public string name;
public student(string n){
name = n;
}
//方法重载
public student(){}
public void study(){
System.out.println(name);
}
}
public class UNstudent extends student{
public void study(){
System.out.println("子类重写")
}
public static void main(String[] args){
student un =new UNstudent();//多态
un.name="张三";
un.study();
}
静态绑定与动态绑定
讨论这两个概念呢首先明确两个问题
1.当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用的是父类的方法还是子类的重写方法呢(尤其是存在向上类型转换的情况)?
2.当一个类中存在方法名相同但参数不同(重载)的方法,程序在执行的时候该如何辨别区分使用哪个方法呢?
静态绑定
即方法或变量在编译前就已经与类绑定了。
被static,final,private修饰的和构造方法是静态绑定
private修饰:此类方法不能被继承,子类无法访问父类的private方法,只能通过super访问
final修饰:可以被子类继承,但不能被重写,故当子类中调用final方法时,其实调用父类中的final方法。
static修饰:可以被继承,不能被重写,但可以被隐藏。当子类对象向上类型转换为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法
构造方法:构造方法也是不能被继承的(因为子类是通过super方法调用父类的构造函数,或者是jvm自动调用父类的默认构造方法),因此编译时也可以知道这个构造方法方法到底是属于哪个类的。
动态绑定:
当虚拟机创建子类对象的时候,会创建一个类的方法列表,同时包含父类的方法列表。同时虚拟机会参数引用的实际地址,找到创建的这个子类对象,查询方法列表,如果在子类对象中找到这个方法,就直接调用。
如果没找到,就去查询父类方法,调用父类的方法。
总结:
Java中方法时static,final,private修饰时是静态绑定,变量也是静态绑定,其余是动态绑定。
在向上转型时,动态绑定是先从子类方法表中找,没有就找父类,而静态绑定相反,先从父类开始找。