1.类和对象
- 类定义
- 定义类class
[修饰符] class 类名{
零到多个构造器定义...
零到多个成员变量定义...
零到多个方法定义...
}
// 修饰符可包括:public,final,abstract,或完全省略这三个修饰符
final和abstract 不能同时出现
类被public修饰,该外部类可被所有类使用;类若不使用访问控制符,则该类只能被同一包中的类使用(创建对象)。
- 定义成员变量field
[修饰符] 类型 成员变量名 [= 默认值];
// 修饰符可以省略,也可以是public,protected,private,static,
final,其中public,protected,private三个最多只能出现其中之一,可以与static,final组合起来修饰成员变量。
// 类型:可以是Java允许的任何数据类型
- 定义方法method
[修饰符] 方法返回值类型 方法名(形参列表){
// 由零到多条可执行性语句组成的方法体
}
// 修饰符可以省略,也可以是public,protected,private,static,
final,abstract,其中public,protected,private三个最多只能出现其中之一;abstract和final最多只能出现其中之一,可以与static组合起来修饰方法。abstract与static不能同时修饰某个方法(static表示方法属于类本身,但如果被修饰成abstract,该方法将没有方法体,所以通过类调用该方法会出现错误)
// 方法返回类型:Java允许的任何数据类型
//static和abstract并不是完全互斥的,虽然不能同时修饰方法,但可以同时修饰内部类。
- 定义构造器constructor
[修饰符] 构造器名(形参列表){
// 由零条到多条可执行性语句组成的构造器执行体
}
// 修饰符:可省略,也可以是public,protected,private其中之一
// 构造器名:与类名相同
- static用法
被static修饰的成员变量:叫做类变量或静态变量
被static修改时的方法:叫做类方法或静态方法
- 对象的产生和使用
- 对象、引用和指针
- 对象的this引用
this作为对象的默认引用有两种情形(构造器中引用该构造器正在初始化的对象;在方法中引用调用该方法的对象)。this关键字总是指向调用该方法的对象。
2.方法详解
- 方法的所属性
- 方法的参数传递机制
Java里参数传递方式只有一种:值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到影响。
- 形参个数可变的方法
个数可变的形参只能处于形参列表的最后。一个方法中最多只能包含一个个数可变的形参。个数可变的形参本质就是一个数组类型的形参,因此调用包含个数可变形参的方法时,该个数可变的形参既可以传入多个参数,也可以传入一个数组。
- 递归方法
一个方法体内调用它本身,被称为方法递归。递归应该是有方向,并且某时刻的返回值是确定的。
- 方法重载
3.成员变量和局部变量
- 成员变量和局部变量
成员变量:默认初始化时的赋值规则与数组一致
局部变量(形参,方法局部变量,代码块局部变量):除形参外都必须显示的初始化后才可以使用。
- 成员变量的初始化和内存中的运行机制
- 局部变量的初始化和内存中的运行机制
局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。栈内存的变量无须系统垃圾回收,往往随方法或代码块的结束而结束。
- 变量的使用规则
4.隐藏和封装
- 理解封装
它指的是将对象的信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的方法来实现对内部信息的操作和访问。
- 使用访问控制符
private(当前类访问权限)
default(包访问权限)
protected(子类访问权限)
public(公共访问权限)
基本规则:
- 类里的绝大部分成员变量用private修饰,只有一些static修饰的、类似全局变量的成员变量,才可能考虑用public修饰
- 如果某类主要用作其他类的父类,使用protected修饰
构造器、外部类通常用public修饰
- package、import和import static
import :引入包下的所有类或引入包中的单个类
import static:引入某包某类的单个静态成员变量或静态方法,引入某包某类中的所有静态成员变量和方法。
- Java常用包
5.深入构造器
- 使用构造器执行初始化
- 构造器重载
当需要在构造器中调用另一个构造器时,可以用this(参数列表)的形式调用。
6.类的继承
- 继承的特点
- 重写父类的方法
- super限定
- 调用父类构造器
因为super和this都必须出现在构造器执行体的第一行,所以super和this不能同时出现。
不管是否使用super调用来执行父类构造器的初始化代码,子类构造器总会调用父类构造器一次。(若自定义父类构造器,那么在子类中必须显示的调用)
子类的构造器执行体中既没有super调用也没有this调用,则系统会隐式调用父类的无参构造器。
7.多态
- 多态性
编译时类型与运行时类型不一致;Java允许把子类对象直接赋给父类引用变量(或者被称为向上转型,由系统自动完成),当运行时调用该引用变量的方法时,其方法行为总是变现为子类方法的行为特征,而不是父类方法的行为特征,这就是多态;多态是指方法的多态,而对象的实例变量不具有多态性;引用变量在编译阶段只能调用其编译时类型所具有的方法。
* 引用变量的强制类型转换
如果需要让引用变量调用它运行时类型的方法,则必须把它强制转换成运行时类型;引用类型之间的转换只能在具有继承关系的两个类型之间进行;如果试图把一个父类的实例转换成子类类型,则这个对象必须实际上式子类实例才行。
- instanceof运算符
instanceof运算符的前一个操作数是引用类型变量,后一个操作数是类或接口,用于判断前面的对象是否是后面的,或者其子类、实现类的实例。
注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误。
8.继承与组合
- 使用继承的注意点
- 利用组合实现复用
9.初始化块
- 使用初始化块
初始化块只能用static(静态初始化块)或省略修饰(普通初始化块)
普通初始化块、声明实例变量指定的默认值都可以认为是对象的初始化代码,它们的执行顺序与源程序的排列顺序相同;实例变量初始化顺序是:先执行初始化块或声明实例变量指定的初始值,在执行构造器中指定的初始值。
- 初始化块和构造器
初始化块是对构造器的补充;
- 静态初始化块
类相关,所以在类初始化阶段执行,而不是创建对象阶段执行,所以比普通初始化块先执行。静态初始化块不能对实例变量进行初始化处理。
初始化的阶段:分为两个阶段:类初始化阶段,先执行顶层父类的静态初始化块依次向下;对象初始化阶段,先执行顶层父类的普通初始化块、构造器,依次向下。
10.本章小结
拓展
不同的修饰符 作用范围