`
燕踏飞马
  • 浏览: 4167 次
  • 性别: 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 Web开发的理解和技能。 首先,我们要了解Java小程序的基础。Java小程序(Java Applet)是嵌入在HTML页面中的小型Java程序,用户可以直接在浏览器中运行。...

    java录屏小程序

    尽管这个录屏小程序在功能上还有提升空间,但对于学习Java编程以及多媒体处理的初学者来说,它是一个很好的实践项目。通过分析和改进这个程序,开发者可以深入了解Java图形处理、视频编码以及用户交互设计等核心概念...

    100多个JAVA小程序源码

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

    微信商城小程序带JAVA后台

    综上所述,"微信商城小程序带JAVA后台"项目涵盖了从前端用户体验到后台业务处理的完整流程,涉及微信小程序开发、JAVA编程、数据库管理、服务器部署等多个技术领域,是企业级电商解决方案的一个实例。

    微信小程序二维码生成(java)

    getwxacodeunlimit 生成二维码 并保存在本地 。获取到access_token 可以直接使用

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

    `表示声明了一个整型变量age并赋值为25。 2. **数据类型**:Java有两大类数据类型:基本数据类型(如int、char、boolean)和引用数据类型(如类、接口、数组)。理解不同类型的特点和使用场景是编写有效Java代码的...

    Java Web程序设计教程.pdf

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

    java小应用程序

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

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

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

    java程序自动重新启动

    在给定的标题"java程序自动重新启动"中,我们可以理解这是一个实现了自动重启逻辑的Java程序。描述指出,这个程序由三个.java文件组成:Test.java、Watch.java和AbstractRun.java,它们构成了一个简单的自动重启系统...

    Java B/S 抽奖程序

    总的来说,Java B/S 抽奖程序是一个结合了前端交互设计和后端逻辑处理的综合性项目,它展示了Java在Web开发领域的强大能力。无论是对于初学者还是经验丰富的开发者,这样的程序都提供了学习和实践的绝佳机会。通过对...

    【教程】100个Java GUI swing的小程序.rar

    Java Swing是Java GUI(图形用户界面)库的一部分,它提供了丰富的组件...本教程中的100个Swing小程序将涵盖上述各个知识点,每个程序都是一个独立的学习点,通过逐步分析和实践,你将能掌握Java Swing开发的全面技能。

    java源代码:日程管理小程序

    Java源代码:日程管理小程序是一个实用的编程项目,它为用户提供了一个管理日常任务和活动的平台。这个程序是用Java编程语言编写的,对于学习Java编程和理解面向对象设计原则的人来说,这是一个很好的实例。在Java中...

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

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

    java实现的一个画板小程序画直线,矩形,三角形以及拖动图形功能

    在Java编程语言中,开发一个画板小程序是一个常见的练习,旨在熟悉图形用户界面(GUI)设计和事件处理。这个程序允许用户在画布上绘制直线、矩形和三角形,并且能够拖动这些图形,提供了丰富的交互性。下面将详细...

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

    - **编译**: Java源代码首先会被编译成字节码(.class文件),这是一个中间形式,与具体的硬件平台无关。 - **解释**: 字节码由Java虚拟机(JVM)解释执行,使得Java程序可以在任何安装了JVM的平台上运行。 - **...

Global site tag (gtag.js) - Google Analytics