• Java修饰符是最直白的表述


    Java修饰符是让Java变得啰嗦的罪魁祸首之一。其他很多语言并没有这么多修饰符,取而代之的是语法规则,比如Python下划线开头的变量是私有变量,Golang小写字母开头的变量是私有变量。但是,正因为Java有着明确的修饰符,所以Java代码看起来是最直白的表述。

    修饰符概览

    Java修饰符有两大类,它们分别如下:

    访问控制修饰符

    • default(什么都不写)
    • private
    • public
    • protected

    非访问控制修饰符

    • static
    • final
    • abstract
    • synchronized
    • transient
    • volatile

    修饰符通常是放在一行代码最前面的,起到修饰作用,比如:

    public class ClassName {
       // ...
    }
    private boolean myFlag;
    static final double weeks = 9.5;
    protected static final int BOXWIDTH = 42;
    public static void main(String[] arguments) {
       // 方法体
    }
    

    访问控制修饰符

    访问控制,指的是对Java类、接口、变量、方法的访问权限的控制。我们知道Java每个文件是一个类(Class),每个文件夹是一个包(Package),它们彼此之间能不能相互访问,就是通过修饰符决定的。

    访问控制修饰符一览表,从上往下,访问权限越来越小:

    image-20210828224707518

    default

    什么都不写,不使用任何修饰符,默认为包访问权限,即同一个包内都是可以访问的

    Java有个很棒的设计:同一个包里面的类不需要import就能直接使用。

    示例:

    String version = "1.5.1";
    boolean processOrder() {
       return true;
    }
    

    private

    意思就像它的名字一样,私有的,只有当前类的内部才可以访问。private用来保护类的隐私,如果外部类想访问private的变量,那么只能通过public的getter方法暴露出去。需要注意的是,private可以用到变量、方法上,但是不能用到类和接口上(这么做没有意义,类总是要被外部调用的,接口总是要被外部实现的)。

    示例:

    public class Logger {
       private String format;
       public String getFormat() {
          return this.format;
       }
       public void setFormat(String format) {
          this.format = format;
       }
    }
    

    public

    公开的,所有都能访问,没有任何限制

    示例:

    public static void main(String[] arguments) {
       // ...
    }
    

    protected

    当前类可以访问,子类有可能可以访问。子类有两种情况:

    • 子类与父类在同一个包中:子类可以访问父类的protected。
    • 子类与父类在不同的包中:子类可以访问,非子类内部的子类实例不能访问。

    示例:

    package test1;
    
    
    public class Base {
        int defaultInt;
        protected int protectedInt;
    }
    
    // 不同的包
    package test2;
    
    
    // 子类
    public class Test extends Base {
        public void test(){       
             Test t = new Test();
             //t.defaultInt = 2; 不可见
             t.protectedInt = 3;
        }
    }
    
    
    // 非子类
    class TestNotSub{
        public void test(){
              Test t = new Test();
              //t.defaultInt = 2; 不可见
              //t.protectedInt = 3; 不可见
        }
    }
    

    需要注意的是,protected可以用到变量、方法上,但是不能用到类(内部类除外)和接口上。

    非访问控制修饰符

    static

    static用来修饰变量和方法。修饰的变量叫做静态变量/类变量,修饰的方法叫做静态方法或/类方法。

    静态的含义是,无论实例化多少个对象,静态变量或静态方法只有一份。作为类变量或类方法,static的用法是可以直接通过ClassName.varName访问类变量,或直接通过ClassName.methodName()访问类方法,无需实例化对象。

    需要注意的是,静态方法里面不能使用类的非静态变量。

    我以Python举例可以更好说明这一点,Python的类方法第一个入参是cls,如果想访问非类变量,那么入参必须是self。

    final

    • final修饰变量:通常和static一起用来声明常量,比如static final String TITLE = "Manager";
    • final修饰方法:父类的final方法可以被子类继承,但是不能被重写,防止该方法的内容被篡改。
    • final修饰:final类不能被继承。

    abstract

    • abstract修饰:抽象类。
    • abstract修饰方法:抽象方法。

    抽象意味着它们只定义了一个形式,没有具体内容,一定会由其他的类或方法进行具体实现。如果类中有抽象方法,那么这个类必须要定义为抽象类,否则会编译报错。

    synchronized

    用于修饰方法,这个方法同一时间只能被一个线程访问。

    transient

    修饰变量,用的很少,我也看不懂。

    volatile

    修饰变量,变量每次被线程访问时,都强制从共享内存中重新读取值,当变量发生变化时,会强制线程将变化值写入共享内存。这样两个线程在任何时候都能看到变量的同一个值。

    参考资料:

    https://www.runoob.com/java/java-modifier-types.html

    https://blog.csdn.net/qq_32635069/article/details/79837059


    所有文章公众号首发!
    如果你觉得这篇文章写的还不错的话,关注公众号“dongfanger”,你的支持就是我写文章的最大动力。

    版权申明:本文为博主原创文章,转载请保留原文链接及作者。
  • 相关阅读:
    el-cascader回显问题
    nuxt + ueditor国际化
    nuxt + element + i18n 国际化element(我用的i18n@8.x版本)
    CDH| 组件的使用-Flume| Kafka| Oozie基于Hue的任务调度
    CDH| Hive| Hue| Sqoop| Impala等组件安装部署
    CDH| 组件的安装-HDFS的配置 | Flume| Kafka|
    Flink| 实时需要分析
    Flink| 状态一致性
    Flink| 容错机制
    Flink| 第一个窗口触发时间
  • 原文地址:https://www.cnblogs.com/df888/p/15203863.html
Copyright © 2020-2023  润新知