Java基础篇一一访问控制、static、final

访问控制符

是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。

类的访问控制符只能是空或者 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成员变量只有“一份”,无论该类创建了多少对象。

Java基础篇一一访问控制、static、final_第1张图片

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基础篇一一访问控制、static、final_第2张图片

编写一个 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常量会在编译器被替换。如图:

Java基础篇一一访问控制、static、final_第3张图片

final 修饰符使用总结

1\. final 修饰类中的变量

表示该变量一旦被初始化便不可改变

,这里不可改变的意思

对基本类型变量来说是其值不可变,而对对象引用类型变量来说其引用不可再变

。其初始化可以在两个地方:一是其定义处,也就是说在 final 变量定义时直接给其赋值;二是在构造方法中。这两个地方只能选其一,要么在定义时给值,要么在构造方法中给值,不能同时既在定义时赋值,又在构造方法中赋予另外的值。

2\. final 修饰类中的方法

说明这种方法提供的功能已经满足当前要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这种方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。在声明类中,一个 final 方法只被实现一次。

3\. final 修饰类

表示该类是无法被任何其他类继承的,意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。

对于 final 类中的成员,可以定义其为 final,也可以不是 final。而对于方法,由于所属类为 final 的关系,自然也就成了 final 型。也可以明确地给 final 类中的方法加上一个 final,这显然没有意义。

你可能感兴趣的