static,this,final关键字在java中的含义和应用场景

this关键字
this 关键字主要有以下几种作用:

1:当类成员变量与局部成员变量重名时,可以用this 关键字把局部成员变量赋值给类成员变量 
2:this可以用来在构造函数中调用其他构造函数      //必须定义在构造函数中的第一行 
3:this调用本类中的其他方法,this通常省略

下面就通过一段代码对上面的用法做一个示例:

public class TestThis {
    public static void main(String[] args) {

        This thisDemo = new This("Jas");
        thisDemo.showName();
    }
}

class This{
    private String username;

    This(){
        System.out.println("nonparametric constructor run......");
    }

    This(String username){
        this();
        this.username = username;   
    }

    public void sayHello(){
        System.out.print("Hello" + "   ");
    }

    public void showName(){
        this.sayHello();    //this 可以省略
        System.out.println(username);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
输出 
nonparametric constructor run…… 
Hello Jas

在上面这个有一个无参构造器与一个有参构造器,通过有参构造器传入一个String 类型的username,在类中也定义了一个private 私有的变量username,当想要构造器中的username 值赋给私有变量username 时就需要使用this 关键字,如果你不使用this 关键字,会得到一个警告:“Variable ‘username’ is assigned to itself”,此时私有的属性 username 值为null。

通过上面的打印结果我们可以看出在创建有参构造对象时,无参构造函数被调用了,我们就是通过this 关键字完成的。如果你想在无参构造器中调用有参构造器只要在this() 中传入对应的参数就可以了。我们还可以通过使用this 关键字调用本类中其他的方法,但我们不必要这么做,因为编译器会自动为我们添加。

static关键字
static关键字有以下几种特点:

1.static是一个修饰符,用于修饰成员 
2.static修饰的成员变量被所有的对象共享 
3.static优先于对象的存在,因为static的成员变量随着类的加载就已经存在了 
4.实现共享,static修饰的类成员变量和类方法可以用类名直接调用 
5.static修饰的成员变量多了一种调用方式,可以直接被类名调用,类名.成员变量

类成员变量与静态变量的区别:

1.生命周期不同 
成员变量随着对象的创建而存在,随着对象的回收而释放 
静态变量随着类的加载而存在,随着类的消失而消失 
2.调用方式不同 
成员变量只能被对象调用 
静态变量可以被对象调用和类名调用 
3.别名不同 
成员变量也称为实例变量 
静态变量称为类变量 
4.数据存储位置不同 
成员变量存在堆内存的对象中,所以也叫对象的特有数据 
静态变量存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据

static 关键字使用的注意事项:(static 关键字修饰的变量并不是依赖于对象而存在,它依赖于类的存在而存在,所以在静态方法中你不能调用非静态方法(当然你也不能调用非静态变量),反过来却是可以的。)

1.静态方法只能访问静态成员。(非静态既可以访问静态又可以访问非静态) 
2.静态方法中不可以使用this和super关键字。(没有声明对象) 
3.主函数是静态的。(所以主函数只能访问当前类的静态方法)

静态代码块(存在于类中):

随着类的加载而运行,只执行一次 
作用: 
用于给类初始化 –> 类比: 构造函数给类对象初始化 
一般适用于成员都是静态变量的类中 
static{ }

现在总结一下static 主要的一些应用场景:当你想要一个变量被由该类导出的所有对象共享时,那么你可以将该变量定义为static 的,这样做可以减少堆内存的消耗。如果你想要一段代码随着类的加载只执行一次时(并不随着每个对象的创建都加载一次),那么你可以使用静态代码块,比如当我们想要加载一些配置文件的时候。

单例模式中恶汉式就是使用了静态变量,该变量只会在内存中创建一个对象。

class Person{
    private Person(){}
    Person static s = new Person();
    public static Person f(){
        return s;
    }
}
1
2
3
4
5
6
7
通过静态代码块加载配置文件。

private static Properties pro = null;

    //初始化文件资源
    static{
        pro = new Properties();
        try{
            pro.load(new FileReader(BasicFactory.class.getClassLoader().getResource("config.properties").getPath()));
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
1
2
3
4
5
6
7
8
9
10
11
final关键字
这里主要介绍final 的三种情况:修饰数据、方法和类

修饰数据和参数 
有的时候你希望告知编译器一些数据时恒定不变的,那么final 关键字修饰的变量就能帮你完成这个任务。

1.一个永不改变的编译期常量(被static 与 final 同时修饰) 
2.一个在运行时被初始化的值,而你却不想改变它

对于基本数据类型,final 使数值恒定不变;对于对象的引用,final 使引用恒定不变。一旦被初始化指定一个对象那么就无法再把它改为指向另一个对象。

final 修饰方法 
使用final 修饰方法的原因主要有两个:第一个原因是把方法锁定,以防止任何继承类修改它的含义(即:final 修饰的方法不可以被覆盖);另一个原因就是效率,如果一个方法被修饰为final 的,就是同意编译器将针对该方法的所有调用都转为内嵌调用。但是随着Java版本的更新,虚拟机可以检测到这种个情况,并优化去掉这些效率反而降低的额外的内嵌调用。所以现在只有在你明确禁止该方法被覆盖时,才会将该方法设置为final 的。

在这里提一下final 与private ,类中所有的private 方法都隐式的被指定为final 的。由于无法调用private 方法,因此也就无法覆盖它。

修饰类 
当某个类的整体被修饰为final 时,就意味着你不打算继承该类,并且你不允许任何人这样做。当然如果你将一个类定义为final 的那么final 中的所有方法也都隐式的被指定为final 的。我们要谨慎使用final 关键字,因为你预见一个类是否被复用是很困难的。在Java 原生类中很多就使用了final ,比如String ,Character 等。

参考书籍 
《Java 编程思想》Bruce Eckel 著 陈昊鹏 译
————————————————
版权声明:本文为CSDN博主「留兰香丶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/codejas/article/details/78743510

发布了26 篇原创文章 · 获赞 4 · 访问量 636

猜你喜欢

转载自blog.csdn.net/weixin_44730266/article/details/100672370