this
this是一个引用,是一个变量,存储在 JVM 堆内存 Java 对象内部
this指向当前正在执行这个动作的对象(this代表当前对象)
static(静态的)
- 有static:类级别特征
- 无static:对象级别特征
1. 访问方式
-
静态方法,带有static关键字,类名. 静态特征 访问 ,在同一个类中类名可省略
访问静态的数据不需要对象的存在,所有静态的数据都是可以采用类名.的方式访问,也可采用引用.访问(不建议),采用该方式访问,即使引用是null也不会出现空指针异常,因为访问静态的数据不需要对象的存在
public class Test001 { public static void main(String[] args) { Chinese.m1(); System.out.println(Chinese.country); Chinese c1 = new Chinese(); c1 = null;//即使引用是null也不会出现空指针异常 c1.m1(); System.out.println(c1.country); } } class Chinese{ //静态变量 static String country = "中国"; //静态方法 public static void m1(){ System.out.println("~Hello~"); } }
实例方法,不带static关键字,**引用. 实例特征 访问 ** -->需要new对象
2. 静态变量
静态变量在加载的时候初始化,不需要创建对象,内存就开辟了
-
静态变量存储在方法区内存当中
实例变量存储在堆内存当中
静态变量:所有对象都有这个属性,且属性值不变,这时可定义为静态变量,可节省内存的开销
实例变量:所有对象都有这个属性,但这个属性的值会随着对象的变化而变化
3. 静态代码块
static{
//语句块
}
在类加载的时候执行一段特殊的程序,这段程序可以直接放到静态代码块当中,只执行一次
4. 静态方法与实例方法的访问方式训练
public class Test{
//静态方法
public static void method01(){
//调用doSome方法
Test.doSome();
doSome(); /*类名可省略*/
//调用doOther方法
Test t = new Test();
t.doOther();
//访问country
System.out.println(Test.country);
System.out.println(country);/*类名可省略*/
//访问i
System.out.println(t.i);
}
//实例方法
public void method02(){
//调用doSome方法
Test.doSome();
doSome(); /*类名可省略*/
//调用doOther方法
this.doOther();
doOther();/*this可省略*/
//访问country
System.out.println(Test.country);
System.out.println(country);/*类名可省略*/
//访问i
System.out.println(this.i);
System.out.println(i);/*this可省略*/
}
/*注意method01与method02方法在调用实例方法doOther的异同点*/
/*提示:主方法在调用method02方法时需要new对象*/
//主方法
public static void main(String[] args){
//此处调用method01方法
Test.method01();
method01();/*类名可省略*/
//此处调用method02方法
Test t = new Test();
t.method02();
//访问country
System.out.println(Test.country);
System.out.println(country);/*类名可省略*/
//访问i
System.out.println(t.i);
}
//静态变量
static String country = "中国";
//实例变量
int i = 10;
//静态方法
public static void doSome(){
System.out.println("doSome!");
}
//实例方法
public void doOther(){
System.out.println("doOther!");
}
}
final
1. 语法
public static final 类型 常量名 = 值;
如:public static final double PI = 3.14159;
final修饰的实例变量是不可变的,这种变量一般和static联合使用,被称为“常量”
*java规范中要求所有常量名大写,且每个单词间使用下划线连接
2. 注意
- final修饰的类无法继承,修饰的方法无法被覆盖,修饰的实例变量不可二次赋值,所以不能采用系统默认值(
final
一旦指向某个对象则不可再更改,但是对象属性的值可以更改) - 修饰的引用一旦指向某个对象后不能再指向其他对象,指向的对象无法被垃圾回收器回收,但是所指向的对象的内存是可以被修改的