java常用关键字理解(持续更新)

访问权限修饰符

1、private修饰词,表示成员是私有的,只有自身可以访问;(外部类只能由public或者什么都不写采取默认值(public表示所有类都能访问,默认值表示同一个包中的类能访问),其后可以跟abstract以及final修饰,内部类与外部类的区别是static能修饰内部类却不能修饰外部类。其他的都可以,例如java.lang.String类被public final修饰
2、protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员,同时相同包内的其他类也可以访问protected成员。
3、无修饰词(默认),表示包访问权限,同一个包内可以访问。
4、public修饰词,表示成员是公开的,所有其他类都可以访问,一个.java文件只能包含一个public类,但可以包含多个非public类。

非访问修饰符

1、static其修饰的变量和方法叫做静态变量和静态方法,也叫类变量/方法,属于类本身。所有实例都能调用静态变量和静态方法。反之,实例变量和实例方法绑定于类的某个实例,只能由实例来调用,不对外共享,因为对象是唯一的。

static注意点:

    

      在类被加载的时候,就会去加载被static修饰的部分。

      静态可以访问静态的,但是静态不能访问非静态的。非静态的可以去访问静态的。

      调用静态变量和静态方法时,只需要类名.静态变量/静态方法。使用对象也可以调用,但这样做不规范。

      static能修饰的类只有内部类,也叫作静态内部类,地位等同于外部类的静态变量。

      static不能修饰局部变量,因为作用域仅限于所处的块,而static本身的功能相违背且不允许。

     在静态方法中,例如main()方法,不能使用this(this是建立在对象的基础上)和super(super代表对父类对象的引用

)关键字来访问实例变量和调用方法,静态方法加载是在类加载的时候,对象还没有创建,所以会报错。若要调用实例变量,则需要实例化一个对象。静态方法常用于工具类和辅助方法。

      静态代码块在类加载时调用,并且只调用一次,并且任何方法都不能含有静态代码块。普通方法依赖于实体对象,静态方法是被动调用,而静态代码块是主动调用。(静态代码块,非静态代码块也称构造代码块,构造方法。执行顺序静态代码块>构造代码块>构造函数>普通代码块 )

final

final可修饰变量、方法和类,一旦被final修饰,该变量就不能改变值或是改变其引用。编译器会检查代码,试图更改时编译器会报错。

final注意点:

  • final修饰的方法不能被重写,final修饰的类也不允许被继承,final修饰的类为不可变类。
  • 修饰变量时,都是当成常量来用,通常和static关键字配合使用,而且常量最好使用全大写。

为什么要和static一起使用呢?通过两种常量来说明一下两者区别

public final int A = 10;         //A为实例常量
public final static int B = 100; //B为静态常量
//实例常量伴随对象的创建而生成,运行完成后即被销毁,频繁创建和销毁非常浪费内存空间。
//而静态常量(全局常量)随着类的初始化就存储在JVM开辟的常量池中,使用之后也不会被回收,直到程序结束。
//所以如果有数字或者字符串被多次反复使用时,可以用final static来修饰。

 final修饰的优点  

  • final关键字可以提高性能,JVM和Java应用都会缓存final变量。 
  • final修饰后,编译时就进行静态绑定,不需要在运行时在动态绑定。
  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。 使用final关键字,JVM会对方法、变量及类进行优化。
  • final修饰类则是不可变类。不可变类的实例创建后,该实例的内容无法被改变。String是不可变类的代表。
  • 不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

abstract

  1. abstract只能修饰类和方法,称为抽象类和抽象方法,定义抽象类的唯一目的就是子类对该类进行扩展重写,抽象方法必须实现。
  2. 一个类不能同时被 abstract 和 final 修饰,因为理念冲突。
  3. 抽象类不能实例化对象,因为抽象方法没有方法体,所以抽象类实例无法调用方法,实例化无意义。
  4. 若类中包含抽象方法,则该类必须声明为抽象类,否则将出现编译错误。
  5. 抽象类可以没有抽象方法
  6. 抽象类中能同时声明抽象方法和普通方法,相当于普通类和接口的中间层,类似半成品。
  7. .抽象类可以有构造函数,当被继承的时候,子类会用super()调用父类的构造函数
  8. 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们

synchronized

       修饰方法作为同步方法,则在同一时间该方法只能被一个线程所访问,别的线程将阻塞。修饰方法可以隐式传入同步监视器对象。作为同步代码块,示例如下:

//需要显式传入同步监视器对象    
synchronized(Object obj) {
   //需要同步的代码...
}

 

volatile

        volatile的作用和synchronized一样,都是为了保证线程安全,但如果只是为了保证一两个成员变量的使用安全,使用synchronized开销太大。volatile修饰的成员变量每次被线程访问时,都会强制从共享内存中重新读取该成员变量的值。而且,当成员变量值改变时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量变化的值。

 

transient

       运用在对象序列化中,当对某个对象进行序列化(转换成二进制存储在硬盘中),有些私有信息不想被序列化时,就用transient去修饰,transient表示透明化的,作用就如其名,序列化时就会忽略掉该信息。注意:类要实现序列化需要实现Serializable接口,该接口没有任何方法,仅仅作为序列化的标识。

native

1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。

2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的

主要是因为JAVA无法对操作系统底层进行操作,但是可以通过jni(java native interface)调用其他语言来实现底层的访问。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值