Java 中关于this、static、final 关键字的使用

来源:互联网 发布:java绝对值函数怎么用 编辑:程序博客网 时间:2024/05/17 07:04

在刚开始学习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);    }}

输出
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;    }}

      通过静态代码块加载配置文件:

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();        }    }

final关键字:
      这里主要介绍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 的。我们要谨慎使用final 关键字,因为你预见一个类是否被复用是很困难的。在Java 原生类中很多就使用了final ,比如String ,Character 等。

                                                                                                            参考书籍:
                                                                                                                《Java 编程思想》Bruce Eckel 著 陈昊鹏 译