整理了一下以前做过的几个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还有很多高深的地方呢?那就一起努力,钻研编程语言的艺术吧···
以后这篇博客会不定时更新有趣例子的···如果你有什么有趣的,纠结的例子,欢迎在评论里留下你的代码和大名,大家一起探讨探讨。