//Java 语言允许你去隐藏变量、嵌套类型,甚至是静态方法。 //当你在声明一个域、一个静态方法或一个嵌套类型时,如果其名字与基类 //中相对应的某个可访问的域、方法或类型相同,就会发生隐藏。 //一旦基类的一个方法或者域在子类中被隐藏,你就不能在子类的实例上调用它了(除了在子类内部,通过使用super 关键字)。 //如果一个类要隐藏一个域,而用来隐藏该域的域具有的可访问性比被隐藏域更具限制性, //那么这就违反了包容性(subsumption)原则,即大家所熟知的Liskov 置换原则(Liskov Substitution Principle) //这项原则指出,你能够对基类所作的任何事,都同样能够作用于其子类。 //不能使用实例方法覆盖基类的static方法。 //不能使用static方法隐藏基类的实例方法。 //不能使用static或者实例方法 隐藏和覆盖 基类的任何final类型方法。 //覆盖和隐藏的行为是指基类中那些在子类中可见的方法,如果基类中的方法使用了private修饰符,则可以随意在子类中使用相同签名的方法。 //final 修饰符对方法和域而言,意味着某些完全不同的事情。对于方法,final 意味着该方法不能被覆写 //(对实例方法而言)或者隐藏(对静态方法而言)。对于域,final 意味着该域不能被赋值超过一次。 //关键字相同,但是其行为却完全不相关。 //编译错误:Base.name被隐藏,所以访问的是Derived.name,而Derived.name是private的在类外部不可见。 //System.out.println(new Derived().name); System.out.println(((Base) (new Derived())).name); //Base name System.out.println(Derived.msg); //Derived msg Base base = new Derived(); base.show(); //Derived.show(): Derived name base.show1(); //Base.show1(): Base str base.show2(); //Derived.show2(): Derived info base.print(); //Base.print(): Base msg Derived derived = new Derived(); derived.show1(); //Base.show1(): Base str derived.show2(); //Derived.show2(): Derived info derived.print(); //Derived.print(): Derived msg class Base { public String name = "Base name"; public String str = "Base str"; public static String msg = "Base msg"; public static String info = "Base info"; public void show() { System.out.println("Base.show(): " + name); } public void show1() { System.out.println("Base.show1(): " + str); } public void show2() { System.out.println("Base.show2(): " + info); } public static void print() { System.out.println("Base.print(): " + msg); } public final void print1() { System.out.println("Base.print1(): "); } public final static void print2() { System.out.println("Base.print2(): "); } } class Derived extends Base { private String name = "Derived name"; public String str = "Derived str"; public static String msg = "Derived msg"; public static String info = "Derived info"; /* 编译错误:静态方法无法隐藏基类的实例方法 public static void show() { System.out.println("Derived.show()"); }*/ public void show() { System.out.println("Derived.show(): " + name); } public void show2() { System.out.println("Derived.show2(): " + info); } /* 编译错误:实例方法无法覆盖基类的静态方法 public void print() { System.out.println("Derived.print()"); }*/ public static void print() { System.out.println("Derived.print(): " + msg); } /* 编译错误:不能隐藏或者覆盖基类的final方法,不管是static还是实例方法。 public void print1() { System.out.println("Derived.print1(): "); } public static void print1() { System.out.println("Derived.print2(): "); } public static void print2() { System.out.println("Derived.print2(): "); }*/ }
相关推荐
在JavaScript中,闭包是一种高级特性,它涉及到函数、作用...它允许我们创建私有变量和方法,同时还能保持这些状态,这对于实现复杂的功能和优化性能非常重要。理解并熟练运用闭包是成为JavaScript开发高手的关键一步。
- 访问隐藏的超类成员:当子类中存在与超类同名的成员时,`super`可用于访问超类的成员,无论是方法还是实例变量。 **关于Object类** - 所有Java类都间接或直接继承自Object类,Object是所有类的根超类。因此,...
- **访问隐藏的超类成员**:当子类有与超类同名的成员时,可以使用`super.member`来访问超类的成员,成员可以是方法或实例变量。 **5.1.3 使用final关键字** - **阻止继承**:将类声明为`final`,可以防止其他类...
当子类中定义了与超类同名的变量时,超类的变量在子类中被隐藏。可以通过`this`关键字访问子类的成员,`super`关键字访问超类的成员。此外,`this`和`super`也可用于在方法内部区分同名的局部变量和成员变量。 ...
其次,`super`可以用来访问被子类隐藏的超类成员,无论是方法还是实例变量。比如,当子类中存在与超类同名的方法或变量时,`super.member`可以用来调用超类中的相应成员。更多关于`super`的使用,可以参考教材P134~...
- **属性的隐藏**:子类可以声明与超类同名但类型不同的变量,这被称为隐藏。虽然看起来子类中存在两个同名变量,但实际上,子类中调用该变量时,会优先使用子类自己的变量。要访问超类被隐藏的属性,可以使用`super...
- **修饰符**:如public、private、protected、abstract、final、static等,它们用于定义类、方法、变量的性质和访问权限。 6. **对象的使用与对象间通信**: - **对象的创建**:使用`new`关键字创建对象,例如`...
在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义了一个 Point 类 ,并且声明了它的两个变量 x、y 坐标 ,同时实现 init()方法 对 x、y 赋初值 。 class Ponit { int...
12. **超类引用**:子类隐藏超类成员变量时,使用`super.x`引用超类的成员变量。 13. **接口**:接口没有实例变量,只有常量定义和抽象方法。 14. **对象比较**:`u==v`比较的是对象的引用,意味着两个对象是否...
这意味着子类可以直接使用这些成员,或者选择隐藏成员变量或重写方法。通过继承,可以实现代码的复用和模块化,使程序设计更加灵活和高效。 二、成员继承规则 1. 子类继承父类中所有对其可见的成员,除非子类明确地...
JAVA理论知识基础复习是指对JAVA语言的基础知识进行复习和总结,本文将涵盖构造方法、new关键字、方法的重载、特殊变量this、static定义常量、继承、方法的重写、特殊变量super、多态性等相关知识点。 一、构造方法...
- **成员变量的隐藏**:子类中定义的与父类同名的成员变量会隐藏父类中的同名成员变量。这意味着在子类内部,使用变量名时会优先引用子类的成员变量。 - **方法的覆盖**:子类中定义的与父类同名且具有相同参数列表...
**3.6 子类隐藏超类的成员变量和方法的情况** - 当子类中有与超类同名的成员变量或方法时,子类的成员会隐藏超类的同名成员。 - 实现隐藏的方法是通过在子类中定义具有相同签名的方法。 **3.7 子类方法与超类方法...
7. **继承**: 继承允许一个类(子类)从另一个类(超类)继承属性和方法,从而实现代码的重用和软件的可扩展性。 8. **多态性**: 多态性指的是同名的方法在不同的类中可能有不同的实现,这允许更灵活的代码设计,...
- 子类可以通过定义同名的成员变量或方法来隐藏超类中的成员。 - 使用`@Override`注解可以明确指出方法的覆盖意图。 **3.7 子类中方法名称相同而类型不同的情况** - 方法名称相同但参数列表不同被视为重载,而非...
自动变量也称为局部变量,它们是在方法、构造器或块中声明的变量。这些变量的作用域仅限于它们所在的代码块。当执行流离开该代码块时,变量将被销毁。 #### 8. AWT (Abstract Window Toolkit) AWT是Java中的图形...
- **适用范围**:对于类、方法、变量均有效。 2. **protected** - **定义**:使用`protected`修饰的成员只能在同一包内或不同包中的子类中被访问。 - **适用范围**:适用于方法和变量。 3. **默认(即不写任何...
- **同名成员变量**:如果子类中定义了一个与父类中同名的成员变量,则子类中的成员变量会“隐藏”掉父类中的同名成员变量。 - **使用`super`关键字访问父类成员**:如果需要在子类中引用父类中的同名成员变量,可以...