面相对象
特点:
1:将复杂的事情简单化。
2:面向对象将以前的过程中的执行者,变成了指挥者。
3:面向对象这种思想是符合现在人们思考习惯的一种思想。
面向对象是相对于面相过程的,如果用面相过程的思想去设计程序,那么我们要定义好具体的每一步,这样我们面对的是具体的步骤。
随着需求增加,代码增加,我们要面对的步骤也增加了,这样就非常麻烦。
这个时候我们想到把方法封装,调用方法去解决问题,会发现轻松多了,这个时候我们面对的就是我们封装的方法。这样就是一种面向对象的思想,能将复杂的简单化。
举个例子:在公司中,老板会在公司设立很多部门,如:财务部,销售部,采购部,行政部,市场部,等等,每个部门都可以看成一个对象,将一些功能封装到里面,我们想使用这些功能,就直接调用对象,在对象中找到方法(如果公司调用部门中的人一样)。就可以完成目的了。
用面相对象的事项去分析
人关门的动作:这个动作其实是门自己关上的。
火车司机刹车动作:这是车自己刹车的。
一个人在黑板上画圆的问题:给圆两个参数(圆心,半径)圆就会自己话远。
(记住:谁拥有数据,谁对外提供方法)
面向对象要三个特征:封装,继承,多太。
封装:说明白点就是将数据封装起来,并对外提供访问方法。
封装的好处:
数据安全,
方便使用
提高重用
隔离了变化
举个例子:手机上一个app软件就是最好体现,它将软件的具体代码进行封装,对外只提供一下简单的按键。private就是封装的一种体现。
<span style="font-size:14px;">private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
</span>
将对象进行封装对外提供访问对象的方法。
继承:
1.提高了代码的复用性
2.让类与类之间产生了关系,有了这个关系,才有了多态的特性。必须是类与类之间有所属关系才可以使用继承。所属关系 is
java中继承只能单继承,多继承存在安全隐患。java中为弥补单继承的缺陷,提供给多实现的机制。
有了继承就有了子父类,子父类出现后类成员的特点:
1.子父类中变量的特点:
父类的成员变量私有化之后,子类依然继承,但不能直接访问。
如果子类中出现非私有的同名成员变量时,自雷要访问本类中的变量用 this ,要访问父类中的同名变量,用super,
super的使用和this的使用 几乎一致。
this:本类对象的引用
super:父类对象的引用。一定要放在子类函数的第一行。
2.子父类中函数的特点:--覆盖(override)
当子类中出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖一样。这就是重写。
当子类继承了父类,沿袭了父类的功能,到子类中,但是子类虽然具备该功能,但是功能的内容却和父类不一样,这是没有必要定义新
功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容。这是用 super。
注意:
1).子类覆盖父类,必须保证子类权限大于等于父类权限,才能重写
2).静态只能访问静态
重载和重写:
重载:只看同名函数的参数列表
重写:字符类方法要一模一样。
.子父类中构造函数的特点:
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数。子类只会隐式调用父类的空参构造函数。
3子类一定要访问父类中的构造函数:
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
注意:super语句一定定义在子类构造函数的第一行。
子类的所有构造函数,默认都会访问父类中孔参数的构造函数,因为子类的每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。
当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少会有一个构造函数会访问父类中的构造函数。
多态:
一个事物有多种形态,(如:猫是动物,那么猫就有猫和动物的两种行态)
多态的体现在:父类或者接口指向子类。
多态的前提:必须有关系(如:继承和实现)
多态的好处:提高了程序的扩张性,
多态中子父类成员的体现:
成员变量:编译运行都看左边
成员函数:编译看左边,运行看右边。
静态函数:编译和运行都看左边
多太转型:
如何使用子类特有方法:多态转型。
Animal a=new Cat();//类型提升,向上转型。
a.eat();//父类的共有方法。
如果要调用cat的特有方法的时候 ,就必须将父类的引用转成子类的类型,但是不能将父类对象转成子类类型,转换的是父类的引用,(就是父类的变量)
Cat c=(Cat)a;
c.catchmouse();//子类的特有方法。
接口和抽象类:
抽象类和接口的共性:都是不断向上抽取的结果。
抽象类和接口的区别:
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类去实现。
3:抽象类使用的是 is a 关系。
接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。全都是public的。