一种基于面向过程的新的编程思想,顾名思义该思想是站在对象的角度思考问题,我们把多个功能合理的放到不同对象里,强调的是具备某些功能的对象。具备某种功能的实体,称为对象.面向对象最小的程序单元是:类.
面向对象更加符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。
三大特征:
1:封装(Encapsulation);
2:继承(Inheritance);
3:多态(Polymorphism);
封装是指将对象的实现细节隐藏起来,然后通过公共的方法来向外暴露该对象的功能。
继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类是一种特殊的父类,能直接或间接获得父类里的成员。
多态是可以直接把子类对象赋给父类变量,但是运行时依然表现出子类的行为特征,这意味着同一类型的对象在运行时可能表现出不同的行为特征。
注意:千万不要误解为面向对象一定就优于面向过程的设计
你在街上看到一个美女,就可以把这个美女看成一个对象,那么该对象有两方面的定义:状态和行为。
美女有状态,如身高,年龄,皮肤颜色等;美女还有行为,如走路,说话,抛媚眼等。
不难发现,对象可以定义成包含状态和行为的一个实体,对象(object)也称为实例(instance)。
什么是实体:存在于现实世界中并且可以与其他物体区分开来的物体,实际存在的个体。
-----------------------------------------------------------------------------------------------------
对象:
对象是人们要进行研究的任何事物,一切事物都可以认为是对象。
对象具有状态和行为:
对象具有状态,比如姓名,年龄,性别等。
对象还有操作,比如吃饭,睡觉,写代码等。
此时,通过对多个同类型的对象分析,我们可以把对象抽象成类。
-----------------------------------------------------------------------------------------------------
类:
具有相同特性(状态)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
类具有特性,对象的状态,用成员变量来描述,封装数据。
类具有功能,对象的行为,用方法来描述。
-----------------------------------------------------------------------------------------------------
什么是类:类是对象的类型/模板。创建一个对象,就是使用一个类作为构建该对象的基础。
实际上,解释类和对象的关系确实存在着“先有蛋还是先有鸡”的问题,描述类少不了对象,相反,描述对象也少不了类。
不过在面向对象编程里,我们肯定是先有类的。如果没有类,对象就没法实例化。
-----------------------------------------------------------------------------------------------------
对象是类的实例,类是对象的模板。
比如下面一个例子:分析出对象和类,以及对象具备的状态和行为。
找多个对象共同的状态和行为:
状态:
姓名:
年龄:
身高:
体重:
行为:
唱歌
跳舞
---------------------------------------
把对象的状态使用成员变量表示,
把对象的行为使用方法表示.
class Person { String name; int age; int height; int weight; void sing() {} void dance() {} }
---------------------------------------------------------------
[修饰符] class 类名
{
0~N个成员变量(字段/Field),不要叫属性(JavaBean中特殊的一种成员).
0~N个方法
}
public class Person { //成员变量:这些就是Person类对应的对象的状态(private是修饰符) private String name; private int age; //成员方法:这些就是Person类对应的对象的行为 void shopping(){ System.out.println("这是购物的方法"); } void sing(){ System.out.println("这是唱歌的方法"); } void dance(){ System.out.println("这是跳舞的方法"); } }
------------------------------
定义类的注意:
1):如果类使用了public修饰符,必须保证当前文件名称和当前类名相同.
2):类名使用名称表示,类表示某一类事物,首字母大写,如果是多个单词组成使用驼峰表示法.
如:EmployeeAdvanceSetting.
3):在面向对象的过程中,各位定义类的时候,专门为描述对象提供一个类,该类不需要main方法.
我们专门再定义一个测试类/演示类来运行程序.
1):根据类来创建对象的语法:
类名 变量 = new 类名();
比如:Person person = new Person();
2):给字段设置值:
对象变量.字段名=该类型的值;
比如:Person person = new Person();
person.name = "张三";
person.setName("张三");
3):获取字段的值:
该字段类型 变量=对象变量.字段值;
比如:Person person = new Person();
String name = person.name;
String name = person.getName();
4):通过对象调用方法.
对象变量.方法(实参或者无参数);
比如:Person person = new Person();
person.doWork();
对象的打印和比较对象以及匿名对象
-------------------------------------------------------------
1):对象的打印操作:
打印对象的时候,打印出来的效果,如:Servant@3294e4f4.
类的名称@十六进制的hashCode.
其实,我们打印对象,往往关系的是该对象中的数据是多少,这就需要Obejct类的toString方法.
public class Person { //成员变量:这些就是Person类对应的对象的状态(private是修饰符) private int id; private String personName; private int age; //成员方法:这些就是Person类对应的对象的行为 void shopping(){ System.out.println("这是购物的方法"); } void sing(){ System.out.println("这是唱歌的方法"); } void dance(){ System.out.println("这是跳舞的方法"); } public static void main(String[] args) { Person person = new Person(); System.out.println(person); //结果是:Person@15db9742 } }
2):对象比较操作:
==号:对于基本数据类型来说,比较的是值.
对于引用数据类型来说,比较的是在内存中的地址值.
每次使用new关键字,都表示在堆值新开辟一块内存空间,不同的内存空间,地址值不同.
需求:如果对象拥有完全相同的数据,我就想让他们相等.这就需要Object类的equals方法.
public class Person { //成员变量:这些就是Person类对应的对象的状态(private是修饰符) private int id; private String personName; private int age; //成员方法:这些就是Person类对应的对象的行为 void shopping(){ System.out.println("这是购物的方法"); } void sing(){ System.out.println("这是唱歌的方法"); } void dance(){ System.out.println("这是跳舞的方法"); } public static void main(String[] args) { Person person1 = new Person(); Person person2 = new Person(); System.out.println(person1==person2); //结果是:false ,两个对象不相等,比较的是地址值 } }
3):对象的生命周期:
对象什么时候出生:每次使用new关键字的时候,就会在内存开辟新的空间,此时对象开始存在.
对象的结束:当堆中的对象,没有被任何变量所引用,此时该对象就成了垃圾,就等着垃圾回收器(GC)来回收该垃圾,当被回收的时候,对象被销毁了,回收垃圾的目的,释放更多的内存空间.
4):匿名对象:没有名称的对象,创建对象之后没有赋给某一个变量.
new Person();//匿名对象,匿名对象只是在堆中开辟一块新的内存空间,但是没有把该空间地址赋给任何变量.
因为没有名称,匿名对象仅仅只能使用一次,一般的,把匿名对象作为方法的实参传递.
public class Person { //成员变量:这些就是Person类对应的对象的状态(private是修饰符) private int id; private String personName; private int age; //成员方法:这些就是Person类对应的对象的行为 void shopping(){ System.out.println("这是购物的方法"); } void sing(){ System.out.println("这是唱歌的方法"); } void dance(){ System.out.println("这是跳舞的方法"); } public static void main(String[] args) { new Person().dance();//匿名对象,没有名字,只能使用一次 } }