Java关键字


Java一共有53个关键字(其中包含两个保留字const,goto)

**** **** **** **** ****
abstract assert boolean break byte
case catch char class const
continue default do double else
enum extends final finally float
for goto if implements import
instanceof int interface long native
new package private protected public
return strictfp short static super
switch synchronized this throw throws
transient try void volatile while
true false null

整理了几个常用的关键字

1.static

static关键字最基本的用法是
1)被static修饰的变量可以通过<类名.变量名>直接引用,不需要实例化类
2)被static修饰的方法可以通过<类名.变量名>直接引用,不需要实例化类

public class User {
    public static void run(){
        System.out.println("跑步");
    }

    public static void main(String[] args) {
        User.run();//输出:跑步
    }
}
  1. 当 static修饰代码块时,静态块里的代码只执行一次
public class User {
    public static void main(String[] args) {
        System.out.println("第一次:");
        Foo foo = new Foo();
        System.out.println("第二次:");
        Foo foo2 = new Foo();
    }
}

class Foo{
    //代码块,在创建对象的时候执行
    {
        System.out.println("这是一个代码块");
    }

    //静态代码块,在类加载期间执行,只运行一次,用于加载配置文件等信息
    static {
        System.out.println("这是一个静态代码块");
    }

    public Foo(){
        System.out.println("调用了构造器");
    }
}

输出结果为

第一次:
这是一个静态代码块
这是一个代码块
调用了构造器
第二次:
这是一个代码块
调用了构造器

顺便讲讲Java对象初始化过程:
第一步,加载类,一个java对象在初始化前会进行类加载,在JVM中生成Class对象。加载一个类会进行如下操作

(如果该类有父类,则先加载其父类)  
1)初始化该类静态成员
2)执行该类静态代码块

第二步,创建对象
如果该类有父类,先创建父类的对象
1)初始化该类普通成员。  
2)执行普通代码块
3)调用该类构造方法

2.final

1)被final修饰的类不可以被继承
2)被final修饰的方法不可以被重写
3)被final修饰的变量不可以被改变(这里不可改变的是变量的引用,而不是变量指向的内容

public class User {
    private String name;

    public User(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        final User user = new User("张三");//初始化name
        user.setName("李四");
        System.out.println(user.getName());//输出:“李四”
                                           //说明改变变量指向的内容没问题
    }
}
改变变量的引用时,将无法编译

3.finally

finally是try语句中的一个语句体,用来释放资源,不能单独使用。不管try块内的语句是否发出异常,finally块内的代码总会执行

问:当try、catch、finally带有return语句时,代码和return语句的执行顺序?
3.1 try 中带return
public static int testEx() throws Exception{
        int i = 1;
        try {
            i++;
            System.out.println("try:" + i);
            return i;
        }catch (Exception e){
            i++;
            System.out.println("catch:" + i);
        }finally {
            i++;
            System.out.println("finally:" + i);
        }
        return i;
    }

输出结果为

try:2
finally:3
2

当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。所以,这里方法返回的值是try中计算后的2,而非finally中计算后的3。
但是,值得注意的是:

public  static List<Integer> testEx(){
        List<Integer> list = new ArrayList<>();
        try{
            list.add(1);
            System.out.println("try:" + list);
            return list;
        }catch (Exception e){
            list.add(2);
            System.out.println("catch:" + list);
        }finally {
            list.add(3);
            System.out.println("finally:" + list);
        }
        return list;
    }

输出结果为

try:[1]
finally:[1, 3]
[1, 3]

为什么上面的try中返回的是try中return语句之前的值,而这段代码的return返回的是finally语句的值呢?
因为上段代码使用的是基本类型;这段代码中使用的是引用类型,list里面存的不是变量的值而是变量的地址,而finally语句通过地址改变了变量的值

3.2 catch中带return
public static int testEx(){
        int i = 1;
        try {
            i++;
            System.out.println("try:" + i);
            int j = i/0;
        }catch (Exception e){
            i++;
            System.out.println("catch:" + i);
            return i;
        }finally {
            i++;
            System.out.println("finally:" + i);
        }
        return i;
    }

输出结果为

try:2
catch:3
finally:4
3

这里return与其在try中的一样,都要先执行return之前的代码,然后暂时保存需要的return信息,最后通过return返回之前保存的信息

3.3 finally中带return
private static int testEx(){
        int i = 1;
        try {
            i++;
            System.out.println("try:" + i);
            return i;
        }catch (Exception e){
            i++;
            System.out.println("catch:" + i);
            return i;
        }finally {
            i++;
            System.out.println("finally:" + i);
            return i;
        }
    }

输出结果为

try:2
finally:3
3

当finally中有return语句时,前面try和catch中的return语句都不会执行。但是不推荐在finally中写return语句,这会破坏程序的完整性,会导致catch中的异常被覆盖
总结:
1)finally中的代码总会被执行
2)当try、catch中有return时,也会执行finally。return的时候,要注意返回值的类型,是否受到finally中代码的影响
3)finally中有return时,会直接在finally中退出,导致try、catch中的return失效。

4. this

4.1 this调用当前属性

当需要给类中的数据进行初始化时,可以通过this来进行赋值,而不用随便定义一个变量来进行赋值,更有利于代码的阅读与理解

public class Person {
    private String name;
    private int age;


    //使用this对Person类数据初始化
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    /*
    * 若不使用this关键字只能这样进行赋值:
    *
    * public Person(String n,int a){
    *      name = n;
    *      age = a;
    * }
    *
    * */

    public static void main(String[] args) {
        Person person = new Person("张三",10);
        System.out.println("姓名:" + person.name);
        System.out.println("年龄:" + person.age);
    }
}

输出结果为

姓名:张三
年龄:10
4.2 this调用方法(普通方法、构造方法)

1) 普通方法

public class Person {
    private String name;
    private int age;


    //使用this对Person类数据初始化
    public Person(String name,int age){
        this.name = name;
        this.age = age;
        this.run();
    }

    public void run(){
        System.out.println("跑步");
    }

    public static void main(String[] args) {
        Person person = new Person("张三",10);
        System.out.println("姓名:" + person.name);
        System.out.println("年龄:" + person.age);
    }
}

输出结果为

跑步
姓名:张三
年龄:10

2) 构造方法
普通方法在创建后可以多次调用;而构造方法创建后只能调用一次

 //无参构造器
    public Person(){
        System.out.println("这是一个人");
    }

    //一参构造器
    public Person(String name){
        this();//这里调用了无参构造器
        this.name = name;
    }

    //二参构造器
    public Person(String name,int age){
        this(name);//这里调用了一参构造器
        this.age = age;
    }

注:对this调用必须放在构造方法中的第一行,否则会出错

5. 4种访问修饰符public、protected、default(无修饰符、默认)、private

访问权限如下

访问权限 同一包 子类 不同包
public ×
protect ×
default × ×
private × × ×
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,362评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,577评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,486评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,852评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,600评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,944评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,944评论 3 447
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,108评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,652评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,385评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,616评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,111评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,798评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,205评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,537评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,334评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,570评论 2 379