老白带你学java基础 – 被遗忘的java 关键字

1, 什么是java关键字

Java语言中有一些具有特殊用途的单词被称为关键字(keyword),用来表示一种数据类型,或者表示程序的结构等。对Java的编译器有特殊的意义。

2, Java关键字分类有哪些

2.1 访问控制

private,default,protected,public

2.2 类,方法和变量修饰符

abstract,class,extends,final,implements,interface,native,new,static,synchronized,transient,volatile

2.3 程序控制

break,continue,return,do,while,if,else,for,instance of,switch,case,default

2.4 异常处理

try,catch,throw,throws

2.5 包相关

import,package

2.6 基本类型

boolean,byte,char,double,float,int,long,short,null,true,false

2.7 变量引用

super,this,void

2.8 保留字

goto,const

3,关键字详解

这里将着重介绍日常编码和开源代码中常用的的关键字,帮助大家更好的去理解和应用

3.1 super 与 this 关键字

这对关键字往往用在类之间扩展以及调用关系上,在组织代码结构以及层次关系上经常会遇到

先总结一下 super和this的区别点,分别从构造方法、属性、普通方法来解释:

1, 从属性上

this: 访问本类的属性,如本类中无定义,则从父类中找

super: 访问父类中的属性

2, 从方法上

this: 访问本类的方法,如本类中无定义, 则从父类中找

super: 访问父类中的方法

3, 从构造函数上

this: 调用本类构造,须放在构造方法首行

super: 调用父类构造,须放在子类构造方法首行

举例:

public class Father {

private String surname; //姓氏

private String name; //名

public Father(String surname,String name) {

this.setName(name);

this.setSurname(surname);

}

public String getName() {

return name;

}

public void setName(String name) {

this.name= name;

}

public String getSurname() {

return surname;

}

public void setSurname(String surname) {

this.surname= surname;

}

public String getInfo(){

return "姓:"+this.getSurname()+" 名:"+this.getName();

}

}

public class Son extends Father{

private String school; //定义新属性school

public Son(String surname, String name, String school) {

super(surname, name); //调用父类中的构造方法

this.school= school;

}

public String getSchool() {

return school;

}

public void set School(String school) {

this.school = school;

}

@Override

public String getInfo() { //覆写父类中的方法

return super.getInfo()+"学校:"+this.getSchool();

}

}

示例中,Son类中使用super(surname,name)方法,调用了Father中的father(surname,name)构造方法;Son中的getInfo()方法overWrite了Father中的getInfo()方法,其中不仅调用了父类的getInfo()方法,而且还引用自身的getSchool()方法;

3.2,final与static 关键字

很多同学会问final 与static 之间的联系和区别,这2 个关键字就像关公战秦琼一样,2个不同含义的概念非要融在一起看,然而在面试的时候,会经常提及到,这里做一下详述:

static:

用来修饰成员变量或成员方法;表示静态的。

理解static属性,先看它的内存分配情况:

在一个类中,一个static变量只会声明一个内存空间,如果这个类有多个实例,那么这些类实例中的这个static变量会共享同一个内存空间。

static的基本规则

static可以修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类);

static修饰的属性的初始化在类加载的时候,并且初始化后属性可以改变;

static修饰的属性强调所有对象都只有一个值,因为它们会共享内存空间;

static修饰的属性/方法/代码段无需先创建对象再调用,直接调用即可;

static不可以修饰局部变量, 因为违反了变量内存分配原则;

static修饰的常量,在多线程并发时候,可能会带来并发问题,因为多个线程可能更改统一内存空间的数据;

final

final表示的意思是最终,可以使用final关键字声明类、属性、方法,它是一种规则定义,使用final修饰的对象。

需要满足以下规则

· 使用final声明的类不能有子类

· 使用final声明的方法不能被子类覆写, 但可以被子类继承

· 使用final声明的变量即成为常量,常量不可修改

为什么要设计final类:

1,自定义常量,通常设置为final类型,表示此常量不再改变

2,限制继承重写的滥用,在代码结构设计中,往往有些父类方法往往可以满足所有子类需求,那么为了防止子类的重写,往往设置为final 类型

3.3,volatile 关键字

volatile 关键字用于表示可以被多个线程异步修改的成员变量。它具有可见性,也就是说线程能够自动发现volatile 变量的最新值,但不具备原子性。与 synchronized 块相比,volatile 只实现了 synchronized的部分功能;但是我们为什么还要使用volatile,尤其是在开源框架中大量使用呢?

主要原因是其简易性和性能,在某些情形下,使用volatile 变量要比使用锁简单得多,并且volatile 变量同步机制的性能要优于锁。volatile 操作不会像锁一样造成阻塞,因此,在能够安全使用volatile 的情况下,volatile 可以提供一些优于锁的可伸缩特性。如果读操作的次数要远远超过写操作,与锁相比,volatile 变量通常能够减少同步的性能开销。

使用场景:状态位控制

用volatile变量实现布尔状态标志的切换。

volatile boolean switch; // 声明开关

public void shutdown() { switch = true; }

public void doWork() {

while (!switch) {

// do action

}

在多线程环境下,很可能在另一个线程中调用 shutdown() 方法,因此, switch变量需要保持可见性。如果使用 synchronized 块编写循环要比上述volatile 状态标志实现复杂的多。

3.4 transient 关键字

transient 关键字只能修饰变量,而不能修饰方法和类,它规定该成员变量不能够被序列化。所以我们就可以选择性的对变量进行序列化,比如,在网络间传输一些敏感数据,如身份证号码,密码等,为了安全起见,可以采用transient进行非序列化。

public class Card implements Serializable{

private static final long serialVersionUID = 1L;

// 用transient修饰后password将不会进行序列化

private String cardNo;

public transient String password;

Card(String cardNo,String password) {

this.cardNo = cardNo;

this.password = password;

}

@Override

public String toString() {

return"cardNo="+ cardNo + ", password="+ password;

}

}

以上总结的几个常用关键字,往往是开源框架中经常使用到的,同时也是个大公司面试经常遇到的知识点,剩下的关键字内容笔者不再一一介绍,通过这篇文章给大家起到抛砖引玉的目的。


分享到:


相關文章: