一些引人思考java小程序

来源:互联网 发布:澳洲金融专业知乎 编辑:程序博客网 时间:2024/05/01 12:02

整理了一下以前做过的几个java小程序,希望这些小例子能带给正在学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还有很多高深的地方呢?那就一起努力,钻研编程语言的艺术吧···

以后这篇博客会不定时更新有趣例子的···如果你有什么有趣的,纠结的例子,欢迎在评论里留下你的代码和大名,大家一起探讨探讨。

0 0
原创粉丝点击