关于Java语言中的关键字

关于Java语言中的关键字

1.this关键字

  1. this是一个关键字,翻译为:这个
  2. this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存Java对象内部
  3. 创建100个Java对象,每一个对象都有this,也就是说有100个不同的this
  4. 没有static关键字的方法被称为“实例方法”。实例方法访问“引用.”;没有static关键字的变量被称为“实例变量”
  5. 带有static关键字的方法是通过类名的方式进行访问的
  6. 【注意】当一个行为/动作执行的过程中是需要对象参与的,那么这个方法一定要定义为“实例方法”。不要带static关键字
  7. this可以出现在“实例方法”当中,this指向当前正在执行这个动作的对象(this代表当前对象)
  8. this在多数情况下都是可以省略不写
  9. this不能使用在带有static的方法中
  10. 在带有static的方法中不能“直接”访问实例变量和实例方法,因为实例变量和实例方法都需要对象的存在。而static的方法中是没有this的,也就是说当前对象不存在的,自然也无法访问当前对象的实例变量和实例方法
  11. 实例变量和实例方法本身带有this
  12. 用来区分局部变量和实例变量的时候“this.”不能省略
  13. this可以用在哪里:
    1. 可以使用在实例方法中,代表当前对象【语法格式:this.】
    2. 可以使用在构造方法中,通过当前的构造方法调用其它的构造方法【语法格式:this(实参);】
    3. 【重点】:this()这种语法只能出现在构造函数第一行
package test02;

public class Test02 {

//    带有static的方法
    public static void method1(){
/*
调用dosome方法
完整方式调用
省略方式调用
* */
        Test02.doSome();
        doSome();

     /*
调用doother方法
完整方式调用
省略方式调用
* */
        Test02 t = new Test02();
        t.doOther();

//        访问i
        System.out.println(t.i);
    }
//    没有static的方法
public void method2(){
/*
调用dosome方法
完整方式调用
省略方式调用
* */
    Test02.doSome();
    doSome();

    /*
调用doother方法
完整方式调用
省略方式调用
* */
    this.doOther();
    doOther();

    //        访问i
    System.out.println(this.i);
    System.out.println(i);

}

//    主方法
    public static void main(String[] args){
//        在这里调用method1
        Test02.method1();
        method1();
        //        在这里调用method2
        Test02 k = new Test02();
        k.method2();

    }
//    没有static的变量
    int i = 10 ;
//    带有static的方法
    public static void doSome(){
        System.out.println("do some!");
    }
    //    没有static的方法
    public void doOther(){
        System.out.println("do other!");
    }
}

  1. 什么时候程序运行的时候出现空指针异常

    空引用访问实例相关的数据,因为实例相关的数据就是对象相关的数据,这些数据在访问的时候,必须有对象的参与,当空引用的时候,对象不存在,访问这些实例数据一定会出现空指针异常。

2.static关键字

  1. static修饰的方法是静态方法,static修饰的变量是静态变量

  2. 静态变量在类加载的时候初始化,不需要创建对象,内存就开辟了。访问的时候不需要创建对象,直接使用“类名.静态变量名”的方式访问

  3. 静态变量存储在方法区内存中

  4. 什么时候成员变量声明为实例变量:

    ​ 所有对象都有这个属性,但是这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同】

  5. 什么时候成员变量声明为实例变量:

    ​ 所有变量都有这个属性,并且所有对象的这个属性的值是一样的,建议定义为静态变量,节省内存的开销

2.1静态代码块

  • 语法格式:

    static{

    ​ Java语句;

 }
  • 静态代码块在类加载时执行,并且只执行一次
  • 静态代码块在一个类中可以编写多个,并且遵循自上而下的顺序依次执行
  • 静态代码块的作用:静态代码块是Java为程序员准备一个特殊的时刻,这个特殊时刻被称为类加载时刻。若希望在此刻执行一段特殊的程序,这段程序可以直接放到静态代码块当中。
  • 通常在静态代码块当中完成预备工作,先完成数据的准备工具,例如:初始化连接池,解析XML配置文件……

2.2实例语句块

  • 实例代码块可以编写多个,也是遵循自上而下的顺序依次执行的
  • 实例代码块在构造方法执行之前执行,构造方法执行依次,实例代码块对应执行一次
  • 实例代码块也是Java语言为程序员准备一个特殊的时机,这个特殊时机被称为:对象初始化时机

2.3方法什么时候定义为静态

方法描述的是动作,当所有的对象执行这个动作的时候,最终产生影响是一样的,那么这个动作已经不再属于某一个对象动作了,可以将这个动作提升为类级别的动作,模板级别的动作。

  • 静态方法中无法直接访问实例变量和实例方法。
  • 大多数“工具类”中的方法都是静态方法,

3.super关键字

3.1super和this对比着学习

this:

  1. this能出现在实例方法和构造方法中
  2. this的语法是:“this.”、“this()”
  3. this不能使用在静态方法中
  4. this.大部分情况下是可以省略的,在区分局部变量和实例变量的时候不能省略
  5. this()只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其它的构造方法,目的是:代码复用

super:

  1. super能出现在实例方法和构造方法中
  2. super的语法是:“super.”、“super()”
  3. super不能使用在静态方法中
  4. super.大部分情况下是可以省略的,在区分局部变量和实例变量的时候不能省略
  5. super()只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的构造方法,目的是:创建子类对象的时候,先初始化父类型特征

3.2 super()

表示通过子类的构造方法调用父类的构造方法

【重要结论】当一个构造方法第一行:既没有this()又没有super()的话,默认会有一个super();表示通过当前子类的构造方法调用父类的无参数构造方法。所以必须保证父类的无参数构造方法是存在的。

super()和 this()不能共存,它们都是只能出现在构造方法的第一行

无论怎样,父类的构造方法是一定会执行的

【注意】写代码的时候,一个类的无参数构造方法还是建议手动的写出来。如果无参数构造方法丢失的话,可能会影响到子类对象的创建

注意:在构造方法执行过程中一连串调用了父类的构造方法,父类构造方法又继续向下调用它的父类的构造方法,但是实际上对象只创建了一个。

  • super(实参)的作用是:初始化当前对象的父类型特征,并不是创建新对象,实际对象只创建了一个

3.3super关键字代表

super关键字代表的就是“当前对象”的那部分父类型特征。

  1. 假设子类也有一个同名属性,Java中允许在子类中出现和父类一样的同名变量/同名属性

  2. Java是怎么来区分子类和父类的同名属性的

    ​ this.name :当前对象的name属性

    ​ super.name :当前对象的父类型特征中的name属性

  3. “ this.”和“super.”大部分情况下都是可以省略的

  4. this.什么时候不能省略:

    ​ public void setName(String name){

    ​ this.name = name ;

    ​ }

  5. super.什么时候不能省略

    父中有,子中又有,如果想在子中访问“父的特征”, super. 不能省略

  6. 在父和子中有同名的属性,或者说有相同的方法。如果此时想在子类中访问父中的数据,必须使用“ super. ”加以区分

  7. super. 属性名 【访问父类的属性】

    super. 方法名(实参)【访问父类的方法】

    super(实参)【调用父类的构造方法】

4.final关键字

  1. final关键字,表示最终的,不可变的
  2. final可以修饰变量以及方法,还有类等
  3. final修饰的类无法被继承
  4. final修饰的方法无法被覆盖
  5. final修饰的表示最后的,不能变的,不能改的。
  6. final修饰的方法一旦被赋值之后,不可重新赋值
  7. final修饰的引用,一旦指向某个对象之后,不能再指向其它对象,那么被指向的对象无法被垃圾回收器回收
  8. final修饰的引用虽然指向某个对象之后不能指向其它对象,但是所指向的对象内部的内存是可以被修改的
  9. 实例变量有默认值,final修饰的变量一旦赋值不能重新赋值
  10. 综合考虑,Java有传言最终规定实例变量使用final修饰之后,必须手动赋值,不能采用系统默认值 ,这个手动赋值,在变量后面赋值可以,在构造方法中赋值也可以。

5.常量

实际上常量和静态变量一样,都是储存在方法区,并且都是在类加载时初始化,区别在于:常量的值不能变

  1. final修饰的实例变量是不可变的,这种变量一般和static联合使用,被称为”常量“
  2. 常量定义的语法格式:public static final 类型 常量名 = 值 ;
  3. Java规范中要求所有常量的名字全部大写,每个单词之间使用下划线连接。例:GUO_JI
  4. 常量一般都是公开的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值