什么是面向对象
面向对象 Object Oriented Programming 简称:OOP;
在程序中使用对象来映射现实中的事物,适用对象的关系来描述事物之间的联系,这种思想就是面向对象;
面向对象与面向过程的区别
面向过程就是分析解决问题所需要的步骤,然后用函数把这些步骤一一实现,使用的时候依次调用就可以了。
面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过对象的方法来解决问题。一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能。当某个应用程序功能需要改变时,只需要修改个别的对象即可,这样可以使代码更容易维护,效率更高。
例如:洗衣服,之前小鲸鱼是将衣服放到盆里面,然后倒入适量洗衣粉,在加入适量水,然后这时候小鲸鱼就开始了纯手工搓洗阶段,有了面向对象之后,小鲸鱼就像是拥有了一台洗衣机,就只需要将衣服放进洗衣桶,然后倒入洗衣粉,按下开始按钮,此时,小鲸鱼就只需要等待它洗好就行,所以很大程度上提高了效率
面向对象的三大特性
封装性
封装性是面向对象的核心思想,将对象的属性和方法封装起来,不需要让外界知道具体实现的细节,这就是封装的思想。
封装可以是数据的安全得到保证。当把过程和数据封装起来后,对数据的访问只能通过已定义的接口进行
继承性
继承主要指的是类与类之前的关系。通过继承,可以有效的对原有类的功能进行扩展。
继承不仅增强了代码的复用性,提高了开发效率 ,更为程序的修改补充提供了便利
注意:继承要是用extends关键字,并且java中只允许单继承,即一个类只能有一个父类。这样的继承关系呈树状,体现了java的简单性,子类只能继承在父类中可以访问的属性和方法,实际上父类中私有的属性和方法也会被子类继承,只是子类无法访问
多态性
多态是把子类型的对象主观的看作其父类型的对象,那么父类型就可以是很多种类型。
多态有以下特性:
对象的实例确定后则不可改变(客观不可改变);
只能定义编译时类型所定义的方法;
运行时会根据运行时类型去调用相应类型中定义的方法;
构造方法主要特点
构造方法的名称必须与类的名称完全相同
构造方法不返回任何数据,也不需要使用void关键字声明
构造方法的作用是创建对象并初始化成员变量
在创建对象时,系统会自动调用类的构造方法
构造方法一般用public关键字声明
每个类至少有一个构造方法。如果不定义构造方法,java将提供一个默认的不带参数且方法为空的构造方法
构造方法也可以重载
访问修饰符的作用范围
私有的访问修饰符private
private修饰符对应最严格的访问级别,被声明为private的方法、变量和构造方法只能被所属类访问。
无访问修饰符
不使用访问修饰符声明的变量和方法,可以被这个类本身或者与类在同一个包内的其他类访问
受保护的访问修饰符protected
protected修饰符不能修饰类和接口,方法和成员变量能够声明为protected,但是接口的成员变量个成员方法不能声明为protected。
共有的访问修饰符public
被声明为public的类、方法、构造方法和接口能够被任何其他类访问。
非访问修饰符
1.static修饰符
static修饰符用来修饰类和成员变量和成员方法,也可以形成静态代码块。static修饰的成员变量和成员方法一般称为静态变量和静态方法,可以直接通过类名访问它们
2.final修饰符
final可以修饰类、方法和变量,意义不同,但是本质相同,都是表示不可改变;
使用final方法的原因有两个:
一是把方法锁定,防止任何继承类修改它的意义和实现;
二是高效(编译器在遇到调用final方法时,会转入内嵌机制,大大提高执行效率);
3.abstract修饰符
abstract用来修饰类,这个类成为抽象类。抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
抽象类可以包含抽象方法和非抽象方法。
抽象方法不能被声明陈final和static。
4.synchronized修饰符
synchronized声明的方法同一时间只能被一个线程访问。
synchronized的作用范围有如下两种:
1)在某个对象内,synchronized修饰的方法可以防止多个线程同时访问。
2)在某个类中,用synchronized修饰静态方法可以防止多个线程同时访问这个静态方法。
5.transient修饰符
序列化对象包含被transient修饰的成员变量时,JVM跳过该特定的变量。该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。
6.volatile修饰符
java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了同步块和volatile关键字机制。volatile修饰的成员变量在每次被线程访问时都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值会写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。(一个volatile对象引用可能是null)
接口与抽象类的不同点
1.接口支持多继承,抽象类不能实现多继承
2.一个类只能继承一个抽象类,但是可以实现多个接口
3.接口中的成员变量只能是public static final类型的,抽象类中的成员变量可以是各种类型的
4.接口只能定义抽象方法;抽象类既可以定义抽象方法,也可以定义实现的方法
5.接口中不能含有静态代码块以及静态方法(static修饰的方法),抽象类可以有静态代码块和静态方法
接口与抽象类的相同点
1.都可以被继承
2.都不能被直接实例化
3.都可以包含抽象方法
4.派生类必须实现未实现的方法