一、基本概念
-
类和对象是面向对象设计的核心概念
- 类是对一类事物的描述,是抽象、概念的定义。
- 对象是实际存在的该类事物的每一个个体
-
类的成员
- 属性(filed):对应类中的成员变量
- 行为(method):对应类中的成员方法
- 构造器:类中的默认初识化值
- 代码块:对Java 类或对象进行初始化
- 内部类:类的成员使用、类的使用
-
对象的创建和使用
- 通过new关键字对类进行创建
- 通过对象名.对象成员来访问属性和方法
- 匿名对象是只能创建一次,
-
类的访问机制
- 在一个类中的访问机制:类中的方法可以直接访问类中属性和方法
- 在不同类中发访问机制:先创建要访问类的对象,在使用对象来进行访问
二、成员定义
一、属性
-
属性也称为变量:成员变量和局部变量
- 在方法体外声明的变量称之为成员变量
- 实例变量(不以static修饰)
- 类变量(以static修饰)
- 在方法体内部声明的变量称之为局部变量
- 形参(方法、构造器中定义的变量)
- 方法局部变量(在方法体内定义)
- 代码块变量(在代码块内定义)
- 在方法体外声明的变量称之为成员变量
-
成员变量与局部变量区别
成员变量 | 局部变量 | |
---|---|---|
声明 | 在类中区域声明 | 方法形参或内部、代码块内、构造器内等 |
修饰符 | private、public、static、final等 | 不能用权限修饰符修饰,可以用final修饰 |
初始化 | 有默认初始化值 | 没有默认初始化值,必须显式赋值,方可使用 |
内存加载 | 堆空间 或 静态域内 | 栈空间 |
二、方法
- 方法的修饰符:private、缺省、protected、public
- 方法的重载
- 定义:一个类中可以存在一个以上同名方法,只要它们的参数个数或者参数类型不同即可。
- 特点:
- 方法名相同
- 方法的参数类型,参数个不一样
- 方法的返回类型可以不相同
- 方法的修饰符可以不相同
- 注意:jdk1.5之后可以使用String… books 代替String[] books
- 方法的重写
- 定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。
- 要求:
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
- 子类不能重写父类中声明为private权限的方法
- 子类方法抛出的异常不能大于父类被重写方法的异常
- 注意:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为
static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
- 方法的值传递
- 方法的参数必须由其所在类或对象调用才有意义。若方法含有参数:
- 形参:方法声明时的参数
- 实参:方法调用时实际传给形参的参数值
- 值传递
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
- 方法的参数必须由其所在类或对象调用才有意义。若方法含有参数:
三、构造器
- 定义:与类同名、不具有返回值、不能被修饰,不能有return语句
- 作用:初识化对象、为成员属性赋值
- 特点:
- Java 语言中,每个类都至少有一个 构造器
- 默认构造器的修饰符与所属类的修饰符一致
- 一旦 显式定义了 构造器,则系统不再提供默认构造器
- 一个类可以创建多个重载的构造器
- 父 类的构造器不可被子类继承
四、代码块
- 定义:对类或对象进行初始化。
- 类型:静态代码块和非静态代码块
- 静态代码块:用static修饰的代码块
- 可以有输出语句。
- 可以对类的属性、类的声明进行初始化操作。
- 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
- 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
- 静态代码块的执行要先于非静态代码块。
- 静态代码块随着类的加载而加载,且只执行一次。
- 非静态代码块:没有static修饰的代码块
- 可以有输出语句。
- 可以对类的属性、类的声明进行初始化操作。
- 除了调用非静态的结构外,还可以调用静态的变量或方法。
- 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
- 每次创建对象的时候,都会执行一次。且先于构造器执行。
- 静态代码块:用static修饰的代码块
- 执行顺序:
- 声明成员变量的默认初始化
- 显式初始化、多个初始化块依次被执行(同级别下按先后顺序执行)
- 构造器再对成员进行初始化操作
- 通过”对象.属性”或”对象.方法”的方式,可多次给属性赋值
五、内部类
-
定义:当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
-
分类:
- 成员内部类(static成员内部类和非static成员内部类)
- 和外部类不同,Inner class还可以声明为private或protected;
- 可以调用外部类的结构
- Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量;
- 局部内部类(不谈修饰符)、匿名内部类
- 定义
- 可以在内部定义属性、方法、构造器等结构
- 可以声明为abstract类 ,因此可以被其它的内部类继承
- 可以声明为final的
- 编译以后生成OuterClass$InnerClass.class字节码文件(也适用于局部内部类)
- 使用
- 只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方都不能使用该类
- 但是它的对象可以通过外部方法的返回值返回使用,返回值类型只能是局部内部类的父类或父接口类型
- 特点
- 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号,以及数字编号。
- 局部内部类可以使用外部类的成员,包括私有的。
- 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局部变量的声明周期不同所致。
- 局部内部类和局部变量地位类似,不能使用public,protected,缺省,private
- 局部内部类不能使用static修饰,因此也不能包含静态成员
- 匿名内部类
- 定义: 匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
- 特点
- 匿名内部类必须继承父类或实现接口
- 匿名内部类只能有一个对象
- 匿名内部类对象只能使用多态形式引用
- 定义
- 注意
- 非static的成员内部类中的成员不能声明为static的,只有在外部类或static的成员内部类中才可声明static成员。
- 外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式
- 成员内部类可以直接使用外部类的所有成员,包括私有的数据
- 当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的
- 成员内部类(static成员内部类和非static成员内部类)