面向对象程序设计
将数据及对数据的操作封装在一起,成为一个不可分割的整体
同时将具有相同特征的对象抽象成一种新的数据类型——类
三大特征
面向对象最重要的三大特征:封装,继承,多态
封装
将数据和行为组合在一起,并对对象的使用者隐藏实现方式
保护类中的数据,对外部进行隐藏,向外公开访问的接口,外部通过访问接口取得想要的功能
继承
子类继承(extends)父类的所有非私有成员,是一种联结类的层次模型,并允许和鼓励类的重用,它提供了一种明确表示共性的方法
单根性:Java中一个类只能继承自一个父类
传递性:父类中的非私有属性和方法子类也拥有
多态
指允许不同类的对象对同一消息做出响应
多态的体现:
[1] 重载
[2] 重写(覆写)
访问修饰符
对于类:
[1] default:没有修饰符的类,只可被同一个包下的类访问
[2] public:修饰的类可以被任何代码访问
对于属性和方法:
[1] private:只在本类中可以访问
[2] default:在同一个包下可以访问,就算是子类,在不同包中也不能访问
[3] protected:只有自己和子类、同包的类可以访问,不同包的子类也只能使用方法调用protected成员
[4] public:只要能访问到类,就可以访问
访问修饰符
对于类:
[1] default:没有修饰符的类,只可被同一个包下的类访问
[2] public:修饰的类可以被任何代码访问
对于属性和方法:
[1] private:只在本类中可以访问
[2] default:在同一个包下可以访问,就算是子类,在不同包中也不能访问
[3] protected:只有自己和子类可以访问,不同包的子类也只能使用方法调用protected成员
[4] public:只要能访问到类,就可以访问
包
实际就是文件系统中的文件夹的概念
由于同一个目录下不能有多个同名的类文件,因此包主要是用于避免同名的类的情况
每一个Java源文件都会默认导入java.lang包
类
类是一组有共同特征的对象的抽象,通过new关键字创建对象,对象是类的具体
与生活中的类别是一个概念
是Java中组织代码的基本单元
所有类都直接或间接继承自Object类
类中方法重载是多态的一种体现形式
构造函数
用于初始化对象,没有返回值,与类同名
系统为每一个类自动添加一个无参构造,如果自己手动写了构造函数,则不会自动添加
构造函数不可以显式调用,系统会自动调用,子类可以用super来调用父类的某一个构造函数
方法参数传递
Java的参数传递全为值传递,不存在引用传递的说法
关于引用类型的传递如下图所示:
在堆空间中创建对象,并把堆空间中表示该对象的首地址保存在栈空间中,引用类型在传递时传递的是栈空间的值
可变参数
//调用方法时可以传递任意数量的实参,系统会把这些实参进行封装,封装成类型匹配的数组
public void change(Object... obj) { }
//可变参数必须放在参数列表的最后一位
//该形式参数在jdk1.7后支持
方法的重写
方法重写是指在子类中重写父类的方法,需要使用@Override关键字,这也是多态的一种体现形式
[1] 方法签名必须一致(返回值,方法名,参数)、
[2] 访问修饰符必须大于或等于重写方法的访问修饰符
[3] 不能超过父类方法所跑出的异常类型
方法的重载
在同一个类中有同名的方法,参数不同,返回值无所谓,只要方法名相同就行
抽象类与抽象方法
1. 定义抽象类和抽象方法为abstract
2. 抽象方法是没有方法体的,也就是说没有具体实现,即没有大括号“{ }”,直接加”;”结束
3. 有抽象方法的类一定是抽象类,但抽象类不一定有抽象方法,抽象类中可以有实例方法
4. 抽象类不能实例化,只能依赖子类来创建对象去访问类中的方法,子类必须实现抽象类中的所有抽象方法,不然也必须是一个抽象类
5. 抽象方式只是定规则(约束),子类来实现规则
6. 抽象类主要用来进行类型隐藏
接口
接口(interface)是一个规则的定义,约束子类的行为
接口是设计层面的概念,往往由设计师设计,将定义与实现分离
程序员实现(implements)接口,实现具体方法
面向接口编程:在面向对象的系统中所有的类或者模块之间的交互是由接口完成
接口中只能有公开静态常量(publicstatic final)和公开抽象方法(publicabstract)
接口不能被实例化,可以多个实现,用”,”分隔
子类必须实现所有抽象方法,否则必须声明为抽象类
接口与接口之间是继承,不是实现,并且可以继承多个接口
默认方法(jdk 1.8 之后出现):default type function(param) {}
final关键字
final可以修饰变量,方法,及类
final修饰变量:必须在声明时初始化,不能赋第二次值
final修饰方法:表示该方法不能被子类覆写,final不能与abstract同时修饰一个方法
final修饰类:表示该类不能被继承,java.lang.String就是一个final修饰的类
static关键字
属性是群体中每个个体共享的
static成员不存放在对象对应的堆空间中,而是存在方法区中,同一个类的所有对象共享静态成员
静态成员直接通过类访问,不需要通过对象访问
静态的成员在程序编译时初始化,实例成员在创建对象时才初始化
静态成员不能直接访问实例成员,实例成员可以直接访问静态成员
静态类要求所有成员都是静态的
import static可以用于导入类的静态成员
单例模式
单例模式:一个类只能创建一个对象
步骤:
两种实现方法:
1. 懒汉式
[1] 构造函数私有化
[2] 在类的内部创建一个自身类的静态私有成员object
[3] 该类的内部提供一个向外公开静态的获取自身类的对象的方法,判断object是否为空,若为空,则先创建对象再返回,否则直接返回object
2. 饿汉式
[1] 构造函数私有化
[2] 在类的内部创建一个自身类的静态私有成员object并实例化
[3] 该类的内部提供一个向外公开静态的获取自身类的对象的方法,用于返回object
懒汉式缺陷是有线程同步的安全问题,可能会产生多个对象,因此在单线程情况下推荐
饿汉式的缺陷是提前初始化,有点影响安全