关于修饰符

前言

由于经常忘记几个修饰符的作用,所以在这里统一记录下学过的相关修饰符

其实为什么要区分?

  • 到今天我才发现这些修饰符的声明范围是有限定的,比如 protected 还有 private , 你有见过他用在最外层的类声明上吗?
  • 当做一次学习的总结,当做自己考自己,比如被 static 或者被 final 声明的成员或者说是变量,会在什么时候初始化?会放jvm运行时内存区的哪个位置?

java 的修饰符

类修饰符

public: 公共类,可以被任何对象访问,不管是包内包外,使用最为广泛的一个修饰符

abstract: 抽象类,如果类里面包含一个或多个抽象方法的话,就必须把它定义为抽象类,注意,类里面可以有成员/属性。 反过来,如果类里面没有抽象方法,可以把它定义为抽象类吗?其实是可以的,但是并没有什么必要,因为抽象类的出现就是为了让它的子类能够实现它定义的抽象方法,其实侧面上体现了多态的思想。

java 面试问的最多的问题是 abstract 类和 interface 的区别是什么啊?在这里我简单说明一下

  1. abstract 类是可以有 default 的方法的,在 jdk8 之前呢,interface 是不允许有 default 方法的,但是以后却允许存在。
  2. 在继承上,一个是 class, 只允许单继承( extends );一个是 interface, 可以多继承( implements )。同时,继承之后呢,子类继承 abstract 只需要实现它的 abstract 方法,但是 interface 要实现除了 default 以外的所有方法
  3. 由于 abstract 用来修饰 class,所以它可以有构造方法。
  4. 方法声明上,abstract 方法可以用 public 和 protected 修饰

final: 最终类,这种类无法被其他类继承,经典例子就是 java 中的 String 了,有好多与 String 相关的问题,归根结底都是由于这个修饰符造成的。

friendly: 称为友元类,注意,这种类日常开发中用的比较少,我也是今天才知道,原来这种类只有在同一个 package 才能访问。

成员变量修饰符

public: 公共成员,就是谁都能访问的

private: 私有成员,当前仅当当前类内部访问,外面是不可见的,当然,如果你用反射机制的话,还是能 get 出来的。

protected: 保护成员, 只有当前类或者子类访问,出现的意义就是担心子类会修改这个变量,但是我又不想让其他类访问,所以就出现了这么一个修饰符。

friendly: 这个用的也比较少,可访问的范围也是当前 package 中的所有类。

final: 一锤定音,常量,一旦初始化这种变量的值之后不能修改,否则会出现编译错误。常量成员会存放在运行时的方法区内,里面有个常量池,专门放常量。如果常量是基本类型,就放值,这个时候值不可变,如果是引用,就放引用的地址,引用的地址不可变(但是引用指向的内存是可以发生变化的)。

static: 静态变量,在一个类加载的时候就会被初始化到 jvm 里面的方法区内。刚找网上的博客,说是会放到称为静态域的地方,我想应该就是在方法区内,同时据那博客说,静态成员的位置是固定的,所以称为静态,详细参考:内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)

static 变量具体加载和赋值的时间: 静态变量会经过两个过程,首先是默认初始化,基本数据类型默认的初始值是0,引用类型是null, 接着再进一步初始化,这个时候的初始化是根据父类先行策略进行的。

transient: 过度修饰符,当对象存储时,它的值不需要维持。被该修饰符修饰的变量不会参与对象的序列化操作。(也是今天才知道)

volatile: 被该修饰符修饰的变量,一旦值发生改变,则马上写入中,以保证成员的可见性。volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作。比如线程A改了这个变量的值,他会保证后面在线程B访问这个值的时候一样的。仅此而已,如果B先读,然后A再写,则无法保证B读到的和A写入的是一样的。它只保证可见性,不保证原子性。详细参考:Java并发编程:volatile关键字解析

方法修饰符

public: 这个就不再细说了,跟上面的一样

private: 同样跟上面的一样

protected: 同上

final: 说明该方法无法被重载

static: static方法可以被类直接调用,首先在类加载中的-连接(解析) 中,把方法名转换内存地址,放入到方法去里面的method_info表中,具体参考:java中类加载与静态变量、静态方法与静态代码块详解与初始化顺序

synchronized: 同步方法,只有 synchronize 修饰的方法,锁对象是当前类实例对象,而 static synchronzie 的话,锁的对象是 java.lang.Class 实例。

native: 表示本地方法,就是指程序外部的方法。

default: 默认方法,常出现在接口的方法或者抽象类中,里面可以有方法体。

abstact: 抽象方法,父类只有声明,子类必须实现。

C# 的修饰符

类修饰符

public: 公共类,可以被任何对象访问,不管是包内包外,使用最为广泛的一个修饰符

abstract: 抽象类,如果类里面包含一个或多个抽象方法的话,就必须把它定义为抽象类,注意,类里面可以有成员/属性。 反过来,如果类里面没有抽象方法,可以把它定义为抽象类吗?其实是可以的,但是并没有什么必要,因为抽象类的出现就是为了让它的子类能够实现它定义的抽象方法,其实侧面上体现了多态的思想。

partial: 部分修饰符,这种类会在编译的时候合并成一个类,他只可以写在同一个程序集中

internal: 称为内部类,这种类只有在同一个程序集内可以访问。跟 java 的 friendly 有点像

sealed: 密封类,跟 java 的 final 类似,一旦声明,则该类无法被继承

static: 静态类,只会初始化一次的类,里面的属性,方法成员都只能是 static

成员变量修饰符

public: 公共成员,就是谁都能访问的

private: 私有成员,当前仅当当前类内部访问,外面是不可见的,当然,如果你用反射机制的话,还是能 get 出来的。

protected: 保护成员, 只有当前类或者子类访问,出现的意义就是担心子类会修改这个变量,但是我又不想让其他类访问,所以就出现了这么一个修饰符。

internal: 这个用的也比较少,可访问的范围也是当前程序集中的所有类。

sealed: 一锤定音,常量,一旦初始化这种变量的值之后不能修改,否则会出现编译错误。同样,如果常量是基本类型,就放值,这个时候值不可变,如果是引用,就放引用的地址,引用的地址不可变(但是引用指向的内存是可以发生变化的)。

static: 静态变量,在编译时就会初始化的变量。

readonly: 表示该字段为只读字段。readonly是运行时只读,内容在运行时确定,所以修改了readonly类型成员后无需重新编译即可生效,Readonly不能修饰局部变量。

const: 表示该字段为只读字段。const修饰的字段在编译时必须能够明确知道该字段的值,其值是硬编码到程序中去的,修改了该类型成员后需要重新编译才能使修改生效,const可以修饰局部变量。其实就是常量。

方法修饰符

public: 这个就不再细说了,跟上面的一样

private: 同样跟上面的一样

protected: 同上

sealed: 说明该方法无法被重载

static: static方法可以被类直接调用

abstact: 抽象方法,父类只有声明,子类必须实现。

virtual: 虚方法,可以有方法体,有点像 java 里面的 default 方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值