Java面向对象
一、类与对象
对象不仅仅是你女朋友,也不仅仅是棋盘上的对象
Java是面向对象的语言,换句能听懂的话,Java可以描述现实生活的物品,这里物品也包括生命,而不单单是一些数学符号
在C语言中我们都是写简单的一些程序操作数字,一个for循环从1加到10,等等,Java也能做到。
但Java是企业级用来服务生活的,所以引入了对象的概念,对象就是生活的物品。
对象:一个对象实例,一个生活中的物品
有属性(简单理解:不能动的特征,名词)比如颜色,大小,名字。
也有行为(可以行动的,动词),例如走路,学习,吃饭。
类:抽象的 提取对象的共同特征
例如人类就是由大量人提取了共同的特征:直立行走,胎生,使用工具等一系列特征,用来描述一群人,Java类就是提取了某种对象共同特征的抽象概念
类声明:
【<修饰符>】class<类名>【extends<父类>】【implement<接口名>】
二、方法
方法:可以简单理解为c语言的函数概念
c语言中的函数是用操作数字,Java的方法就是操作对象(生活中的物品)。
构造方法(构造器):
用来创建对象的,其功能主要是完成对象的初始化。在构造方法中定义一个对象的属性和行为。
语法:{
public 类名(【参数列表】){
【语句序列】
}
构造方法的特点:
- 函数名与类名相同,并且构造方法不能从父类继承
- 不用定义返回值类型。(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有)
- 不可以写return语句。返回值类型都没有,也就不需要return语句
成员方法:
成员方法的定义:
【方法修饰符】<方法返回值类型><方法名>(【<参数列表>】){
方法体
}
方法重载:
JAVA的任何方法都允许被重载,也就是说一个类中可以有多个方法具体相同的名字,但这些方法的参数不相同,参数不同具体表现为,个数不相同或者参数的类型不相同。方法的返回类型和参数的名字不参与比较。Java系统通过传递给它的参数个数和类型来分辨具体是哪一个方法!
三、封装
目的:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
封装将方法的可见性加以控制
也就是说你可能看不到这个方法是怎么实现功能的,只知道这个方法功能的作用。
权限修饰符
访问权限:public(公有的)>protect(保护的)>default(默认的)>private(私有的)
缺省:系统默认
修饰符 | 同一个类 | 同一个包 | 子类 | 其他包 |
---|---|---|---|---|
public | yes | yes | yes | yes |
protect | yes | yes | yes | no |
default | yes | yes | no | no |
private | yes | no | no | no |
实现Java封装的步骤:
1). 修改属性的可见性来限制对属性的访问;
2).对每个值属性提供对外的公共方法访问,主要是get(获得)和set(修改)。
四、继承
父类和子类
父类和子类是相对的,子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。
通过 extends 关键字可以声明一个类是从另外一个类继承而来的。所有的类默认继承于 java.lang.Object
例如:动物是父类,猫是子类。生命是父类,动物又是子类了,所以说父类和子类是相对的,有点像生物里的界门纲目科的关系。
要判断是不是继承关系:
只需要判断是不是is-a的关系,父类更通用,子类更具体,例如猫是动物,动物是生命。
需要注意的是Java中的方法只支持单继承,也就是一个子类只有一个父类。
方法重写:
我们已经说到子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。
这些不具有的属性或方法就是通过方法重写完成的。
重写子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
你直接把父类的方法名复制粘贴下来,在方法体里面加上子类特有的属性或方法就好了!
方法重写和方法重载的区别
方法重载 | 方法重写 | |
---|---|---|
参数列表 | 必须修改 | 不能修改 |
返回类型 | 可以修改 | 不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
this关键字:
自己调用自己,new一个对象,你直接调用出现的是地址,而this就相当于指针,调取了这个地址存储的内容,需要注意的是,Java中this关键字不能存在于static修饰的静态方法中
主要作用:
- 在成员方法中可以区分成员方法和局部方法
- 可以返回实例对象本身的引用
- 可以调用本类其他的构造方法
- 在类的成员方法中,通过this来访问实例对象的成员变量或调用成员方法
super关键字:
子类调用父类,每一个子类的构造方法都默认调用super。
子类在继承父类,可能会出现变量隐藏和方法覆盖
变量隐藏:指子类的成员变量与父类成员变量同名,父类的成员变量被隐藏。
方法覆盖:即方法重写
如果子类需要调用或访问父类被隐藏的变量或被覆盖的方法,则使用super关键字实现。
主要作用:
- 访问父类被覆盖的方法
- 访问父类被隐藏的成员变量
- 调用父类的构造方法
final关键字:
- 声明类可以把类定义为不能继承的,即最终类;
- 修饰方法,该方法不能被子类重写,级最终方法;
- 修饰成员变量,该成员变量变为常量,不允许修改;
需要注意的是abstract和final修饰符不能同时修饰一个类
static关键字:
在类前面声明,使用此关键字使方法成为静态方法,用来提取类中的公共部分。
被static修饰的成员变量和成员方法被称为类变量和类方法!
类变量
- 类变量可以通过类名直接访问,而不需要创建对象
- 任何一个对象对类变量的修改,都是在同一个内存单元上完成的,因为,每个对象对类变量的修改都会影响其他实例变量!
类方法
- 类方法可以直接通过类调用,而不需要创建实例对象
- 类方法属于整个类,被调用时可能还没有创建任何的对象实例,因此,类方法内只可以访问类变量,而不能直接访问实例变量和实例方法!
- 类方法中不能使用this关键,因为静态方法不属于任何一个实例!
五、多态
多态就是同一个接口,使用不同的实例执行不同操作。
不同类的对象收到相同的消息,得到不同的结果
类的转换:
向上转型:父类引用指向子类,属于自动转换
格式:父类 类名=new 子类;
向下转型:子类引用指向父类,属于强制转换
这个是错误的:子类 类名=new 父类;
你可以说鸟是动物,但不能说动物是鸟 是一个道理!
多态也分为静态多态和动态动态
静态多态是指定义在一个类或一个函数的同名函数,它们根据参数表区别语义和执行的功能,是通过方法重载实现 的
动态多态是指定义在一个类的层次的不同类的重载函数!是通过方法重写和向上转型实现的!
六、接口
抽象类
介绍接口前需要先了解Java抽象类
抽象类:其中没有足够的信息来描绘一个具体的对象
使用abstract class来定义抽象类,抽象类不能被实例化
-
抽象类的定义:
abstract class<类名>【extend<父类>】【implement<接口名>】{
<类主体>
} -
抽象类的注意点:
- 包含抽象方法的类一定是抽象类,但抽象类不一定必须包含抽象方法。
- 抽象类不能被实例化。
方法的继承用exends关键字,而接口用到的关键字是interface—实现。我们已经说过Java中只支持单继承,也就是一个子类只有一个父类。为了出现多继承的特性,接口这个概念便应运而生。
一个类只能继承一个抽象类,而一个类却可以实现多个接口,但接口与接口之间还是需要使用extends关键字!
类与接口区别:
类有成员变量和成员方法,而接口却只有常量和抽象方法。