在Java继承体系中子类可以继承父类的成员变量。但如果子类和父类有同名变量方法里又定义了同名局部变量——到底访问的是哪个这就是继承中成员变量的访问规则问题。今天这篇文章把就近原则、this、super一次讲清楚。一、书写规则抽取共性继承中成员变量的书写规则很简单把多个子类共有的属性抽取到父类中。比如学生和老师都有name和age就抽到Person父类里。子类只写自己特有的属性不用重复定义共有的。二、就近原则谁离我近我就用谁当你在方法中访问一个变量时Java会按照以下顺序逐级查找局部位置 → 本类成员位置 → 父类成员位置找到就用找不到就继续往上找。整个继承链都找不到编译报错。看个例子class Fu { String name Fu; } class Zi extends Fu { String name Zi; public void show() { String name ziShow; System.out.println(name); } }show方法里直接打印name方法内就有局部变量name ziShow就近原则直接命中输出ziShow。三、重名变量怎么区分this和super如果想把三个重名的变量都打印出来局部、子类成员、父类成员需要用到两个关键字this指向当前对象this.name从本类成员位置开始查找super指向父类存储空间super.name从父类成员位置开始查找class Fu { String name Fu; } class Zi extends Fu { String name Zi; public void show() { String name ziShow; System.out.println(name); // 局部 → ziShow System.out.println(this.name); // 本类成员 → Zi System.out.println(super.name); // 父类成员 → Fu } }四、能不能访问爷爷类的重名变量不能。super.super.name这种写法直接编译报错。Java的继承中最多只能直接访问父类的成员。爷爷类的重名变量被父类“挡住”了无法跨级访问。五、练习三种写法都能访问父类非重名变量如果子类没有重写父类的某个变量那么直接写变量名、this.变量名、super.变量名都能访问到父类的值。class Fu { String address 南京; } class Zi extends Fu { public void show() { System.out.println(address); // 南京 System.out.println(this.address); // 南京 System.out.println(super.address); // 南京 } }三种写法都正确因为子类没有定义address最终都会查到父类。六、知识点总结场景访问方式查找起点直接写变量名name从局部位置开始逐级查找本类成员this.name从本类成员位置开始逐级查找父类成员super.name从父类成员位置开始逐级查找爷爷类重名变量不支持直接访问被父类“挡住”就近原则总结局部 本类成员 父类成员。谁离我近我就用谁。