-
java关于继承的一道面试题15
求解释,为什么test调用父类i,却调用子类的方法public class T1 { int i = 0; public void Test1() { System.out.println(i); } public void Test2() { System.out.println(i); } } public class T2 extends T1 { int i = 2; public void Test2() { System.out.println(i); } public static void main(String[] args) { T1 test = new T2(); test.Test1(); test.Test2(); System.out.println(test.i); test = (T2)test; System.out.println(test.i); } }
2014年2月24日 16:17
7个答案 按时间排序 按投票排序
-
总结的真的很好 谢谢 还可以通过看书和视频来增长自己的知识,大家可以看看这个资料电子书和视频,“电子书 pdf 下载地址http://javaee.3g-edu.org/tushu/?lbjeye”,“视频申请地址http://javaee.3g-edu.org/shipin/?lbjeye”
2017年11月20日 08:26
-
首先明确:
子类定义了和父类相同的变量,不会覆盖变量值,也就是说,各是各的。
T1 test = new T2();
这是创建父类的引用,子类的实例。
test.Test1();
这里输出:0
因为test1(),调的父类方法,值没被覆盖,所以是父类 i=0 的值。
同时我们知道,子类覆盖父类方法,创建的子类实例,默认会调子类的方法:
test.Test2(); 是子类的方法, 当然也是子类的i=2的值
System.out.println(test.i);
输出0
这句是父类的引用,指向父类的i=0的值
test = (T2)test;
这句实际没任何效果,因为你已经是子类的实例,再对实例进行转换,最多类型比较一次
因此,后面的 System.out.println(test.i); 值,还是父类的i=0;
当然,如果你 T2 t2 = (T2)test;
那么就转化成子类的引用,你再调 i 的时候就会用到T2 的值
2014年2月26日 11:29
-
T1和T2中都有i,这其实代表不同地址中的数据
为了便于理解,其实应该把T2中的i改成i2
T1 test = new T2();
这创建的是一个T1对象
无论是否强转,test.i都是最初创建时的值。所以System.out.println(test.i); 结果都是0
Test1() 打印结果肯定为0.
Test2() 被子类重写,打印的结果为1.2014年2月25日 15:47
-
test的引用类型是T1,实质是T2的实例
第一个输出test.Test1()运行的是T2实例的方法
T2实例的初始化过程是从根父类开始的,可以大致理解为栈状结构逐层构建
T2方法
T2域
T1方法
T1域
T0方法
T0域
test作为T2实例继承T1的Test1()方法实际并没有复制,运行Test1()时其实质是在栈中向下搜索至T1的Test1()方法,该方法中的println向下寻找i,于是结果是T1中的i。如果T1有父类T0也有一个域i,也会被覆盖。
第二个输出test.Test2()也可以作类似理解。其实T1作为引用类型只是限制了test可用“哪一些”方法,不可以调用子类独有父类没有的方法,仅此而已,至于运行“哪一个”(继承过程中的)方法就是由T2实例决定的,所以只要子类有的方法不会去找父类,没有的话就向下找。
上面关于方法的调用是由实例决定的,是多态的特性,同一个父类引用装入不同实例就有不同方法,但变量不一样,变量只是方法的辅助对象的属性,变量和多态没有直接关系不会受实例类型影响,获取的变量值和引用类型有关,所以第三个输出T1引用类型的test的i是0。
至于第四个输出前强制转型test = (T2)test;后test依然是T1引用类型并没有改变,所以输出依然是T1的i值0。如果句子是T2 test2 = (T2)test;输出test2的i值将会是2。2014年2月25日 02:20
-
这是java的重写,子类重写了父类的方法。
另外,你new的是子类,只是用了一个父类接口去引用,他本质还是子类的对象。所以你调用test2永远都是调用子类的。这点和c++不一样2014年2月24日 18:43
相关推荐
根据给定的文件内容,我们可以总结出一系列与Java面试相关的知识点。下面将详细解析每一道题目涉及的关键概念。 ### 第一部分:基础知识 #### 1. final, finally, finalize的区别 - **final**: 用于声明变量、方法...
根据提供的文件信息,我们可以分析出这是一道关于Java继承与方法重写的相关笔试面试题。题目涉及到了Java类的继承、方法重写、实例化对象时的调用顺序以及对象多态性等知识点。接下来,我们将对这些知识点进行详细的...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在求职面试中脱颖而出,了解并掌握Java的核心概念、...对于每一道面试题,深入理解并能举一反三,将是成为一名优秀Java开发者的关键。
这道2011年腾讯校招的面试题虽然没有明确的问题描述,但从标签中我们可以推测,它可能涉及C++、.NET、Java这三种编程语言中的某一方面,或者是关于算法设计与分析。面试题通常旨在考察候选人的思维能力、编程基础...
【华为Java面试题详解】 1. **数组排序与字符串处理** 在这道题中,你需要接收一个包含多个数字的字符串,这些数字由逗号分隔。首先,我们需要使用`splitStringByComma`方法将字符串拆分成一个整数数组。这个方法...
《java面试800题(包括java,数据库,前台等,绝对全面)》 Q0027 哪些SQL语句在执行时是自动提交的? 数据定义语言DDL是自动提交的。 Q0028 索引对数据库的影响? 提高查询速度 Q0029 主外键有什么关系? 外键是从...
以上只是部分内容,完整的208道面试题涵盖了更多深入的Java知识,包括设计模式、Spring框架、Mybatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM优化等方面,每一道题目都值得深入探讨和学习。
本文主要介绍了JAVA面试题中关于启动线程的start()和run()方法的详解。通过示例代码,详细介绍了这两个方法的作用和区别,以及它们在启动线程时的执行过程。 第一点,start()方法和run()方法的区别。在Java中,...
以上仅为Java面试题中的一部分内容,每一道题目都包含了丰富的技术点和深入的理解。对于求职者来说,熟练掌握这些知识点不仅能够帮助应对面试挑战,还能在实际工作中更好地运用Java语言解决问题。
Java面试题+答案最全版本,分类好的,这个资源涵盖了从基础到高级的Java编程知识点,是准备Java面试的理想资料。下面将详细解读其中可能涉及的重要知识点。 首先,基础部分通常包括: 1. **Java语法**:理解基本...
Java是一种广泛使用的面向对象的编程语言,其面试题涵盖了众多的知识点,对于学习和准备面试的Java开发者来说,这些都是必须掌握的基础和进阶内容。以下是对这些知识点的详细解释: 1. `super()`与`this()`的区别:...
"100家大公司Java笔试题汇总.doc"这份文档提供了丰富的实践材料,建议考生们深入研究每一道题,不仅要找出正确答案,还要理解背后的原理,这样才能在真正的笔试中游刃有余,成功叩开心仪企业的门扉。同时,通过反复...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而闻名。这份“Java题库”包含了15套题目,旨在帮助学习者...建议逐一解答并理解每一道题,结合实际编程练习,以巩固理论知识并提升实战能力。
以上仅是部分Java面试题目的解析,每一道题目都涉及到Java语言的核心概念和技术,理解并掌握这些知识点对于Java程序员来说至关重要。在面试过程中,表现出对这些基础概念的深入理解和熟练运用,将大大增加获得理想...
根据提供的文件信息,这里将对每一道题目进行详细的解析,并解释相关的 Java 基础知识点。 ### 1. Java 的关键字选择题 **题目:** 下列哪个是 Java 中的关键字? - A. sizeof - B. abstract - C. NULL - D. ...
《JAVA程序员面试笔试真题库》不仅提供了丰富的面试真题资源,更重要的是通过详细的解析帮助求职者理解每一道题目的背后逻辑和技术要点。求职者应该充分利用这本书提供的资源,系统学习JAVA相关的知识点,并通过模拟...
在Java面试中,Singleton模式是一个常见的面试题,它主要用来确保在整个应用程序中,一个类只能有一个实例存在。下面将详细讲解Singleton模式的几种常见实现方式及其原理。 ### 1. 饿汉式(静态常量)Singleton ``...
Java经典笔试题主要涵盖了许多Java基础知识,包括面向对象、异常处理、类与对象、继承、接口、数组、字符串以及Swing组件等。以下是对题目及其涉及知识点的详细解析: 1. 第一道题考察了方法的重写和覆盖。类B继承...
- **继承**:继承允许一个类(子类)继承另一个类(父类)的属性和方法,减少了代码重复,增强了代码的复用性。子类可以扩展或覆盖父类的方法,以满足特定需求。 - **多态**:多态性意味着同一方法可以根据调用它...