面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象:主要关注点是:主要关注对象(独立体)能完成哪些功能。
优点:耦合度低,扩展力强,更容易解决现实世界当中更复杂的业务逻辑。
缺点: 性能比面向过程低
C语言是纯面向过程的语言
C++半面向对象
Java纯面向对象
面向对象的方式开发一个软件,生命周期可分为三个阶段:
面向对象的分析:OOA
面向对象的设计:OOD
面向对象的编程:OOP
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
1,所有属性私有化,使用private关键字进行修饰,修饰的所有数据只能在本类中访问
2,对外提供简单的操作入口,
对外提供两个公开的方法:get和set
1)get方法命名规范:
eg: public int getAge(){
return age
}
2)set 方法命名规范:
eg: public void setAge(int a){
age=a;
}
注意:setter and getter方法没有static关键字
有static 关键字修饰的方法调用:类名.方法名(实参) 。 eg: newc.age=30;
没有static 关键字修饰的方法调用:引用.方法名(实参)。 eg: newc.setAge(30) , newc.getAge()
一个属性通常访问的形式:
1,读取这个属性的值:get
2,修改这个属性的值:set
get方法根据方法需要,提供相应的返回值
set方法没有返回值,因为set方法只负责修改属性值
封装步骤图例:
Java 的访问权限修饰关键字。Java 中主要有 private、protected、public 和 默认访问权限 四种:
public 修饰符,具有最大的访问权限,可以访问任何一个在 CLASSPATH 下的类、接口、异常等。
protected 修饰符,主要作用就是用来保护子类,子类可以访问这些成员变量和方法,其余类不可以。
default 修饰符,主要是本包的类可以访问。
private 修饰符,访问权限仅限于本类内部,在实际开发过程中,大多数的成员变量和方法都是使用 private 修饰的。
this是一个关键字,
thisj 一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部。每创建一个对象都有其对应的this
this可以出现在“实例方法”当中,this指向当前正在执行这个动作的对象。(this 代表当前对象)
this在多数情况下可以省略不写,
this 不能使用在带有static的方法中
return this;可以用于返回本类对象的方法的操作
this(参数列表)调用具有对应参数列表的构造方法
[修饰符列表] 构造方法名(形参列表){
构造方法体
}
[修饰符列表] 返回值类型 方法名(形参列表){
方法体
}
4,对于构造方法来说,“返回值类型”不需要指定,并且不能写void,只要写上void,则这个方法变成普通方法
5,对于构造方法来说,构造方法名必须与类列保持一致
6,构造方法的作用:通过构造方法的调用,可以创建对象
7,构造方法的调用:
8,构造方法调用执行之后,都有返回值,但这个return是隐式的,系统自动返回,不需要再编写return语句,返回值是他本身。
9,当一个 类中没有定义任何构造方法时,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。
10,当一个类显示的将构造方法定义出来,那么系统则不再默认为这个类提供缺省构造器。建议开发中手动提供无参构造方法,因为无参数构造方法太常用。
11,构造方法支持重载机制,在一个类当中编写多个构造方法,这多个构造方法就构成方法重载。
1,创建对象
2,创建对象的同时,初始化实例变量的内存空间
成员变量之实例变量,属于对象级别的变量,这种变量必须先有对象才能有实例变量
实例变量没有手动赋值时,系统默认赋值,
3,实例变量什么时候完成初始化?
在类加载时,只加载了代码片段,没有创建对象,所以实例变量此时并没有初始化。
实际上,实例变量的内存空间是在构造方法执行过程当中完成开辟的,完成初始化的。
系统默认赋值是,也是在构造方法执行过程当中完成的赋值。
一个新类从已有的类那里获得其已有的属性和方法,这种现象叫类的继承。
(这个新类被称为子类,也叫派生类,已有的那个类叫做父类,也叫做基类。)
class 子类 extends 父类{}
如:B继承A类的所有属性和方法
注意:私有属性和方法不能被继承。
class A{
public void f(){
System.out.println(“AAAA\n”);
}}
class B extends A{
public void f(){
super.f();
System.out.println(“BBBB\n”);
}}
子类拥有父类非private的属性,方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法或者属性–重写。
Java只能单继承,不能多继承。但是可以多重继承。
1,方法重载又称为Overload
2,方法重载什么时候使用
当在同一个类当中,方法完成 的功能是相似的,建议方法名相同,方便编程,如同在调用 一个方法。
3,怎么样构成 方法重载?
在同一个类当中,
方法名相同
参数列表不同:类型,顺序,个数
4,方法重载与什么无关
与方法的返回值类型无关
与方法的修饰符列表无关
1,方法覆盖又称为Override/Overwrite
2,什么时候使用方法重写?
当父类中的方法已经无法满足当前子类的业务需求
子类有必要将父类中继承过来的方法进行重新编写
这个重新编写的方法的过程称为方法重写/方法覆盖
3,什么条件满足方法重写?(代码在什么条件下,构成方法的覆盖)
方法重写发生在具胡继承关系的父子类之间
方法重写的时候,返回值 类型相同,方法名相同,形参列表 相同
方法重写时,访问权限不能更低,可以更高
方法重写时,抛出异常不能更多,可以更少
4,建议方法重写的时候尽量复制粘贴,不要编写,避免出错
5,注意:
私有方法不能继承,所以不能覆盖
构造 方法不能继承,所以不能覆盖
静态方法不存在覆盖。
覆盖只针对方法,不针对属性
使用final关键字做标识有“最终的”含义。
1. final 修饰类,则该类不允许被继承。
2. final 修饰方法,则该方法不允许被覆盖(重写)。
3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在**构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),**且初始化之后就不能改了,只能赋值一次。
4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
在对象的内部使用,可以代表父类对象。
1、访问父类的属性:super.age
2、访问父类的方法:super.eat()
super的应用:
首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字。
这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。
那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。
(1)在多个不同的类中抽取出共性的数据和逻辑,对这些共性的内容进行封装一个新的类即父类(也叫做超类或基类),让之前的类来继承这个类,那些共性的内容在子类中就不必重复定义,比如 BaseDAO、BaseAction 等。
* (2)Java 的继承机制是单继承,即一个类只能有一个直接父类。
* (3)如果子类和父类有同名成员变量和方法,子类可以使用 super 关键字调用父类的成员变量和方法,上述使用方式前提是成员在子类可见。
* (4)在调用子类构造方法时,会隐式的调用父类的构造方法 super()。如果父类没有无参构造方法,为了避免编译错误,需要在子类构造方法中显式的调用父类的含参构造方法。
(5)子类创建时调用父类构造方法:子类需要使用父类的成员变量和方法,所以就要调用父类构造方法来初始化,之后再进行子类成员变量和方法的初始化。因此,构造方法是无法覆盖的。
* (6)当子类需要扩展父类的某个方法时,可以覆盖父类方法,但是子类方法访问权限必须大于或等于父类权限。
(7)继承提高了程序的复用性、扩展性,也是 Java 语言多态特征的前提。
(8)在实际开发、程序设计过程中,并非先有的父类,而是先有了子类中通用的数据和逻辑,然后再抽取封装出来的父类。
多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamicbinding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
消除类型之间的耦合关系。
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
1)可替换性(substitutability):多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2)可扩充性(extensibility):多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3)接口性(interface-ability):多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4)灵活性(flexibility):它在应用中体现了灵活多样的操作,提高了使用效率。
5)简化性(simplicity):多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
6.Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
7.Java中多态的分类:
在java中,多态大致可以分为以下几种情况:
1)person为父类,student为子类。那么:personp=newstudent();
2)fliable为接口,bird为实现接口的类,那么:fliablef=newbird();
3)fliable为抽象类,bird为继承fliable的类,那么:fliablef=newbird();
多态时需要说明p声明为父类的引用,但他实际为子类引用。但是他只能调用父类中的方法。如果子类中的方法覆盖了父类方法,那么将调用父类方法(虚方法调用)。接口多态也是同样的,也许你会问,如果f要调用自己的方法,那岂不是出错了?其实这里也是方法的覆盖,因为实现接口的子类肯定会实现接口中的方法,所以此种情况下调用的是bird中的方法。但是如果bird有一个方法在接口中没有定义,那么f不能调用。
本质:多态的本质就是将子类对象赋值给父类变量,在运行时期会表现出具体的子类特征(调用子类的重写方法)。
例如:我家里养了一只动物,叫乖乖…
乖乖是狗 发了了汪汪的叫声
是猫 发了喵喵…
参考文档:https://www.cnblogs.com/hysum/p/7100874.html
https://www.cnblogs.com/xugf/p/8475931.html