|
| 1 | +## final 关键字 |
| 2 | + |
| 3 | +**final关键字主要用在三个地方:变量、方法、类。** |
| 4 | + |
| 5 | +1. **对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。** |
| 6 | + |
| 7 | +2. **当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。** |
| 8 | + |
| 9 | +3. 使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。 |
| 10 | + |
| 11 | +## static 关键字 |
| 12 | + |
| 13 | +**static 关键字主要有以下四种使用场景:** |
| 14 | + |
| 15 | +1. **修饰成员变量和成员方法:** 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:`类名.静态变量名` `类名.静态方法名()` |
| 16 | +2. **静态代码块:** 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次. |
| 17 | +3. **静态内部类(static修饰类的话只能修饰内部类):** 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。 |
| 18 | +4. **静态导包(用来导入类中的静态资源,1.5之后的新特性):** 格式为:`import static` 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。 |
| 19 | + |
| 20 | +## this 关键字 |
| 21 | + |
| 22 | +this关键字用于引用类的当前实例。 例如: |
| 23 | + |
| 24 | +```java |
| 25 | +class Manager { |
| 26 | + Employees[] employees; |
| 27 | + |
| 28 | + void manageEmployees() { |
| 29 | + int totalEmp = this.employees.length; |
| 30 | + System.out.println("Total employees: " + totalEmp); |
| 31 | + this.report(); |
| 32 | + } |
| 33 | + |
| 34 | + void report() { } |
| 35 | +} |
| 36 | +``` |
| 37 | + |
| 38 | +在上面的示例中,this关键字用于两个地方: |
| 39 | + |
| 40 | +- this.employees.length:访问类Manager的当前实例的变量。 |
| 41 | +- this.report():调用类Manager的当前实例的方法。 |
| 42 | + |
| 43 | +此关键字是可选的,这意味着如果上面的示例在不使用此关键字的情况下表现相同。 但是,使用此关键字可能会使代码更易读或易懂。 |
| 44 | + |
| 45 | + |
| 46 | + |
| 47 | +## super 关键字 |
| 48 | + |
| 49 | +super关键字用于从子类访问父类的变量和方法。 例如: |
| 50 | + |
| 51 | +```java |
| 52 | +public class Super { |
| 53 | + protected int number; |
| 54 | + |
| 55 | + protected showNumber() { |
| 56 | + System.out.println("number = " + number); |
| 57 | + } |
| 58 | +} |
| 59 | + |
| 60 | +public class Sub extends Super { |
| 61 | + void bar() { |
| 62 | + super.number = 10; |
| 63 | + super.showNumber(); |
| 64 | + } |
| 65 | +} |
| 66 | +``` |
| 67 | + |
| 68 | +在上面的例子中,Sub 类访问父类成员变量 number 并调用其其父类 Super 的 `showNumber()` 方法。 |
| 69 | + |
| 70 | +**使用 this 和 super 要注意的问题:** |
| 71 | + |
| 72 | +- super 调用父类中的其他构造方法时,调用时要放在构造方法的首行!this 调用奔雷中的其他构造方法时,也要放在首行。 |
| 73 | +- this、super不能用在static方法中。 |
| 74 | + |
| 75 | +**简单解释一下:** |
| 76 | + |
| 77 | +被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享。而 this 代表对本类对象的引用,指向本类对象;而 super 代表对父类对象的引用,指向父类对象;所以, **this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西**。 |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | +## 参考 |
| 82 | + |
| 83 | +- https://www.codejava.net/java-core/the-java-language/java-keywords |
| 84 | +- https://blog.csdn.net/u013393958/article/details/79881037 |
0 commit comments