一些引人思考java小程序

整理了一下以前做过的几个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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值