类 (class)
类 (class):
是对一类事物描述,是抽象概念上的定义。
组成
- 属性:对应类中的成员变量;
- 行为:对应类中的成员方法。
对象 (object)
对象 (object):
是实际存在的该类事物的每个个体,因而也称实例(instance)。
package 关键字
声明源文件所在的包,写在程序的第一行,每.
一次,表示一层文件目录,包名都要小写。
import 关键字
- 显式导入指定包下的类或接口
- 写在包的声明和源文件之间
- 如果需要引入多个类或接口,那么就并列写出
- 如果导入的类是java.lang包下的,如:System String Math等,就不需要显式的声明。
- 导入某个包下的全部类,则使用
.*
。比如java.util.*; - 如何处理同名类的导入。如:在util包和sql包下同时存在Date类。
- import static 表示导入指定类的static的属性或方法
- 导入java.lang.*只能导入lang包下的所有类或接口,不能导入lang的子包下的类或接口
构造函数
构造函数是用来初始化对象
的,一个类可以重载
多个构造函数。
类中默认
有一个无参构造函数
。当存在其他有参构造函数时,默认构造函数将被覆盖;若需无参构造函数还需重新定义。
this 关键字
this是当前对象的引用。
this()
可用调用另一个已定义
的构造函数。
super 关键字
super是当前对象的父类引用。
super()
可用调用父类已定义
的构造函数。
构造函数里默认的都有一个隐式的super();去调用父类无参的构造
常量
定义
在程序执行的过程中,其值不可以发生改变的量。使用前必须先定义,可以在程序中用符号来代替常量值使用。
分类
- 字符串常量
- 整数常量
- 小数常量
- 字符常
- 布尔常量
- 空常量
注意事项
- 在定义常量时就需要对该常量进行
初始化
; - final 关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或者方法;
- 为了与变量区别,常量取名一般都用
大写
字符。
变量
定义
在程序执行的过程中,在某个范围内其值可以发生改变的量。
从本质上讲,变量其实是内存中的一小块区域。
按数据类型划分
基本数据类型变量
定义:基本数据类型(byte,short,int,long,float,double,char,boolean)定义的变量。
注意事项:整数默认是int类型,浮点数默认是double类型。
引用数据类型变量
定义:引用数据类型(String、Date、Student等)定义的变量。
注意事项:类外面不能有变量的声明。
按被声明的位置划分
成员变量
定义位置:方法外部,类内部定义的变量。
一、 类变量(静态变量)
定义:独立于方法之外,用static
修饰的变量。
注意事项:
- 通常被声明(public/private、final、static)作为
常量
使用; - 可以在静态语句块中初始化;
- 随着类的加载而存在,随着类的消失而消失。在第一次被访问时创建;
- 存储在方法区中的
静态区
中,所有对象共享
; - 创建的对象只拥有
一份
类变量的拷贝
; - 可以通过:
ClassName.VariableName
的方式访问。
二、实例变量(成员变量)
定义:在类中独立于方法、构造方法、语句块之外的变量,没用 static 修饰。
注意事项:
- 通常设为私有,类中(方法、构造方法、者语句块)可见;
- 当一个对象被实例化之后,每个实例变量的值就跟着确定;
- 存储在
堆内存
中,每个对象所特有
的数据; - 随着对象的创建而存在,随着对象的消失而消失;
- 类内可以通过
变量名
直接访问。
局部变量
定义:类的方法、构造方法、者语句块中的变量,块语句执行完成后,变量将会被销毁;
注意事项:
- 不能使用访问修饰符;
- 在
栈
上分配的。 - 没有默认值,必须经过初始化。
访问修饰符
定义:可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
private
在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
default 缺省
在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected
对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
public
对所有类可见。使用对象:类、接口、变量、方法
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
重写 与 重载
重写(覆盖)
子类
定义一个与父类一样
(方法名、返回值类型、参数列表均相同)的方法,访问权限不能小于所覆盖的方法,抛出的异常不能大于多于所覆盖的方法。
重载
同一个类
中,多个参数列表不同
(数量、类型、顺序)的同名方法,与访问权限修饰符、返回类型无关。
继承 与 实现
继承 extends
如果多个类的某个部分的功能相同,那么可以抽象出一个类,把他们的相同部分都放到父类里,让他们都继承这个类。
子类仅能继承一个
父类非private修饰
的属性、变量、常量、方法等。
实现 implements
如果多个类都有一个行为,但是处理的方法方式不同,那么就定义一个接口,也就是一个标准,让各个类分别实现这个接口,各自实现自己具体的处理方法。
实现类可以使用多个
接口中的全局常量(static final),必须实现接口中定义的抽象方法。
面向对象三大特性
封装
将对象的属性
和实现细节
隐藏,仅允许通过访问公共方法
(如:getter/setter)来操作。遵循开闭原则
。
继承
继承是类与类的一种关系
,子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有),从而实现代码复用
。
多态
引用多态
按引用对象(父类/子类)的不同,去调用不同的属性/方法。
方法多态
按调用不同参数的方法,自主匹配调用。
五大基本原则
-
单一职责原则SRP(Single Responsibility Principle)
类的功能要单一,不能包罗万象。 -
开放封闭原则OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的。 -
里式替换原则LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。 -
依赖倒置原则DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。 -
接口分离原则ISP(the Interface Segregation Principle ISP)
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。
类的初始化内存划分结构
- 栈(stack):局部变量 、对象的引用名、数组的引用名
- 堆(heap):new 出来的
实体
,含成员变量 - 方法区:含
字符串常量
- 静态域:声明为
static
的变量