文章目录
关于Java语言中的关键字
1.this关键字
- this是一个关键字,翻译为:这个
- this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存Java对象内部
- 创建100个Java对象,每一个对象都有this,也就是说有100个不同的this
- 没有static关键字的方法被称为“实例方法”。实例方法访问“引用.”;没有static关键字的变量被称为“实例变量”
- 带有static关键字的方法是通过类名的方式进行访问的
- 【注意】当一个行为/动作执行的过程中是需要对象参与的,那么这个方法一定要定义为“实例方法”。不要带static关键字
- this可以出现在“实例方法”当中,this指向当前正在执行这个动作的对象(this代表当前对象)
- this在多数情况下都是可以省略不写
- this不能使用在带有static的方法中
- 在带有static的方法中不能“直接”访问实例变量和实例方法,因为实例变量和实例方法都需要对象的存在。而static的方法中是没有this的,也就是说当前对象不存在的,自然也无法访问当前对象的实例变量和实例方法
- 实例变量和实例方法本身带有this
- 用来区分局部变量和实例变量的时候“this.”不能省略
- this可以用在哪里:
- 可以使用在实例方法中,代表当前对象【语法格式:this.】
- 可以使用在构造方法中,通过当前的构造方法调用其它的构造方法【语法格式:this(实参);】
- 【重点】: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!");
}
}
-
什么时候程序运行的时候出现空指针异常
空引用访问实例相关的数据,因为实例相关的数据就是对象相关的数据,这些数据在访问的时候,必须有对象的参与,当空引用的时候,对象不存在,访问这些实例数据一定会出现空指针异常。
2.static关键字
-
static修饰的方法是静态方法,static修饰的变量是静态变量
-
静态变量在类加载的时候初始化,不需要创建对象,内存就开辟了。访问的时候不需要创建对象,直接使用“类名.静态变量名”的方式访问
-
静态变量存储在方法区内存中
-
什么时候成员变量声明为实例变量:
所有对象都有这个属性,但是这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同】
-
什么时候成员变量声明为实例变量:
所有变量都有这个属性,并且所有对象的这个属性的值是一样的,建议定义为静态变量,节省内存的开销
2.1静态代码块
-
语法格式:
static{
Java语句;
}
- 静态代码块在类加载时执行,并且只执行一次
- 静态代码块在一个类中可以编写多个,并且遵循自上而下的顺序依次执行
- 静态代码块的作用:静态代码块是Java为程序员准备一个特殊的时刻,这个特殊时刻被称为类加载时刻。若希望在此刻执行一段特殊的程序,这段程序可以直接放到静态代码块当中。
- 通常在静态代码块当中完成预备工作,先完成数据的准备工具,例如:初始化连接池,解析XML配置文件……
2.2实例语句块
- 实例代码块可以编写多个,也是遵循自上而下的顺序依次执行的
- 实例代码块在构造方法执行之前执行,构造方法执行依次,实例代码块对应执行一次
- 实例代码块也是Java语言为程序员准备一个特殊的时机,这个特殊时机被称为:对象初始化时机
2.3方法什么时候定义为静态
方法描述的是动作,当所有的对象执行这个动作的时候,最终产生影响是一样的,那么这个动作已经不再属于某一个对象动作了,可以将这个动作提升为类级别的动作,模板级别的动作。
- 静态方法中无法直接访问实例变量和实例方法。
- 大多数“工具类”中的方法都是静态方法,
3.super关键字
3.1super和this对比着学习
this:
- this能出现在实例方法和构造方法中
- this的语法是:“this.”、“this()”
- this不能使用在静态方法中
- this.大部分情况下是可以省略的,在区分局部变量和实例变量的时候不能省略
- this()只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其它的构造方法,目的是:代码复用
super:
- super能出现在实例方法和构造方法中
- super的语法是:“super.”、“super()”
- super不能使用在静态方法中
- super.大部分情况下是可以省略的,在区分局部变量和实例变量的时候不能省略
- super()只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的构造方法,目的是:创建子类对象的时候,先初始化父类型特征
3.2 super()
表示通过子类的构造方法调用父类的构造方法
【重要结论】当一个构造方法第一行:既没有this()又没有super()的话,默认会有一个super();表示通过当前子类的构造方法调用父类的无参数构造方法。所以必须保证父类的无参数构造方法是存在的。
super()和 this()不能共存,它们都是只能出现在构造方法的第一行
无论怎样,父类的构造方法是一定会执行的
【注意】写代码的时候,一个类的无参数构造方法还是建议手动的写出来。如果无参数构造方法丢失的话,可能会影响到子类对象的创建
注意:在构造方法执行过程中一连串调用了父类的构造方法,父类构造方法又继续向下调用它的父类的构造方法,但是实际上对象只创建了一个。
- super(实参)的作用是:初始化当前对象的父类型特征,并不是创建新对象,实际对象只创建了一个
3.3super关键字代表
super关键字代表的就是“当前对象”的那部分父类型特征。
-
假设子类也有一个同名属性,Java中允许在子类中出现和父类一样的同名变量/同名属性
-
Java是怎么来区分子类和父类的同名属性的
this.name :当前对象的name属性
super.name :当前对象的父类型特征中的name属性
-
“ this.”和“super.”大部分情况下都是可以省略的
-
this.什么时候不能省略:
public void setName(String name){
this.name = name ;
}
-
super.什么时候不能省略
父中有,子中又有,如果想在子中访问“父的特征”, super. 不能省略
-
在父和子中有同名的属性,或者说有相同的方法。如果此时想在子类中访问父中的数据,必须使用“ super. ”加以区分
-
super. 属性名 【访问父类的属性】
super. 方法名(实参)【访问父类的方法】
super(实参)【调用父类的构造方法】
4.final关键字
- final关键字,表示最终的,不可变的
- final可以修饰变量以及方法,还有类等
- final修饰的类无法被继承
- final修饰的方法无法被覆盖
- final修饰的表示最后的,不能变的,不能改的。
- final修饰的方法一旦被赋值之后,不可重新赋值
- final修饰的引用,一旦指向某个对象之后,不能再指向其它对象,那么被指向的对象无法被垃圾回收器回收
- final修饰的引用虽然指向某个对象之后不能指向其它对象,但是所指向的对象内部的内存是可以被修改的
- 实例变量有默认值,final修饰的变量一旦赋值不能重新赋值
- 综合考虑,Java有传言最终规定实例变量使用final修饰之后,必须手动赋值,不能采用系统默认值 ,这个手动赋值,在变量后面赋值可以,在构造方法中赋值也可以。
5.常量
实际上常量和静态变量一样,都是储存在方法区,并且都是在类加载时初始化,区别在于:常量的值不能变
- final修饰的实例变量是不可变的,这种变量一般和static联合使用,被称为”常量“
- 常量定义的语法格式:public static final 类型 常量名 = 值 ;
- Java规范中要求所有常量的名字全部大写,每个单词之间使用下划线连接。例:GUO_JI
- 常量一般都是公开的