• 0

  • 0

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

6天前

访问控制符

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

类的访问控制符只能是空或者 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() 方法中进行测试和输出。

<pre spellcheck="false" 
class="md-fences md-end-block ty-contain-cm modeLoaded" 
lang="" cid="n82"
 mdtype="fences" 
style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
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();    
}}</pre>
复制代码

上述代码中 { } 代码块为非静态代码块,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。代码域中定义的变量都是局部的,只有域中的代码可以调用。

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,这显然没有意义。

免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

java

0

相关文章推荐

未登录头像

暂无评论