避免在无关的变量或无关的概念之间重用名字,避免隐藏、遮蔽、和遮掩
一、隐藏
一个属性、静态方法或内部类可以分别隐藏在其超类中可访问到的具有相同名字(对方法而言就是相同的方法签名)的所有属性、方法或内部类。上述成员被隐藏后,将阻止其被继承
1.父类代码
public class Fu {
int a = 1;
public static void fly(){
System.out.println("Fu want to fly");
}
public class Boy{
public int age = 20;
public void read(){
System.out.println("Fu's boy read");
}
}
};
2.子类代码
public class Zi extends Fu {
int a = 2;
public static void fly(){
System.out.println("Zi want to fly");
}
public class Boy{
public int age = 23;
public void read(){
System.out.println("Zi's boy read");
}
}
}
子类继承父类,并具有与父类相同的名字,所以子类的变量a、方法Boy() 会隐藏父类的变量a、方法Boy(),引用时,使用的是子类的值或方法。但因为fly()是静态修饰的,不能被继承,所以子类不会隐藏父类的fly()方法,只能使用 类名.方法名 来调用。
二、遮蔽
一个变量、方法或类可以分别遮蔽在类内部具有相同名字的变量、方法或类。如果一个实体被遮蔽了,那么就无法用简单名引用到它
class TestInnerClass {
public void test() {
System.out.println("Other TestInner's method test!");
}
}
public class TestZ {
static String name = "My name is zhangsan";
void test() {
System.out.println("TestZ's method test!");
}
void testInner() {
TestInnerClass testInnerClass = new TestInnerClass();//实例化重名类
testInnerClass.test();
}
public class TestInnerClass {//遮蔽了外部的类TestInnerClass
public int test2 = 1;
public void test() {//遮蔽了类TestZ方法test
System.out.println("TestInnerClass's method test");
}
public void testMethod() {
String name = "My name's lisi";//遮蔽了类TestZ 的静态属性name
System.out.println(name);//打印重名变量
test();//调用重名方法
}
}
}
如果我通过TestZ 类实例化一个TestInnerClass 类,调用testMethod() 方法,test()的输出的结果是 TestInnerClass’s method test 。所以,如果一个实体被遮蔽了,那么就无法用简单名引用到它。
三、遮掩
遮掩是唯一一种两个名字位于不同的名字空间的名字重用形式,这些名字空间包括:变量,包,方法或类型。如果一个类或一个包被遮掩了,那么你不能通过其简单名引用到它,除非是在这样一个上下文环境中,即语法只允许在其名字空间中出现一种名字
public class Demo {
static String System;
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
定义的System和Java中已经存在的一个叫系统(System)的类重名,那么它将引用到静态变量上,而不是类上,所以会报编译错误。