java修饰符
文章目录
一、final 与 static private
1. final
final
类不能被继承,没有子类,final
类中的方法默认是final
的final
方法不能被子类的方法复盖,但可以被继承:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FatherUtil {
private Integer fa1;
private Integer fa2;
final void test1(Integer fa1, Integer fa2){
System.out.println(fa1 + fa2);
}
void test2(Integer fa1, Integer fa2){
System.out.println(fa1 + fa2);
}
}
public class ChildUtil extends FatherUtil{
private void test(){
test1(getFa1(), getFa2());
}
public void test2(Integer fa1, Integer fa2){
}
}
final
成员变量表示常量,只能被赋值一次,赋值后不能再被改变private
不能被子类方法覆盖,private
类型的方法默认是final
类型的final
不能用于修饰构造方法
为什么
abstract
、static
、final
都不能用于修饰构造方法?构造方法本身是用于创建对象的方法,而用
abstract
类中的方法声明,子类进行方法实现,使用abstract
后子类则无法实现构造方法。若使用static
修饰构造方法,static
修饰变量或代码块本身在类加载过程中就已被加载到方法区或常量池(JDK1.8中字符串常量池和运行时常量池逻辑上属于方法区,但是实际存放在堆内存中,因此既可以说两者存放在堆中,也可以说两者存在于方法区中),且静态变量或方法可直接使用无需创建对象引用,而构造方法需要在创建对象时调用。final
修饰方法,目的在于方法不能被子类重写,而构造方法本身就只能被子类继承而不能被重写,所以使用final
修饰构造方法=脱裤子放屁。
2. static
-
static
修饰成员变量和成员方法为静态全局变量,又称类变量。 -
即便没有
static
声明,类的构造器方法也是静态方法。
-
static
修饰的变量或代码块,在类加载的准备阶段就会被创建并在方法区分配内存;而实例变量则会在对象实例化时被分配到堆中。因此静态变量或方法的访问不需要实例化对象,可直接访问,且static
代码块或方法中不能包含非静态变量或方法。
java的类加载机制会在后续文章做详细说明
3.static final
static final
修饰的方法或变量为全局变量或全局常量,不可修改或重写,且可直接访问。当变量类型为引用类型(如ArrayList
、HashMap
等)时,地址不可更改,但可以改变其属性或内容。
二、private、protected、package-private(defalt)与public
1、private
private
即字面意思,私有的。private
所修饰的方法或变量为类私有,仅类内成员可访问使用,子类也不可使用。
2、protected
protected
在同一包内的类都可自由访问并修改变量,而包外的除子类外,外部类无法对其进行访问调用,对于外部类其等同于private
。
// package1
public class Test{
protected static int num = 1;
public static int num1 = 1;
protected void str(){
String str = "skrskr";
System.out.println(str);
}
public void str2(){
String str = "skrskr";
System.out.println(str);
}
//package2
public class Child extends Test {
@Override
protected void str() {
super.str();
}
public static void main(String[] args){
Test test = new Test();
test.str(); //'str()' has protected access in '(package1)'
int i = test.num1;
int j = test.num; //'num' has protected access in '(package1)'
Child child = new Child();
child.str();
}
}
如上所示,protected
修饰的对象,在不同包内可以通过子类的实例引用进行方法调用,但无法通过父类的实例进行调用。
3、package-private(default)
default
,默认的。包内成员任意访问,包外类等于private
。
4、public
public
,公共的,允许跨包访问。
同类 | 同包 | 不同包子类 | 不同包非子类 | |
---|---|---|---|---|
private | o | x | x | x |
default | o | o | x | x |
protected | o | o | o | x |
public | o | o | o | o |