java权限修饰符

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不能用于修饰构造方法

为什么abstractstaticfinal都不能用于修饰构造方法?

构造方法本身是用于创建对象的方法,而用abstract类中的方法声明,子类进行方法实现,使用abstract后子类则无法实现构造方法。若使用static修饰构造方法,static修饰变量或代码块本身在类加载过程中就已被加载到方法区或常量池(JDK1.8中字符串常量池和运行时常量池逻辑上属于方法区,但是实际存放在堆内存中,因此既可以说两者存放在堆中,也可以说两者存在于方法区中),且静态变量或方法可直接使用无需创建对象引用,而构造方法需要在创建对象时调用。final修饰方法,目的在于方法不能被子类重写,而构造方法本身就只能被子类继承而不能被重写,所以使用final修饰构造方法=脱裤子放屁。

2. static

  • static修饰成员变量和成员方法为静态全局变量,又称类变量。

  • 即便没有static声明,类的构造器方法也是静态方法。
    在这里插入图片描述

  • static修饰的变量或代码块,在类加载的准备阶段就会被创建并在方法区分配内存;而实例变量则会在对象实例化时被分配到堆中。因此静态变量或方法的访问不需要实例化对象,可直接访问,且static代码块或方法中不能包含非静态变量或方法。

java的类加载机制会在后续文章做详细说明

3.static final

  • static final修饰的方法或变量为全局变量或全局常量,不可修改或重写,且可直接访问。当变量类型为引用类型(如ArrayListHashMap等)时,地址不可更改,但可以改变其属性或内容。

二、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,公共的,允许跨包访问。

同类同包不同包子类不同包非子类
privateoxxx
defaultooxx
protectedooox
publicoooo
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值