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