一些引人思考java小程序
2014-12-05 11:05
169 查看
整理了一下以前做过的几个java小程序,希望这些小例子能带给正在学java的你一些更深层次的理解·····
1.关于对象跟对象引用,以及equals()跟==的用法:
好,在打印出结果之前先花十秒思考下输出结果会是什么吧······
输出结果:
你可能会以为输出的结果先是true,再是false,但是事实却刚好相反!!!为什么呢?其实,尽管对象的内容是相同的,然而对象的引用确是不同的,而==和!=比较的是对象的引用。
那么问题来了,想要比较两个对象的实际内容是否相同,,又该如何操作呢?这时可以使用equals(),但是这个方法不适合基本类型,对基本类型用==和!=即可。
然而事实却并非这么简单假使我创建了自己的类,就像下面:
那么这是为什么呢?
这是由于equals()的默认行为是比较引用。所以除非在自己的新类中覆盖equals()方法,否则不可能出现我们所期待的结果。
2.赋值问题与别名现象
输出结果是:
这个程序里面,赋值操作的是一个对象的引用,所以修改t1的同时也修改了t2!这是因为t1和t2包含的是相同的引用,指向同一个对象(原来t1指向9的引用被覆盖后丢失了,被java垃圾回收了)。这种现象就称为“别名现象”。想避免t1和t2指向同一个对象的麻烦,可以改为:t1.level=t2.level。
3.foreach的使用:
说明:将“An African Swallow”的每一个字符都赋值给c,依次输出。
4.构造器的继承
先上代码:
父类Professer默认构造方法:
怎么会这样?!其实原因是这样的:在java中,父类构造器默认无参构造器的情况下,默认先查找父类构造器,再调用子类构造器,但父类的默认构造器这时java不认账,所以报错了。
解决办法是在子类中使用super(x···y)方法,记住放在子类第一行哦,不然又要报错了····
5.组合应用
好了,经过上述四道题目的测试,是不是觉得java还有很多高深的地方呢?那就一起努力,钻研编程语言的艺术吧···
以后这篇博客会不定时更新有趣例子的···如果你有什么有趣的,纠结的例子,欢迎在评论里留下你的代码和大名,大家一起探讨探讨。
1.关于对象跟对象引用,以及equals()跟==的用法:
public class Eq { public static void main(String[] args) { Integer n1=new Integer(47); Integer n2=new Integer(47); System.out.println(n1==n2); System.out.println(n1!=n2); } }
好,在打印出结果之前先花十秒思考下输出结果会是什么吧······
输出结果:
你可能会以为输出的结果先是true,再是false,但是事实却刚好相反!!!为什么呢?其实,尽管对象的内容是相同的,然而对象的引用确是不同的,而==和!=比较的是对象的引用。
那么问题来了,想要比较两个对象的实际内容是否相同,,又该如何操作呢?这时可以使用equals(),但是这个方法不适合基本类型,对基本类型用==和!=即可。
public class Eq2 { public static void main(String[] args) { Integer n1=new Integer(47); Integer n2=new Integer(47); System.out.println(n1.equals(n2)); } }这次结果就是true了。
然而事实却并非这么简单假使我创建了自己的类,就像下面:
class Value { int i; } public class Eq3 { public static void main(String[] args) { Value v1= new Value(); Value v2= new Value(); v1.i=v2.i=100; System.out.println(v1.equals(v2)); } }输出结果是false!!!
那么这是为什么呢?
这是由于equals()的默认行为是比较引用。所以除非在自己的新类中覆盖equals()方法,否则不可能出现我们所期待的结果。
2.赋值问题与别名现象
class Tank { int level; } public class test1 { public static void main (String[] args) { Tank t1=new Tank(); Tank t2=new Tank(); t1.level=9; t2.level=47; System.out.println("1:t1.level:"+t1.level+ ",t2.level:"+t2.level); t1=t2; System.out.println("2:t1.level:"+t1.level+ ",t2.level:"+t2.level); t1.level=27; System.out.println("3:t1.level:"+t1.level+ ",t2.level:"+t2.level); } }还是老规矩,清先花十秒想想t1,t2的值是什么···
输出结果是:
这个程序里面,赋值操作的是一个对象的引用,所以修改t1的同时也修改了t2!这是因为t1和t2包含的是相同的引用,指向同一个对象(原来t1指向9的引用被覆盖后丢失了,被java垃圾回收了)。这种现象就称为“别名现象”。想避免t1和t2指向同一个对象的麻烦,可以改为:t1.level=t2.level。
3.foreach的使用:
public class ForEachString { public static void main(String[] args) { for(char c:"An African Swallow".toCharArray()) System.out.println(c+""); } }结果:
说明:将“An African Swallow”的每一个字符都赋值给c,依次输出。
4.构造器的继承
先上代码:
父类Professer默认构造方法:
class Professer(){ private string name; private int number; public Professer(string n,int no){ name=n; number=no; } public teach(){} }子类:
class OldProfesser(){ private string name; private int number ; private int age; public do(){} }继承:
class OldProfesser extends Professer(){ private string name; private int number ; private int age; public do(){} public static void mian(string[] args){ OldProfesser o=new OldProfesser(); }运行程序,这时报错了!!!
怎么会这样?!其实原因是这样的:在java中,父类构造器默认无参构造器的情况下,默认先查找父类构造器,再调用子类构造器,但父类的默认构造器这时java不认账,所以报错了。
解决办法是在子类中使用super(x···y)方法,记住放在子类第一行哦,不然又要报错了····
5.组合应用
class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s="Constructed"; } public String toString() { return s; } } public class SprinklerSystem { private String value1,value2,value3,value4; private WaterSource source=new WaterSource(); private int i; private float f; public String toString() { return "value1="+value1+" "+ "value2="+value2+" "+ "value3="+value3+" "+ "value4="+value4+"\n"+ "i="+i+""+"f="+f+" "+ "source="+source; } public static void main(String[] args) { SprinklerSystem sp=new SprinklerSystem(); System.out.println(sp); } }结果:
好了,经过上述四道题目的测试,是不是觉得java还有很多高深的地方呢?那就一起努力,钻研编程语言的艺术吧···
以后这篇博客会不定时更新有趣例子的···如果你有什么有趣的,纠结的例子,欢迎在评论里留下你的代码和大名,大家一起探讨探讨。
相关文章推荐
- java程序获得windows系统的一些参数(cmd指令运行返回结果)
- 关于程序的一些零碎思考
- 对《敏捷软件开发:原则、模式与实践》中保龄球程序重构的一些思考
- 我对JAVA中一个多线程程序的思考
- java程序获取一些常用时间的方法
- Linux下Java程序中中文显示的一些问题的总结
- 关于Java内存溢出的一些思考
- 编写跨平台的Java程序是需要注意的一些事情
- 编写跨平台的Java程序时需要注意的一些事情
- Code Review CheckList-Java使用规范的一些思考
- 一些入门的java小程序
- 有关java匿名内部类的一些思考
- 【程序思考】RIA 对于 java 在 web 开发领域是否是一个转机?
- 近期思考的对程序和系统的一些优化
- 对Java中匿名类的一些思考
- 一些入门的java小程序-zt
- 【程序思考】RIA 对于 java 在 web 开发领域是否是一个转机?
- 写java程序时需要注意的一些总结!
- 关于java中Static的一些思考
- 开篇记:关于程序编写和阅读的一些思考