一.访问修饰符,3个关键字,4种情况
无论访问修饰符写在类,属性,方法,得到的效果都是一样的。
1.private
本类。使用最多的99%。
2.默认
同包类
3.protected
同包类,子类
4.public
所有。
###总结:但实际上极少的东西是public的。方法的话要根据具体的业务逻辑来设计
二.get/set
1.好处
- 可以将某个属性变为只读或者只写。
- 对用户外部设置的值进行有效性控制。
- 可以对外隐藏内部属性存放的结构。
总结:访问修饰符和get/set要配合使用,从而达到信息隐藏的效果。
三.static(静态)关键字
1.效果
- static属性
- 全类共享一个值。
- 跟对象无关,只跟类有关系。
- static修饰的属性又被称为类属性
- 单独存放在数据段的静态区
- static修饰的属性在类加载期就产生了。
- static方法
- 不能访问非静态属性和方法。
- 只能访问静态属性和方法。
- 非静态方法可以访问静态放发和属性。
- 跟对象无关,只跟类有关。
- static修饰的方法又被称为类方法。
总结:static的变量属性是极少的。常量属性一般被设置为satic的,节约内存。虚拟机会优先加载static修饰的属性和方法。
总结2:static修饰的东西与对象无关,只与类有关。凡是static修饰的东西一定在加载期有特殊动作。
2.什么时候使用static
- 常量。
- 对象无关,全类共享一个值。
- 这个方法不能操作对象的普通属性和方法。无论哪个对象来调用都没有差异。
- 工具类的工具方法是static的。例如Math和System.exit()。
四.初始化块
1. 实例初始化块
例如。
{
System.out.println("这是一个初始化块");
}
无需进行调用,在某个时间点会自动进行调用。会在产生对象之后但是在构造方法我们写的代码之前被自动调用。所以实例初始化块没什么用!
2. 静态初始化块
static{
System.out.println("静态初始化块");
}
不能操作非静态的属性或方法。也是自动被执行,在类加载时期自动执行的,且只执行一次。当我们需要预先加载一些资源动作的时候,这些代码就写在静态初始化块当中(项目中常见)。
五.前瞻性 -> 内部类,这种在类的内部定义的类,称为内部类。
特点:独立的一个Class文件,同样需要编译,同样可以产生对象。
1.分类
1. 成员内部类
- 定义在外部类中,和外部类的属性,方法,构造,处于平行地位。
- 拥有独立的class文件,其命名规则—外部类的类名+$+内部类类名。
- 可以拥有各种访问修饰符,同样限制了这个内部类能在哪些地方被操作到。
- 成员内部类可以定义各种属性、构造方法、初始化块甚至再次定义内部类。
- 属性和方法不能是static的。
语法:先要new出外部类的对象,然后通过new 对象.内部类();
2. 静态内部类—成员内部类的特例—用static修饰的成员内部类
public static class Innter{
}
- 命名规则与成员内部类相同
- 也可以有访问修饰符,效果相同
- 可以拥有静态属性
- 无需产生外部类的对象,直接使用外部类类名,内部类类名的方法作为它的类型,new出来即可。
- 静态内部类的方法不能操作外部类的非静态属性和方法。只能操作外部类中静态的属性和方法。
3. 局部内部类
定义在外部类的某个方法当中的。
public method(){
class inner{
}
}
- 局部内部类生成的.class文件名是:外部类名+$+序号+内部类。
- 局部内部类不能添加访问修饰符,使用效果和局部变量是一样的。
- 没有静态方法和变量。
- 局部内部类不能访问外部类方法中的局部变量,只能够访问常量。
使用:只能在本方法中使用。
4. 匿名内部类
- 定义在外部类的某个方法中的。由于没有类名所以只能用一次,在产生它的对象的时候同时去定义它 —-语法极其特殊 。
- 匿名内部类连类名都没有,没有class关键字,当然就不能使用任何访问修饰符。
- 匿名内部类产生对象的语法和类的定义语法是写在一起的,只能用这一次。
- 内部可以定义属性,方法,初始化块,再定义内部类。
- 不可以定义构造方法,因为没有类名。
- 若果想在方法中操作它的属性或方法,只能在new 出来以后马上.操作属性或者方法。
- 匿名内部类不能访问外部类方法中的局部变量,只能够访问常量。