Java继承中的隐藏是指子类可以访问父类的成员变量和成员方法,但是不能直接访问父类的private成员变量和private成员方法。这是因为Java中的封装性,它要求子类不能直接访问父类的private成员变量和private成员方法,而必须通过public或protected来实现。
隐藏是一个非常有用的特性,它允许子类使用已有的代码,而无需重新实现它们。这样可以减少代码重复,提高代码复用性。此外,隐藏也有助于保护数据不受意外修改,因为子类无法直接访问private成员变量和private成员方法。
在Java中,隐藏也有一些陷阱。例如:如果子类覆盖了一个public方法(即使该方法在子类中声明为private也是如此),则该方法将仍然具有public访问权限。因此,在覆盖public方法时应特别小心。
class Parent { private void method1() { System.out.println("Parent's method1()"); } public void method2() { System.out.println("Parent's method2()"); } } class Child extends Parent { public void method1() { // 子类覆盖了method1() System.out.println("Child's method1()"); // 该方法仍然具有public权限 } private void method2() { // 子类声明method2()为private // 该方法将不能在外部使用 System.out.println("Child's method2()"); // 因为它已声明为private } } public class Test { public static void main(String[] args) { Child c = new Child(); c.method1(); // 输出"Child's method1" c.method2(); // 由于method2声明为private, 此行代码将出错! } }
类从其超类继承所有非私有静态方法。
重定义类中继承的静态方法称为方法隐藏。
子类中的重定义静态方法隐藏其超类的静态方法。
在类中重定义非静态方法称为方法覆盖。
关于方法隐藏的重定义方法(名称,访问级别,返回类型和异常)的所有规则与方法覆盖相同。
class MySuper { public static void print() { System.out.println("Inside MySuper.print()"); } } class MySubclass extends MySuper { public static void print() { System.out.println("Inside MySubclass.print()"); } } public class Main { public static void main(String[] args) { MySuper mhSuper = new MySubclass(); MySubclass mhSub = new MySubclass(); MySuper.print(); MySubclass.print(); ((MySuper) mhSub).print(); mhSuper = mhSub; mhSuper.print(); ((MySubclass) mhSuper).print(); } }
上面的代码生成以下结果。
类中的字段声明(静态或非静态)在其父类中隐藏具有相同名称的继承字段。
在字段隐藏的情况下,不考虑字段的类型及其访问级别。
字段隐藏仅基于字段名称。
class MySuper { protected int num = 100; protected String name = "Tom"; } class MySub extends MySuper { public void print() { System.out.println("num: " + num); System.out.println("name: " + name); } } class MySub2 extends MySuper { // Hides num field in MySuper class private int num = 200; // Hides name field in MySuper class private String name = "Jack"; public void print() { System.out.println("num: " + num); System.out.println("name: " + name); } } public class Main { public static void main(String[] args) { MySub fhSub = new MySub(); fhSub.print(); MySub2 fhSub2 = new MySub2(); fhSub2.print(); } }
上面的代码生成以下结果。
以下代码显示了如何使用super关键字访问超类的隐藏字段
class MySuper { protected int num = 100; protected String name = "Tom"; } class MySub extends MySuper { // Hides the num field in MySuper class private int num = 200; // Hides the name field in MySuper class private String name = "Jack"; public void print() { System.out.println("num: " + num); System.out.println("super.num: " + super.num); System.out.println("name: " + name); System.out.println("super.name: " + super.name); } } public class Main { public static void main(String[] args) { MySub s = new MySub(); s.print(); } }
上面的代码生成以下结果。
字段隐藏发生在一个类声明一个变量与来自其超类的继承变量具有相同名称的时候。
字段隐藏仅基于字段的名称。
类应该使用关键字super来访问超类的隐藏字段。
类可以使用简单的名称来访问其主体中的重定义字段
Java数据类型教程 -Java字符串转换String类有一个重载的valueOf()静态方法来获取任何原始数据类型或任何对象的值的字符串表示。...
JavaFX教程 -JavaFX HBoxJavaFX API具有将UI控件显示到场景图上的布局类。HBox布局类将JavaFX子节点放在水平行中。新的子节点附...
JavaFX教程 -JavaFX手势事件JavaFX可以处理来自触摸使能设备的触摸和手势的事件。手势和触摸事件支持触摸启用设备的以下事件手势...
Java 实例 - 利用堆栈将中缀表达式转换成后缀表达式 Java 实例以下实例演示了如何使用堆栈进行表达式的堆栈将中缀(Infix)表达...
Java 实例 - 数字求和运算 Java 实例以下实例演示了使用do...while结构求0~100的整数数字之和:public class Main {public stati...