`
燕踏飞马
  • 浏览: 4112 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个java小程序,目前实在难以理解

阅读更多
public class A {
int i=1;
public int geti(){
         System.out.println("a");
return i;
}
}

public class B extends A{
int i=2;
public int geti(){
System.out.println("b");
return i;
}
}
public class test {

public static void main(String[] args) {
A a= new B();
System.out.println(a.i+""+a.geti());
}

}
这个可能是一个老代码了吧,我也不清楚,反正是最近有人问到我,我也搞不太明白了。
对main方法中的打印结果有点不太理解,希望大家指教啊。
分享到:
评论
6 楼 zsz6181 2013-09-26  
居然是类型转换的问题  完全没注意到
5 楼 longshaojian 2013-09-26  
对于楼主的第二个疑问,其实你可以将
System.out.println(a.i+""+a.geti()); 


理解为

String output = a.i+""+a.geti();
System.out.println(output); 


先调用的方法先执行。。
4 楼 燕踏飞马 2013-09-26  
首先感谢一下1,2,3楼的解答,你们确实解开了我心中的疑惑,这也是我第一次发帖,再次感叹网络世界的强大。下面说说之前的疑惑吧:
1,a.i的输出到底是什么?
在看到这段代码时我确实不清楚,测试了一下发现 a.i=1。关于这个问题自己也查看了一些资料,3楼也做了很清除的说明。我想总结成一句话是不是可以说:
   类名.属性名 ==>  这个属性就是这个类名代表的类本省的属性值
而 a.geti() 中返回的 i 可以写成 this.i 此时this代表的是一个对象(此时应是代表new B()这个对象),所以a.geti()返回的是 B中i的值2.
2,为什么b在1之前被打印?
这个我之前确实没想到为什么。看到1,2楼的解答结合3楼的分析,应该是明白了一点。
System.out.println(a.i+""+a.geti());
println() 括号里打印的是一个值,在打印之前应该把
a.i+""+a.geti()  计算的结果计算出来作为一个值(我们用value代替),然后在调用println方法打印value。
这个计算过程 肯定要调用a.geti()获取值,因此就会执行geti()方法中的
System.out.println("b");
然后在执行
System.out.println(value);
这就解释了为什么是 b 1 2这个结果了。
这是个人结合2,3楼的回复产生的一点看法,如果有不对的还希望大家指正。
3 楼 longshaojian 2013-09-26  
楼主的代码输出应该是

b
12


首先解释第一行输出:b
Class B继承自Class A,并overrdie 了 geti() 方法,所以main中被执行的首先是Class B的geti(),因此 System.out.println("b"),是第一个输出的语句(为什么不是a就不用详细解释了吧)

再解释第二行输出:12
其中 1 是 a.i 的值(我猜想楼主的疑惑重点是在 a.i 的输出),这里需要明确一点,就是Class A 中的 i 是 defaut 修饰符, 因此 i 属性是被 Class B "继承"的(楼主可尝试注释Class B 中的i属性声明,代码同样可以通过),接下来解释重点:在 main 中 a 对象的创建形式是多态的:A a = new B(): 所以在运行时,a 首先是被当做一个 Class A 的对象实例来解释的,当调用 a.i 时,运行时的解释是 Class A 中的 i 而非 Class B 中的i(楼主可以尝试用调试工具断点查看 a.i 的具体细节),因此 a.i 的值是1而不是2(楼主还可以将测试代码改成
System.out.println(((B) (a)).i + "" + a.geti());

会有惊喜哦


再来说 2 的输出, 首先明确 a.geti()在运行时调用的实际是 Class B的geti() 方法,接下来就是确定这个 i 的值, 其实楼主可以理解为 this.i,所以很容易理解为 Class B 的 i,所以 这回输出是 2; 还是老方法,楼主可以将 Class B 的方法改成 如下再测试
public int geti() {
		System.out.println("b");
		return super.i;
	}

继续有惊喜哦

总结:其实说了这么多啰嗦的话,无非就是解释了类成员的“继承”实际是假继承,使用时需谨慎。。

吃饭去鸟。。
2 楼 a2140157 2013-09-26  
a2140157 写道
我刚刚用你的代码测试了一下。稍微改了一下main方法对比一下结果

A a= new B();
System.out.println(a.i+""+a.geti());
System.out.println(a.i+""+a.geti());
System.out.pringln(g.geti());
输出分别是
b11
b2
b1

对比之后发现这个主要是又代码执行的顺序和 int和string类型转换引起的。
比如第二个输出中,首先执行的是 a.geti();所以已经打印出"b"。然后,再由main中的print 方法打印 a.i+a.geti()的结果。由于两个都是int类型。所以执行数字相加,所以是“2”。最终结果就是b2
第一个不同在于额外加了个“”进去。所以int类型被转换为String.所以在先打印了 b之后,直接打印的是 "1"+""+"1"


不好意思。第二个输出是 System.out.println(a.i+a.geti(0);之前的写错了
1 楼 a2140157 2013-09-26  
我刚刚用你的代码测试了一下。稍微改了一下main方法对比一下结果

A a= new B();
System.out.println(a.i+""+a.geti());
System.out.println(a.i+""+a.geti());
System.out.pringln(g.geti());
输出分别是
b11
b2
b1

对比之后发现这个主要是又代码执行的顺序和 int和string类型转换引起的。
比如第二个输出中,首先执行的是 a.geti();所以已经打印出"b"。然后,再由main中的print 方法打印 a.i+a.geti()的结果。由于两个都是int类型。所以执行数字相加,所以是“2”。最终结果就是b2
第一个不同在于额外加了个“”进去。所以int类型被转换为String.所以在先打印了 b之后,直接打印的是 "1"+""+"1"
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    一些比较有意思的Java小程序

    总之,"一些比较有意思的Java小程序"是一个很好的学习资源,它提供了实践和探索Java编程的多种途径。对于那些想要踏入Java世界的新手来说,这是一个很好的起点,也是不断提升编程技能的良好平台。

    经典的java小程序源代码合集

    这个“经典的java小程序源代码合集”包含了164个精心设计的程序示例,涵盖了各种类型的小游戏和实用工具,如五子棋、俄罗斯方块、扫雷以及聊天程序。这些程序是学习Java编程语言及其应用的宝贵资源,不仅能让初学者...

    微信小程序+Java后台完整代码

    在“微信小程序+Java后台完整代码”中,我们可以看到一个完整的电商解决方案,包括前端的小程序部分和后端的Java服务。小程序商城的部分主要负责展示商品、处理用户交互、实现购物车功能、订单管理以及支付流程等。...

    在线投票小程序java源代码

    【Java投票小程序】是本文将要探讨的核心主题,它是一个基于Java编程语言开发的客户端应用程序。这个小程序的主要功能是实现在局域网内的在线投票功能,允许用户发起投票活动并参与投票。通过深入分析和解释这个项目...

    使用JAVA理解程序逻辑课后习题

    在“使用JAVA理解程序逻辑课后习题”中,我们主要探讨的是如何通过编写和分析Java代码来加深对程序逻辑的理解。这是一门适合初学者的课程,旨在帮助学员建立起牢固的编程基础,特别是对于使用Java语言进行逻辑思维...

    简单的java多人聊天小程序

    本项目“简单的Java多人聊天小程序”就是基于TCP协议实现的一个基础的多用户聊天应用。下面将详细介绍其设计原理、实现方式以及主要涉及的Java编程知识。 1. **TCP协议基础** TCP协议确保数据的可靠传输,通过三次...

    100多个JAVA小程序源码

    这些小程序的源代码提供了范围广,难度深的JAVA程序基础知识,可以从中选择学习.这些小程序可以用在Web页中,作为某个程序的基础,或者简单地作为一种工具来帮助学习.它们已做了编排,很容易使用一个Web浏览器来访问.只需...

    Accp6.0 S1 JAVA 理解程序逻辑 第17章(一共17章)

    这个是北大青鸟 Accp6.0_S1...使用Java理解程序逻辑与参考答案。是初学JAVA者所用,有所有答案和提供给学生的材料,以及1~17章每个章节的题目、答案和PPT。最后还有1~17综合的测试题。非常好的东东,便于各位仁兄参考。

    Java编写的趣味小程序

    ### Java编写的趣味小程序知识点解析 #### 一、百鸡问题的变形——解题思路与实现 **背景介绍** 在程序设计中,经典的数学问题往往能够帮助初学者更好地理解编程逻辑与算法思想。“百鸡问题”是历史上著名的数学...

    Java Web程序设计教程.pdf

    5. 实践能力与工程思想的培养:本书通过配备简明而实用的示例和一个完整的项目开发案例,帮助读者加深对所学技术的理解和应用,注重培养读者的实际开发能力和工程思维。 6. 教材的适用性与质量保障:本书是“21世纪...

    生日祝福java程序代码

    在Java编程领域,创建一个生日祝福程序是一种常见的实践,它能为用户提供个性化和有趣的互动体验。这个名为"生日祝福java程序代码"的压缩包显然包含了多个功能模块,旨在为生日庆祝活动增添乐趣。以下是该程序可能...

    java applet小程序

    Java Applet小程序是一种基于Java平台的小应用程序,它可以在支持Java的Web浏览器中运行。这个特定的Applet示例描述了一个动态的图形展示,其中多个圆圈会在屏幕上连续放大、消失,然后再次出现,它们的位置是随机的...

    java小应用程序

    这是一个用java做的一个关于人的肥瘦的小程序代码简单算法也不难,希望网上朋友有好的做法和我一起分享.

    微信商城 小程序 前后台源码 Java后台 ssm框架+MySQL

    微信商城小程序是一个基于微信生态的在线购物平台,其前端通过微信小程序进行展示,后端则由Java技术栈构建,采用SSM(Spring、SpringMVC、MyBatis)框架进行开发,并结合MySQL数据库来存储数据。这个项目是针对毕业...

    自考04747《Java语言程序设计(一)》教材电子版

    标题《Java语言程序设计(一)》教材电子版的知识点: 1. Java语言的起源和特点 - Java最初被设计用于消费性电子产品,目标是创建适用于异构网络的小型分布式系统软件。 - Java的前身是Oak语言,它因为其平台无关...

    Java程序性能优化 让你的Java程序更快、更稳定附本书示例代码(清晰版)

    总的来说,“Java程序性能优化 让你的Java程序更快、更稳定”这本书将涵盖以上诸多方面,通过理论结合实际的示例代码,帮助读者深入理解Java性能优化的各个方面,从而写出更快、更稳定的Java程序。书中附带的源文件...

    java编写的一个计算器小程序(图形用户界面组件GUI)

    Java 编写的计算器小程序是一个基于图形用户界面(GUI)的应用程序,主要利用Java Swing或JavaFX库来构建。在这个小程序中,我们可能看到一个简单的窗口,包含数字按钮、运算符按钮、清除按钮以及显示计算结果的...

    Java语言程序设计 基础篇 第10版 梁勇 答案

    《Java语言程序设计 基础篇 第10版 梁勇 答案》是一本针对初学者和进阶者的重要参考资料,由知名Java教育专家梁勇编写。本书全面覆盖了Java语言的基础概念、语法和编程技巧,旨在帮助读者深入理解并掌握Java编程的...

    java理解程序逻辑书

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向...

    JAVA经典小程序集合

    包括扫雷,俄罗期方块,五子棋,聊天程序

Global site tag (gtag.js) - Google Analytics