【1】四种访问权限修饰符—封装性的体现
1、从小到大排列:private < 缺省 < protected <public
修饰符类内部同一个包不同包的子类同一个工程privateYes(缺省)defaultYesYesprotectedYesYesYespublicYesYesYesYes
2、4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
具体的,四种权限都可以用来修饰类的内部结构,属性,方法,构造器,内部类
修饰类的话,只能使用:缺省、public
【2】Final
1、简述final作用 最终的 修饰类:表示不可被继承 修饰方法:表示方法不可被子类覆盖,但是可以重载
修饰变量:表示变量一旦被赋值就不可以更改它的值如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初识值。
如果final修饰的是成员变量,在声明的时候就需要赋值,或者代码块中赋值,或者构造器赋值
【注】这里构造器必须只能是带这个成员变量参数的构造器,其他的不能出现。
/*1 final修饰成员变量*/
//1.1 在声明时直接赋值
final int age = 0;
//1.2 在代码块中赋值
/* 【注】此代码块为构造代码块:
* 直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
* 构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
* 如果存在多个构造代码块,执行顺序由他们在代码中出现的次序决定,先出现先执行。
* */
final int age02;
{
age02 = 3;
}
//1.3 在构造器中赋值
final int age03;
public Person(int age03) {
this.age03 = age03;
}
(2)修饰类变量,只能在静态静态初始化块指定初始值,或者声明该类变量时指定初识值。
/*2 final修饰类变量*/
//2.1 在声明是赋值
final static int age04 = 1;
//2.2
final static int age05;
static {
age05 = 3;
}
(3)修饰局部变量 系统不会为局部变量进行初识化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,
即可以在定义时指定默认值(后面的代码不能对变量在赋值),也可以不指定默认值,而在后面的代码中对final变量初赋值(仅一次)
public void test() {
//3.1 在声明时直接赋值
final int a = 0;
//3.2 在声明时不进行初始化,不会报错,与final无关,但是在使用之前一定要赋值
final int a2;
a2 = 1;
}
(4)修饰基本数据类型和引用类型数据 如果是基本类型的变量,则其数值一旦在初始化之后便不能更改
如果是引用数据类型的变量,则在对其初始化之后便不能再让一个指向另一个对象。但是引用的值是可变的
2、为什么局部内部类和匿名内部类只能访问局部final变量?
首先内部类和外部类是属于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕就被销毁。这里就会产生一个问题:当外部类的方法结束时,局部变量就会被销毁,但是内部类对象可能还存在(只有没有人在引用它时,才会死亡)。这里就出现了一个矛盾:内部类对象访问了一个不存在的变量。为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡后,内部类仍可以访问它,实际访问的是局部变量的"copy"。这样就好像延长了局部变量的生命周期。
将局部变量复制为内部类的成员
变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修改了成员变量,方法的局部变量也得跟着改变,怎么解决问题呢?
就将局部变量设置为final,对它初始化后,我们就不让你再去修改这个变量,就保证了内部类的成员变量和方法的局部变量的一致性。这实际上也是一种妥协。使得局部变量与内部类内建立的拷贝保持一致
【3】staic:静态的
1、可以原来修饰的结构:主要用于修饰类的内部结构 属性、方法、代码块、内部类
【注】static不能修饰构造器。因为static随着类的加载而加载 2、static修饰属性:静态变量(或类变量)
[1]属性,是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
[2]静态属性:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
3、static修饰属性的其他说明: [1]静态变量随着类的加载而加载。可以通过 “类”.“静态变量” 的方式进行调用
[2]静态变量的加载要早于对象的创建。 [3]由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。
4、静态变量内存解析
5、static修饰方法:静态方法 [1]随着类的加载而加载,可以通过"类"."静态方法"的方式进行调用
[2]静态方法中,只能调用静态的方法或属性 非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性。
6、static注意点: [1]在静态方法中,不能使用this关键字、super关键字 7、如何判定属性和方法应该使用static关键字:
[1]关于属性:属性是可以被多个对象所共享的,不会随着对象的不同而不同的。 [2]类中的常量也尝尝声明为static 8、关于方法
[1]操作静态属性的方法,通常设置为static的
[2]工具类中的方法,习惯上声明为static的。比如:Match、Arrays、Collections 9、使用举例:
举例一:Arrays、Math、Collections等工具类 举例二:单例模式