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

隐藏超类方法、变量

 
阅读更多
//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中,闭包是一种高级特性,它涉及到函数、作用...它允许我们创建私有变量和方法,同时还能保持这些状态,这对于实现复杂的功能和优化性能非常重要。理解并熟练运用闭包是成为JavaScript开发高手的关键一步。

    静态(static)方法重写(override)

    - **作用域限制**:静态方法只能访问静态变量和调用其他静态方法。 2. **静态方法的隐藏** - **隐藏而非重写**:当子类中声明了一个与父类中相同的静态方法时,实际上是在子类中定义了一个新的方法,这个新方法会...

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

    这意味着子类可以直接使用这些成员,或者选择隐藏成员变量或重写方法。通过继承,可以实现代码的复用和模块化,使程序设计更加灵活和高效。 二、成员继承规则 1. 子类继承父类中所有对其可见的成员,除非子类明确地...

    Java程序设计开发教程Java程序结构PPT教案学习.pptx

    当子类中定义了与超类同名的变量时,超类的变量在子类中被隐藏。可以通过`this`关键字访问子类的成员,`super`关键字访问超类的成员。此外,`this`和`super`也可用于在方法内部区分同名的局部变量和成员变量。 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    对象的使用包括引用对象的成员变量和方法,通过运算符·可以实现对变量的访问和方法的调 用,变量和方法可以通过设定一定的访问权限(见下面的例子)来允许或禁止其它对象对它的 访问。 我们先定义一个类 Point。 例子...

    Java语言程序设计实验指导电子PPT学习教案.pptx

    - **访问隐藏的超类成员**:当子类有与超类同名的成员时,可以使用`super.member`来访问超类的成员,成员可以是方法或实例变量。 **5.1.3 使用final关键字** - **阻止继承**:将类声明为`final`,可以防止其他类...

    3第三章知识点整理1

    - **属性的隐藏**:子类可以声明与超类同名但类型不同的变量,这被称为隐藏。虽然看起来子类中存在两个同名变量,但实际上,子类中调用该变量时,会优先使用子类自己的变量。要访问超类被隐藏的属性,可以使用`super...

    Java中this与super的区别

    Java中this与super的区别 this&super;...所以子类中的同名成员变量或方法就隐藏了超类的成员变量或方法, 但是我们如果想要使用超类中的这个成员变量或方法,就需要用到super. 。。。。。。。。。。。。。

    Java语言程序设计实验指导电子学习教案.pptx

    - 访问隐藏的超类成员:当子类中存在与超类同名的成员时,`super`可用于访问超类的成员,无论是方法还是实例变量。 **关于Object类** - 所有Java类都间接或直接继承自Object类,Object是所有类的根超类。因此,...

    精品资料(2021-2022年收藏)全国2020年资料年1月高等教育自学考试.doc

    12. **超类引用**:子类隐藏超类成员变量时,使用`super.x`引用超类的成员变量。 13. **接口**:接口没有实例变量,只有常量定义和抽象方法。 14. **对象比较**:`u==v`比较的是对象的引用,意味着两个对象是否...

    Java语言程序设计实验指导电子PPT课件.pptx

    其次,`super`可以用来访问被子类隐藏的超类成员,无论是方法还是实例变量。比如,当子类中存在与超类同名的方法或变量时,`super.member`可以用来调用超类中的相应成员。更多关于`super`的使用,可以参考教材P134~...

    论JAVA继承机制中父类与子类的关系

    - **成员变量的隐藏**:子类中定义的与父类同名的成员变量会隐藏父类中的同名成员变量。这意味着在子类内部,使用变量名时会优先引用子类的成员变量。 - **方法的覆盖**:子类中定义的与父类同名且具有相同参数列表...

    java程序设计教学做一体化教程继承与接口公开课获奖课件.pptx

    它用来访问父类被隐藏的成员变量和方法,以及调用父类的构造方法。子类构造器中,`super`必须作为第一条语句,用于调用父类的构造器,如果没有明确指定,会默认调用父类无参构造器。 实践环节,例如`Application5_1...

    JAVA理论知识基础复习

    可以使用super访问父类被子类隐藏的变量或覆盖的方法。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。 十、多态性 多态性是一种编程技术,...

    《Java语言程序设计(一)》课后习题答案(课程编号04747)

    #### 3.6 子类隐藏超类成员变量和方法的条件 - **成员变量**:子类可以定义与超类同名的变量,但这并不叫隐藏,而是子类内部的新变量。 - **方法**:子类可以通过使用`@Override`注解重写超类的方法,实现隐藏的...

    Java程序设计开发教程ppt课件.ppt

    - **变量的隐藏**:如果子类中定义了与超类同名的成员变量,超类的成员变量在子类中会被隐藏,但仍然可以通过`super`关键字访问。 3. **多态性**: - **多态性**是指同一操作或方法可以作用于不同类型的对象,...

    Java面向对象程序设计(“方法”相关文档)共57张.pptx

    7. **继承**: 继承允许一个类(子类)从另一个类(超类)继承属性和方法,从而实现代码的重用和软件的可扩展性。 8. **多态性**: 多态性指的是同名的方法在不同的类中可能有不同的实现,这允许更灵活的代码设计,...

    Java语言程序设计(第二版)\第05章 类的继承性与多态性.ppt

    2. 成员变量的隐藏:如果子类中定义了与父类同名的成员变量,那么在子类内部,父类的成员变量会被隐藏,即子类的成员变量优先级更高。例如,在示例5.1中,`Line`和`Circle`类都从`Point`类继承了`x`和`y`变量,但...

    JAVA程序设计实用教程课后习题简答(第3版).doc )

    通过继承,可以创建一个层次结构的类,其中基类(或超类)的属性和方法可以被派生类(或子类)共享和扩展。这不仅提高了代码的复用性,还增强了代码的可读性和可维护性。 #### 多态 多态是指允许子类对象以父类对象...

Global site tag (gtag.js) - Google Analytics