前言:

  • 某一天, 我在方法中访问类成员的时候, 一不小心给这个成员申明了类型, 结果造成了空指针异常. 花了几十毫秒之后的观察后, 我发现, 原来这申明了一个变量, 于是决定通过这篇小记来记录下这件事.

可以省略 this 来访问实例成员

  • 实例方法
    • this 即实例
      • 在 Java 中, this 就表示了实例
    • this 是可以省略的
      • 在实例方法中, 如果一个 变量名 没有在作用域中声明, 那么可以直接 访问到 实例上的成员, 而无需每次通过 this.xxx 来访问.
  1. public class Cat {
  2. public String name ;
  3. public Number age ;
  4. public Cat(){ }
  5. public Cat(String name, Number age){
  6. this.name = name;
  7. this.age = age;
  8. }
  9. // 这里通过 name 访问到了 this.name
  10. public void meow(){
  11. System.out.println(" 喵, 我是" + name + ", 我的名字长度为: "
  12. + name.length());
  13. }
  14. public void meow(String str){
  15. System.out.println(str);
  16. }
  17. public void tellAge(){
  18. System.out.println(age);
  19. }
  20. public void tellAge2(){
  21. int age = 200;
  22. System.out.println(age);
  23. }
  24. }

可以省略类名来访问 静态成员

  1. public class Home {
  2. public static Cat black;
  3. public static Cat white;
  4. public static void main(String[] args) {
  5. createTwoCats();
  6. System.out.println(black);
  7. System.out.println(white);
  8. }
  9. public static void createTwoCats() {
  10. Home.black = new Cat(); // 这里访问了静态类成员
  11. Home.black.name = "Black";
  12. white = new Cat(); // 这里也访问了静态类成员
  13. white.name = "White";
  14. }
  15. }

注意事项 - 本来想访问成员时, 结果不小心声明了一个变量:

注意在局部作用域中区别 : 成员访问 和 变量声明

  • 变量声明是带类型

    1. public class Home {
    2. public static Cat black;
    3. public static Cat white;
    4. public static void main(String[] args) {
    5. createTwoCats();
    6. System.out.println(black);
    7. System.out.println(white);
    8. }
    9. public static void createTwoCats() {
    10. Cat black = new Cat(); // 这里申明了类型, 就变成了在声明此处局部作用域中的对象, 而不是静态成员 Home.black
    11. black.name = "Black";
    12. white = new Cat();
    13. white.name = "White";
    14. }
    15. }

tips: 快速区分 普通成员, 静态成员 和 局部变量

IDEA 通过字体的颜色和样式, 传递了变量类型的信息.

  • 普通类成员
    • 粗体的紫色名字
  • 静态类成员
    • 是一个斜体的紫色名字
  • 普通变量名
    • 没有任何样式的普通黑色字体.

image.png

image.png