面向对象
1.概述:
Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。
它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。
为了方便理解,举个例子:
洗衣服:
面向过程 | 面向过程 |
---|---|
脱衣–>放进盆–>放洗衣粉–>加水–>浸泡–>一揉–>清洗–>拧干–>晾起来 | 把衣服脱下来–>打开全自动洗衣机–>扔衣服–>按钮–>晾起来 |
强调步骤 | 强调对象,这里的对象就是洗衣机 |
特点:
面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。
2.类和对象
2.1什么是类
类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
属性:就是该事物的状态信息。
行为:就是该事物能够做什么。
举例:小狗
属性:名字、体重、年龄、颜色。
行为:走、跑、叫。
2.2什么是对象
对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。
举例:小狗。
属性:5kg、2years、yellow。
行为:蹦蹦跳跳的跑、撒娇、汪汪叫。
2.3类和对象的关系
类是对一类事物的描述,是抽象的。对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体。
2.4类的组成
2.4.1 public关键字
访问修饰符,在定义一个类的时候,访问修饰符的作用是表示这个类被访问的权限,public修饰的类,可以被不同包中不同的类对其进行访问。
2.4.2class关键字
用来表示一个类定义的开始。
2.4.3类名
类名必须是一个合法的标识符。
2.4.4类的主体
成员变量(属性):和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
成员方法:
修饰符 返回类型 方法名 (参数列表){
代码 return;
}
2.5定义一个学生类
public class Student {
//成员变量
String name;//姓名
int age; //年龄
//成员方法1
Public void study() {
System.out.println(“上课,学习,考试”);}
//成员方法2
Public void eat() {
System.out.println(“学习饿了要吃饭”);}
}
}
2.6创建对象
创建对象的格式:
类名 对象名 = new 类名();
使用类中的成员:
对象名.成员变量;
对象名.成员方法();
2.6.1举例:
public class TextStudent {
public static void main(String[] args) {
//创建一个学生类的对象
Student s = new Student();
//直接输出成员变量值,对象名.成员变量
System.out.println(“姓名:”+s.name); //null
System.out.println(“年龄:”+s.age); //0
//给成员变量赋值
s.name = “小明”;
s.age = 18;
//再次输出成员变量的值
System.out.println(“姓名:”+s.name); //小明
System.out.println(“年龄:”+s.age); //18
//调用成员方法
s.study(); // “上课,学习,考试”
s.eat(); // “学习饿了要吃饭”
}
}
3.面向对象的三大特性
封装,继承,多态(如果说四大特性,则将抽象添加进去)
3.1封装
将对象的属性和实现细节(方法)隐藏起来,若需要访问某个属性,提供公共方法对其访问。
防止该类的代码和数据被其他类随意访问。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
3.1.1对一个类或对象实现封装,可以实现以下目的:
a.隐藏类的实现细节
b.让使用者只能通过事先预定的方法进行访问数据,从而可以在该方法中加入控制逻辑,限制对成员变量的不合理访问。
c.可进行数据检查,从而有利于保证对象信息的完整性。
d.便于修改,提高代码的可维护性。
3.1.2为了实现良好的封装,应该从两个方面来考虑:
a.将对象的成员变量和实现细节隐藏起来,不允许外部直接进行访问。
b.把方法暴露出来,让方法来控制对这些成员变量进行安全的访问操作
3.2继承
继承就是子类继承父类的非私有属性和方法。子类可以对父类的方法进行扩展,称为重写(Overriding)。关键字extends。
重写存在于父类和子类之间,有相同的方法名和参数列表。提高了代码的复用性。
3.2.1特点
1).在Java中,类只支持单继承,不允许多继承,也就是说一个类只能有一个直接父类。
2).多个类可以继承一个父类
3).在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,
4).在Java中,子类和父类是一种相对概念,也就是说一个类是某个类父类的同时,也可以是另一个类的子类。
3.3多态
多态是指不同的对象引用调用同样的方法有不同的表现形式,多态的实现有两种方式:重写和重载。
一个类中,有相同方法名和不同的参数列表情况为重载,是一个类中多态性的体现。
3.3.1重载
指在同一类中允许出现一个或以上的同名方法,其参数列表(个数不同,数据类型不同,顺序不同)不同即可。
与修饰符和返回类型无关。 是一个类中多态性的一种表现。
注意:
参数类型、个数、顺序至少有一个不相同;
不能重载只有返回值不同的方法名;
存在于父类和子类、同类中。
3.3.2重写
子类对父类方法进行扩展称为重写,如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
体现了父类与子类之间的多态性,重写是子类对父类的函数重新定义 。
应用场景:
当父类的方法不能完全满足子类使用的时候,既可以保留父类的功能(沿袭、传承),还可以有自己特有的功能。
注意:
方法名、参数、返回值相同;
子类方法不能缩小父类方法的访问权;
子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常);
存在于父类和子类之间;
方法被定义为final不能被重写;
3.4抽象
抽象是将一类对象的共同特征总结出来构造类的过程。包括数据抽象和行为抽象的过程,抽象只关注对象有哪些属性和行为,并不关注这些行为的细节。
3.4.1抽象方法:
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
定义格式:修饰符 abstract 返回值类型 方法名 (参数列表);
3.4.2抽象类
如果一个类包含抽象方法,那么该类必须是抽象类。
注意:
抽象方法只能在抽象类里面;
抽象类和抽象方法必须被abstract修饰;
抽象类不能创建对象(不能实例化);
抽象类中可以有非抽象的方法;
抽象类和类的关系也是继承;
一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类;