拜访控制符
是一组限定类、属性或办法是否能够被程序里的其余局部拜访和调用的修饰符。
类的拜访控制符只能是空或者 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 润饰后的变量咱们称为变量。
<u style=”box-sizing: border-box;”> 留神:</u>
常量的命名标准;
都要大写,如果这个名字是由多个单词组成的,在单词之间用下划线隔开。
润饰类: 示意这个类不能被继承 润饰办法: 示意这个办法不容许被子类重写 润饰成员变量 (属性):属性值不能被批改 赋值时: 要么申明时赋值 要么构造方法中赋值 润饰局部变量: 润饰办法中申明的变量只能被赋值一次
润饰办法的形式参数不能批改
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,这显然没有意义。