几乎所有的Java书籍或资料都会介绍:当子类继承父类时,子类会获得父类中定义的成员变量和方法。当访问权限允许的情况下,子类可以直接访问父类中定义的权限和方法。这种介绍其实有些笼统,而且字面理解上会产生歧义和错误。因为Java继承中对成员变量和成员方法的处理是不通的。
比如如下代码:
class Base { int count = 2; public void display() { System.out.println(this.count); } } class Derived extends Base { int count = 20; @Override public void display() { System.out.println(this.count); } } public class StaticTest { final static StaticTest INSTANCE = new StaticTest(2.0); public StaticTest(double discount) { currentPrice = initPrice - discount; } static double initPrice = 20; double currentPrice; String kkk = "dfa"; /** * @param args */ public static void main(String[] args) { // 第一组 Base b = new Base(); System.out.println(b.count); b.display(); //第二组 Derived d = new Derived(); System.out.println(d.count); d.display(); //第三组 Base bd = new Derived(); System.out.println(bd.count); bd.display(); //第四组 Base bd2 = d; System.out.println(bd2.count); } }
第一组的Base,输出的都是2,这个应该是没有疑问的。
第二组的Derived,因为是子类,而且是覆盖父类的方法,成员变量的取近法则,所以输出都是20,也是没有疑问的。
第三组:讲一个Derived子类赋给Base的父类,此时系统将会自动向上转型以保证程序的正确。问题是,当程序通过db来访问count实例变量时输出到底是多少?通过db的display()方法时输出又是多少?答案是,直接访问实例变量,输出的将是声明时的类型,也就是Base的实例变量的值,而访问方法的时候,则表现的是运行时的类型,也就是子类的行为方式。于是输出的结果就是2和20。
第四组:这组其实有些诡异。因为当把d赋给db2的时候,代表着这两个变量指向了同一个内存。但是,实际访问d.count时输出是20,访问db2.count时输出的却是2。正常来说,两个指向同一个对象的变量,分类访问他们的实例变量时应该是同一个值,但是... 这说明了db2和d所指向的Java对象中包含了两块内存,分别存放值为2的count实例变量和值为20的count实例变量。
最后,结论是,不管d变量,还是bd变量,bd2变量,只要它们实际指向一个Derived对象,不管声明它们用的是什么类型,当通过这些变量调用方法时,方法的行为总是表现出它们实际类型的行为,但如果通过这些变量来访问它们所指的对象的实例变量时,这些实例变量的值总是表现出声明这些变量所用的类型的行为。由此可见,Java继承在处理成员变量和方法时是有区别的。
相关推荐
圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰...
(2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员...
建议读者在阅读前具备Java的基础知识,包括类、对象、方法和成员变量等概念。 在阅读过程中,尝试编写简单的Java程序,创建并使用父类和子类。 建议通过阅读相关的Java教材或搜索资料,进一步扩展学习与继承相关的...
继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也可以添加自己的属性和方法,从而实现代码的复用和扩展。继承是面向对象编程...
知道子类的继承性,子类创建对象的过程,成员变量的继承和隐藏,方法的继承和重写。
NULL 博文链接:https://fuckdkjlfsaene.iteye.com/blog/767245
定义一个台球类Billiards,继承Ball类,包含一个私有成员变量——颜色(String color),两个公有成员方法:设定颜色方法setColor()、输出信息方法show(),其中show()方法可以输出该台球的颜色和半径值。。。。。。
如书所言:(1)java不支持多重继承,也就是说子类至多只能有一个父类 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法 (3)子类中定义的成员变量和父类中定义的成员变量相同时,...
主要介绍了java 继承访问成员变量代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。...3、类初始化时,先初始化类的属性成员,在执行构造方法。
变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...
对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编译不通过。代码示例:
Java类中的私有成员的继承机制
differ.java 测试静态方法与实例方法之间的区别 forefather.java 一个简单的基类 grandson.java 上面这个类的子类 hasConstructor.java 拥有构造器的类 hasFinalFun.java 拥有最终方法的类 hasRecall.java ...
父类或超类。实际上是所有子类的公共域和公共方法的集合子类,父类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸 ,祖先类的所有成员均将成为子类拥有的“财富” 。
本次实验理解继承原理与机制及类继承的声明方法,掌握了成员变量的隐藏及方法的重写和抽象类与抽象方法,掌握了super和final关键字,理解了多态的内涵及实现代码,掌握接口的声明和使用等。
继承最简单的应用,轻松学继承。电子书版的,此子类继承父类的除私有之外的成员变量。
Java设计一个银行帐户类,成员变量包括账号、储户姓名、开户时间、身份证号码、存款余额等帐户信息,成员方法包括存款、取款操作。
Java中this与super的区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就...
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。 2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在...