`
jaesonchen
  • 浏览: 311493 次
  • 来自: ...
社区版块
存档分类
最新评论

隐藏和覆盖

 
阅读更多
public class HideAndOverride {

	public static void main(String[] args) {
		
		//编译错误: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
	
		System.out.println("====================");
		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(): ");
	}
}
@SuppressWarnings("unused")
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(): ");
	}*/
}

 输出为:

Base name
Derived msg
Derived.show(): Derived name
Base.show1(): Base str
Derived.show2(): Derived info
Base.print(): Base msg
====================
Base.show1(): Base str
Derived.show2(): Derived info
Derived.print(): Derived msg

 

  Java 语言允许你去隐藏变量、嵌套类型,甚至是静态方法。
  当你在声明一个域、一个静态方法或一个嵌套类型时,如果其名字与基类
  中相对应的某个可访问的域、方法或类型相同,就会发生隐藏。
  一旦基类一个方法或者域在子类中被隐藏,你就不能在子类的实例上调用它了(除了在子类内部,通过

  使用super 关键字)。
  如果一个类要隐藏一个域,而用来隐藏该域的域具有的可访问性比被隐藏域更具限制性,
  那么这就违反了包容性(subsumption)原 则,即大家所熟知的Liskov 置换原则(Liskov Substitution

  Principle)这项原则指出,你能够对基类所作的任何事,都同样能够作用于其子类。


  不能使用实例方法覆盖基类的static静态方法。
  不能使用static方法隐藏基类的实例方法。

  不能使用static或者实例方法 隐藏和覆盖 基类的任何final类型方法。

  覆盖和隐藏的行为是指基类中那些在子类中可见的方法。如果基类中的方法使用了private修饰符,则可以

  随意在子类中使用相同签名的方法。

 

  final 修饰符对方法和域而言,意味着某些完全不同的事情。对于方法,final 意味着该方法不能被覆写

 (对实例方法而言)或者隐藏(对静态方法而言)。对于域,final 意味着该域不能被赋值超过一次。

  关键字相同,但是其行为却完全不相关。

 

  包内私有的方法不能直接被包外的方法声明所覆写。尽管包内私有的访问权限和覆写结合到一起会导致

  某种混乱,但是Java 当前的行为是允许使用包的,以支持比单个的类更大的抽象封装。

  包内私有的方法是它们所属包的实现细节,在包外重用它们的名字是不会对包内产生任何影响的。

 

  当一个变量和一个类型具有相同的名字,并且它们位于相同的作用域时,变量名具有优先权。变量名将

  遮掩(obscure)类型名。相似地,变量名和类型名可以遮掩包名。

  引用一个被遮掩的类型名的办法:

   (1)在某一种特殊的语法上下文环境中使用该名字,在该语法上下文环境中允许出现一个类型但是不允许

       出现一个变量。在转型表达式的括号中间的部分就是这样一种上下文环境。

   (2)通过在一个类声明的extends 子句中使用一个被遮掩的类这种方式。因为基类总是一种类型,出现

       在extends 子句中的名字从来都不会被解析为变量名。

   (3)通过泛型参数的extends子句引用,<T extends X.Y> 通过T.Z来引用。

分享到:
评论

相关推荐

    C++的重载、隐藏、覆盖规则

    在C++编程语言中,重载(Overloading)、隐藏(Hiding)和覆盖(Overriding)是三个重要的概念,它们涉及到函数和运算符在不同情况下的多态性表现。理解并掌握这些规则对于编写高效、可维护的代码至关重要。 ### 1....

    重载、覆盖、多态与函数隐藏

    在提供的代码示例中,我们可以看到派生类如何通过重载、覆盖和隐藏来改变函数的行为。例如,在第一个示例中,派生类`Derive`定义了一个接受`int`参数的`fun`函数,隐藏了基类`Base`中的无参`fun`函数。因此,当你...

    方法和变量在继承时的覆盖和隐藏问题

    4. 在实际编程中,应当清晰地理解覆盖和隐藏的区别,并尽可能地编写清晰、易于维护的代码。 在提供的Java代码示例中,子类Child通过定义同名静态变量kind覆盖了父类Parent中的静态变量kind,这导致当通过Child类...

    Java方法的覆盖与隐藏的区别分析

    总结来说,Java中的方法覆盖和隐藏是两种不同的机制。覆盖是关于多态性的,它允许子类根据实际对象的类型动态地执行特定的方法。而隐藏涉及静态方法和变量,它们的调用是基于引用类型而非实际对象类型。理解这些概念...

    重载、覆盖和隐藏

    ### 重载、覆盖和隐藏:面向对象编程中的三大概念 在面向对象编程中,类成员函数的重载(Overloading)、覆盖(Overriding)和隐藏(Hiding)是三个非常重要的概念,它们帮助程序员更好地管理和扩展代码。下面将...

    c# 程序设计英文课件

    c# 程序设计英文课件 内容覆盖: 变量、常量、变量的作用域 值类型变量和引用类型变量 类、类的构造函数、静态构造函数 ...方法的隐藏和覆盖 接口与显式接口定义 抽象类和抽象方法 常用控件的重要属性 多线程程序设计

    3第三章知识点整理1

    方法覆盖使得子类能够根据需要调整或扩展超类的行为,而隐藏和访问权限控制则保证了封装性和安全性。静态成员的特性决定了它们在整个类层次结构中的共享性质。理解并熟练运用这些概念对于编写高效、可维护的Java代码...

    Java中的方法和变量在继承时的覆盖问题

    变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...

    java练习册(012)--类的继承(1)分享.pdf

    1. 练习目标:掌握类继承的基本操作,包括创建子类、继承成员、隐藏和覆盖方法等。 2. 时间安排:建议分配180分钟进行练习,翻译部分写在JAVA笔记本上,书面作业写在JAVA家庭作业本上。 3. 错误预防:在编写代码时,...

    c#的重载、覆盖、隐藏

    ### C#中的重载(Overloading)、覆盖(Overriding)与隐藏(Hiding) #### 一、概述 在面向对象编程语言C#中,方法的重载(Overloading)、...通过正确应用重载、覆盖和隐藏,可以编写出更加灵活、易于扩展和维护的代码。

    笔试面试题

    - `virtual`关键字用于实现动态绑定,实现函数覆盖和虚函数表,允许子类重写基类的行为。 - 隐藏规则和覆盖规则规定了派生类如何处理与基类同名的成员函数,区分重载、隐藏和覆盖。 理解并掌握这些知识点对于任何...

    Java常问到的几个中级以上问题

    方法的隐藏和覆盖是面向对象中的两个重要概念: - 方法覆盖(Override):当子类重写父类中非静态的同名方法时,若方法签名完全一致,那么子类的方法就会覆盖父类的方法。在多态调用中,会调用子类覆盖后的方法。 ...

    C++全套学习课件函数的覆盖、隐藏和重载.pdf

    在C++编程语言中,函数的覆盖(Overriding)、隐藏...总之,理解并正确使用C++中的函数重载、覆盖和隐藏是编写高效、灵活代码的基础。在设计类层次结构时,要充分考虑这些特性,以实现最佳的代码复用和可扩展性。

    c++之第九命名控制

    6. **隐藏和覆盖**:在C++的面向对象编程中,子类可以隐藏或覆盖父类的成员。使用`using`声明可以显式地引入父类的隐藏成员,而使用相同名称的方法或变量会覆盖父类的同名成员。 7. **命名空间**:C++提供命名空间...

    Java中的语句、分支和路径覆盖测试

    其中,语句覆盖、分支覆盖和路径覆盖是衡量测试充分性的重要指标,它们属于代码覆盖率测试的一部分。本文将详细探讨这些概念以及如何在实际开发中应用它们。 首先,语句覆盖(Statement Coverage)是最基础的测试...

    C++中重载、重写(覆盖)和隐藏的区别实例分析

    在C++中,面向对象编程涉及三个重要概念:重载(Overloading)、重写(Overriding,也称为覆盖)和隐藏(Hiding)。这些概念在理解C++的多态性和类继承机制时至关重要。 1. 重载(Overloading) 重载是指在同一个...

    ComboBox 控件隐藏 fieldLabel 不能隐藏问题解决

    - CSS样式冲突:可能有其他的CSS样式覆盖了应该隐藏fieldLabel的样式规则。 2. **解决方法**: - 检查代码:确保在初始化ComboBox时,已正确设置了fieldLabel为null或者“”(空字符串)。 - 使用API:查看控件...

    CDockablePane窗口启动隐藏

    如果想要在启动时隐藏这些窗口,我们需要覆盖其默认行为。 以下是一些实现`CDockablePane`窗口启动隐藏的方法: 1. **初始化过程中的隐藏**: 在`CWinApp`的`InitInstance`方法中,你可以遍历所有的`...

Global site tag (gtag.js) - Google Analytics