面向对象与面向过程
面向对象(指挥者)与面向过程(执行者)指一种思考方式。面向对象省时间,省精力。而面向过程费时间费精力。但没有绝对的面向对象,有绝对的面向过程。所有面向对象都指向面向过程。宏观上讲,总体在面向过程,但有一部分会面向对象。就代码而言,由上到下执行在面向过程,但中间可以调用面向对象。在面向过程中,数据和行为是分开的,而在面向对象中,数据和行为是融合的。如:计算两点坐标
面向过程:
主函数{
int x1,y1;
int x2,y2;
double distance=getDistance(x1,x2,y1,y2);
}
面向对象:
坐标点{
int x;
int y;
getDistance(点,另一个点){}
}
主函数{
坐标点 p1=new 坐标点();
坐标点 p2=new 坐标点();
p1.getDistance(p2);//(p1获取到p2的距离)
p2.getDistance(p1);//(p2获取到p1的距离)
}
对象和类
对象:万事万物皆对象,任何实体都可作为对象。例如:一颗苹果,一张字条。
类:具有相同属性和行为的对象的统称。例如:飞机(泛指一类),水果(指各种水果的统称)。主要描述对象的属性和行为。
属性和行为
属性:成员变量:对象的特有属性。用一些参数描述类的信息。>变量和常量。
行为:成员函数:对象的特有行为。用一系列的动作描述类的信息。>函数。
对象的创建流程
1、堆内存中开辟对象空间并分配地址。
2、对成员变量进行默认初始化。
3、构造函数进栈。
4、对成员变量进行显示初始化。
5、执行构造函数代码针对性初始化。
6将对象的地址赋予函数中的局部变量。
private
x修饰成员变量,成员函数。外界不可访问(类外)。一般将成员变量私有化,防止外界直接修改值。添加set修改器,get访问器。封装是将某些东西打包起来,其实就是创建新的数据类型。
构造函数
可以在创建对象的时候对对象进行初始化。构造函数可以重载,构造函数没有返回值但是有return。构造函数能调用其他构造函数,用this(…),this表示当前对象的引用。但是不能相互调用,会形成递归调用死循环。可以调用成员函数,直接加private*……但成员函数不能调用构造函数。构造函数不一定需要setget,看业务需求,如果后期需要改变可以用,后期无需改值则不用。
继承
当我们在定义若干类的时候发现这些类有共同的属性和行为,则可以将这些共同的水星和行为单独抽出,放到另一个类中,这个类称为其他类的父类,而其他类称为子类,父类与子类是继承关系(extends),且父类只能有一个。继承必须同种且符合常理,代码上的体现仅仅是属性和行为重复(前提)。Java类之间只能单继承,但接口之间可以多继承。Java中所有最终父类都是Object。
子类父类中构造函数的特点:子类在创建对象过程中调用父类对应的构造函数,但不代表父类创建对象,仅仅为了子类的某些属性进行初始化。
super():表示调用父类的无参构造函数,必须在第一句且可以默认隐藏。
子父类中成员变量及成员函数的特点
子类在没有定义属性时则调用父类,如果子父类有重名属性优先调用子类。子类对象在调用函数时优先调用自己,若没有则调用父类,若有则不显示父类。如果子父类函数存在函数重名的情况,叫做函数的重写,如果父类的函数已经被private,则子类不能访问。想要重写函数,子类的权限必须>=父类。重写只针对函数,成员变量在继承中不存在重写。重写的意义是子类获取父类函数的声明。