访问限定符
类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。
这里目前主要掌握private,default和public
public:可以理解为一个人的外貌特征,谁都可以看得到
default: 同一个包中,default权限指:什么都不写时的默认权限,即没有修饰限定符
private:同一个类中
例子如包的访问权限控制
访问private属性的方法
如下,生成属性接口
static成员
之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生
而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所
有的学生来共享。
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的。
直接通过类访问
或者通过对象访问
static修饰成员变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】
.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生
4.静态成员变量是什么时候初始化的
在加载的时候就被初始化了,静态的是最先最执行的
静态成员变量与对象没有关系
static修饰成员方法
通过类调用
通过对象调用
在静态成员方法中,调用非静态的成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过
静态方法来访问的。
【静态方法特性】
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
static成员变量初始化
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化
就地初始化
就地初始化指的是:在定义时直接给出初始值
静态成员方法在对象为空的情况下,也可以被调用
private可以修饰成员变量,成员方法和构造方法;
代码块
使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块
静态块
同步代码块(后续讲解多线程部分再谈)
普通代码块:定义在方法中的代码块.
构造代码块
定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
如上,完成了对静态变量的初始化
从上图还可以看出,在静态块,构造块,构造方法的执行顺序为
多个静态代码块时
结果由最后一个静态块决定
注意事项
静态代码块不管生成多少个对象,其只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行
对象的打印
如果想要默认打印对象中的属性该如何处理呢?答案:重写toString方法即可
内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服
务,那么这个内部的完整结构最好使用内部类。
可以将一个类定义在另一个类可以将一个类定义在另一个类或者一个方法的内部。
内部类也是封装的一种体现。
public class OutClass {
class InnerClass{
}
}
// OutClass是外部类
// InnerClass是内部类
内部类的分类
根据内部类定义的位置不同,一般可以分为以下几种形式:
- 成员内部类(普通内部类:未被static修饰的成员内部类 和 静态内部类:被static修饰的成员内部类)
- 局部内部类(不谈修饰符)、匿名内部类
实例内部类
即未被static修饰的成员内部类
在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员,包括变量和方法
要访问实例内部类中成员,必须要创建实例内部类的对象,建实例内部类对象时必须借助外部类
如下
既有内部类的this,又有外部类的this
【注意事项】
- 外部类中的任何成员都可以在实例内部类方法中直接访问
- 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
- 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名
称.this.同名成员 来访问 - 实例内部类对象必须在先有外部类对象前提下才能创建
静态内部类
被static修饰的内部成员类称为静态内部类。
在静态内部类中只能访问外部类中的静态成员
创建静态内部类对象时,不需要先创建外部类对象
局部内部类
定义在外部类的方法体或者{}中,局部内部类只能在所定义的方法体内部使用
匿名内部类
在匿名类内部,访问是不可以改变的