呵呵这里说下我每天突然想起或看到的一些java知识点:
1:==和equals的区别,==比较的是引用而equals比较的是内容:
package com.djk.jichu;
public class Test4
{
public static void main(String[] args)
{
String a = "a";
String b = "a";
System.out.println(a==b);
System.out.println(a.equals(b));
}
}
比较的结果是true和true,第一个比较的是引用,当String a ="a"时会把字符串a放入常量池中,当String b = "a"的时候首先去常量池中找是否已经存在这个a字符串如果存在的话则直接把引用直接指向常量池中的字符串a,如果没有则在常量池中创建一个字符串a,在这个列子中在创建b的时候由于常量池中已经有了字符串a所以当比较a==b的时候他们当然相等(因为都指向常量池中的字符串a),第二个为true的原因主要是内容都为字符串a所以相等。
package com.djk.jichu;
public class Test4
{
public static void main(String[] args)
{
String a = "a";
String b = new String("a");
System.out.println(a==b);
System.out.println(a.equals(b));
}
}
这断代码的结果是false和true,第一个为false的原因是虽然创建b的时候常量池中已经存在字符串a,可是在创建b的时候我们显示的new了b对象,这样的话创建b的时候就不会再去常量池中找而是直接new出一个b对象。这样的话a和b所指向对象的地址当然不同,所以结果为false。第二个为true的原因是equals比较的是内容,引用a和b虽然指向的地址不同但是所指向的地址里放的内容是相等的所以结果为true。
package com.djk.jichu;
public class Test4
{
public static void main(String[] args)
{
String a = new String("a");
String b = new String("a");
System.out.println(a==b);
System.out.println(a.equals(b));
}
}
结果第一个是false第二个是true,第一个额外ifalse的原因是a和b所指向的地址不同。第二个true的原因是内容是相等的。
接下来再看一段代码:
package com.djk.jichu;
public class Test4
{
public static void main(String[] args)
{
Test5 test1 = new Test5("a");
Test5 test2 = new Test5("a");
System.out.println(test1.equals(test2));
}
}
class Test5
{
private String message;
public Test5(String message)
{
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
这不知道大家认为这段代码运行的结果是什么,答辩是false。或许有人会有疑问equals比较的是内容,而test1和test2的内容确实都是1是相同的为什么结果是false。原因在于java有个基类Object类,这个类中有equals方法,而则个equals方法默认比较的方式是和==比较的方式是一样的,比较的是引用指向的地址。所以当我们用自己的写的类来调用equals方法时虽然内容是相同的不过由于用的是基类的equals方法比较的是引用指向的地址所以结果是fasle。不过我们用String类的时候发现用equals比较的确实是内容原因是String类帮我们覆盖了基类的equals方法,所以我们比较的是内容。如果我们也想让Test5这个类调用equals方法时比较的是
内容那我们就要重写equals方法。
2:对数组的认识
数组也是对象,数组的定义有3种形式
(1)String [] a = new String[2];定义了一个数组容量是2,默认值是null
(2)String [] a = {"1","2"};定义了一个数组里面的内容是1和2
(3)String [] a = new String [] {"1","2"}定义了一个数组里面的内容是1和2
要打印数组的内容可以用Arrays.toString(a)这也是唯一的方法。
3:java传参的认识
package com.djk.jichu;
public class Test6
{
public static void main(String[] args)
{
Test7 test = new Test7("1");
System.out.println("before:"+test.getMessage());
Test7 test2 =test;
test2.setMessage("2");
System.out.println("after:"+test.getMessage());
}
}
class Test7
{
public Test7(String message)
{
this.message = message;
}
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
打印的结果是:before :1 after :2 原因是java传参传的是引用, Test7 test2 =test;这个的意思是把test的引用传给了test2此时test2和test指向同一个内存中的对象,当test2改变这个内存中对象的值的时候对test当然也有影响。
int i =10;
System.out.println(i);
int j = i;
j = 20;
System.out.println("i:"+i + "j:"+j);
这个的结果第一个打印的是10 第二个是i:10,j:20发现虽然把i的值给了j,改变了j的值可是对i没有产生任何影响i的值还是10原因是这时传的是值。不过我是这样记的,我还是认为基本数据类型的时候传的是引用,不过在int j = i的时候我认为编辑器会写成int j =new Integer(i);的形式就是j其实指向了另一个地址只不过这个地址的对象内容正好是i,这样改变j的值不会影响到i因为他们所指向的地址不同(呵呵 估计不对 不过我是这么记住的)。
4:关于构造器和重载的
我们如何确定java类的一个方法?答案是根据方法名和参数列表。
重载构成的条件是方法名相同但是参数不同。这里为什么不把返回值放进去,因为方法的调用者有的时候并不会去关心他的返回值所以要记住返回值不能用来作为判断重载的一个依据。
当我门在一个类中如果没有定义构造器则编译器会帮我们默认构造一个无参构造器,如果我们定义了一个构造器则编译机就不会再为我么定义一个构造器,所以有时会发生如下的错误:
package com.djk.jichu;
public class Test8
{
public static void main(String[] args)
{
MyTest myTest = new MyTest();
}
}
class MyTest
{
public MyTest(String i)
{
System.out.println(i);
}
}
这个new MyTest();会报错,原因是我们定义的类MyTest有一个有参构造器则编译器就不会为我们创建一个无擦构造器,所以会报错,解决方案是我们自己显示的添加一个无参构造器或是在new MyTest();的时候加入一个参数new MyTest(1);
呵呵 今天就将这么多睡觉了 还有的下次看到了再将有不对的地方欢迎指出 谢谢。。。。。。