访问控制符
是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。
类的访问控制符只能是空或者 public,方法和属性的访问控制符有 4 个,分别是 public、 private、protected 和 friendly,其中 friendly 是一种没有定义专门的访问控制符的默认情况。
访问控制修饰符的权限如表 1 所示。
访问范围
private
friendly(默认)
protected
public
同一个类
可访问
可访问
可访问
可访问
同一包中的其他类
不可访问
可访问
可访问
可访问
不同包中的子类
不可访问
不可访问
可访问
可访问
不同包中的非子类
不可访问
不可访问
不可访问
可访问
访问控制在面向对象技术中处于很重要的地位,合理地使用访问控制符,可以通过降低类和类之间的耦合性(关联性)来降低整个项目的复杂度,也便于整个项目的开发和维护。
static关键字
static只能修饰成员英文含义静态
修饰属性
1.被static修饰的属性所有对象共享同一个值
2.被static修饰的属性值会被保存在内存的方法区中
3.当该类的所有对象共享一个资源时,将这个资源设置为静态能够节省内存
4.静态属性使用类名调用
5.静态属性也称为类属性
修饰方法
1.被static修饰的方法称之为静态方法,类方法
2.静态方法可以直接使用类名调用无需实例化对象
3.静态方法中无法调用普通(实例)属性和方法,因为静态方法中没有this
4.如果一个不需要访问当前类中的实例成员就可以定义称静态的
5.静态方法不能被重写
修饰初始化块
什么是初始化块
在代码中直接编写{},{}中的内容就是初始化块
初始化块中的内容会在构造方法运行前运行
被static修饰的初始化块只会运行一次
运行时机是JVM使用这个类之前,JVM加载类时运行静态块
加载类的情况
实例化对象
使用类名调用静态成员
反射
static修饰成员变量
用static修饰的成员变量不属于对象的数据结构,static变量是属于类的变量,通常可以通过类名来引用static成员。Static成员变量和类的信息一起存储在方法区而不是在堆中,一个类的static成员变量只有“一份”,无论该类创建了多少对象。
Static修饰方法
通常说的方法都会涉及到对具体对象的操作,这些方法在调用时,需要隐式的传递对象的引用(this)。
int d=p1.distance(p2);
调用distance方法时,除了传递p2参数外,还隐式的传递了p1作为参数,在方法中的this关键字即表示该参数
static修饰的方法则不需要针对某些对象进行操作,其运行结果仅仅与输入的参数有关,调用时直接用类名引用。
double c=Math.sqrt(3.0*3.0+4.0*4.0);
该方法在调用时,没有隐式的传递对象引用,因此在static方法中不可以使用this关键字。
由于static在调用时没有具体的对象,因此在static方法中不能对非static成员(对象成员)进行访问。Static方法的作用在于提供一些“工具方法”和“工厂方法”等。
... ... ...
Point.distance(Point p1,Point p2)
RandomUtils.nextInt()
StringUntils.leftPad(String str,int size,char padChar)
... ... ...
Math.sqrt() Math.sin() Arrays.sort()
static块
static块属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源。
编写一个 Java 类,在类中定义一个静态变量,然后使用静态代码块修改静态变量的值。最后在 main() 方法中进行测试和输出。
public class StaticCode {
public static int count = 0;
{
count++;
System.out.println("非静态代码块 count=" + count);
} static {
count++;
System.out.println("静态代码块1 count=" + count);
} static { count++;
System.out.println("静态代码块2 count=" + count);
}
public static void main(String[] args) {
System.out.println("*************** StaticCode1 执行 ***************");
StaticCode sct1 = new StaticCode();
System.out.println("*************** StaticCode2 执行 ***************");
StaticCode sct2 = new StaticCode();
}}
上述代码中 { } 代码块为非静态代码块,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。代码域中定义的变量都是局部的,只有域中的代码可以调用。
final关键字
final:(最终)是一个修饰u符。
1.final可以修饰类,函数,变量(成员变量,局部变量)。
2.被final修饰后的类不可以被其他类继承。
3.被final修饰后的函数不可以被重写。
3.被final修饰后的变量不允许被再次赋值。
final在对变量进行修饰时一定赋值,被final修饰后的变量我们称为变量。
注意:
常量的命名规范;
都要大写,如果这个名字是由多个单词组成的,在单词之间用下划线隔开。
修饰类: 表示这个类不能被继承 修饰方法: 表示这个方法不允许被子类重写 修饰成员变量(属性): 属性值不能被修改 赋值时: 要么声明时赋值 要么构造方法中赋值 修饰局部变量: 修饰方法中声明的变量只能被赋值一次
修饰方法的形式参数不能修改
final修饰变量
final关键字修饰成员变量,意为不可改变。final修饰成员变量有以下两种方式初始化:声明的同时初始化;构造函数中初始化。final关键字也可以修饰局部变量,使用之前初始化即可。
public class Emp{
private final int no=100;//final变量声明时初始化
public void testFinal(){
no=99;
}//编译错误,final的变量不可以改变
}
final修饰方法和类
final关键字修饰的方法不可以被重写,使一个方法不能被重写的意义在于:防止子类在定义新方法时造成“不经意”重写
final关键字修饰的类不可以被继承。
final class Foo{ } class Goo extends Foo{ } //编译错误
JDK中有一些基础类库被定义为final的,例如:String、Math、Integer、Double等等。是一个类不能被继承的意义在于:可以保护类不被继承修改,可以控制滥用继承对系统造成的危害。
static final常量
static final修饰的成员变量称为常量,必须声明的同时初始化,不可被改变。
static final常量会在编译器被替换。如图:
final 修饰符使用总结
1. final 修饰类中的变量
表示该变量一旦被初始化便不可改变
,这里不可改变的意思
对基本类型变量来说是其值不可变,而对对象引用类型变量来说其引用不可再变
。其初始化可以在两个地方:一是其定义处,也就是说在 final 变量定义时直接给其赋值;二是在构造方法中。这两个地方只能选其一,要么在定义时给值,要么在构造方法中给值,不能同时既在定义时赋值,又在构造方法中赋予另外的值。
2. final 修饰类中的方法
说明这种方法提供的功能已经满足当前要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这种方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。在声明类中,一个 final 方法只被实现一次。
3. final 修饰类
表示该类是无法被任何其他类继承的,意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。
对于 final 类中的成员,可以定义其为 final,也可以不是 final。而对于方法,由于所属类为 final 的关系,自然也就成了 final 型。也可以明确地给 final 类中的方法加上一个 final,这显然没有意义。