java -- 容易放错的误区
1.按值传递 和 引用传递
(基本类型包括基本类型的包装类 或者 字符串类型 传递的是 副本 并不会改变原来的值)|| 如果是引用类型 传递的是地址,会改变原来的值。
public class T { public static void main(String[] args) { String str = "logo"; change(str);//传递 System.out.println(str);//结果:logo Integer i = new Integer(10); changeInteger(i);//传递 System.out.println(i);//结果:10 } private static void change(String str){ str = "change"; } private static void changeInteger(Integer i){ i=100; } }
public static void main(String[] args){ String str = new String("str"); char [] c = {'1','2','3'}; char c1 = '0'; change(str,c,c1); System.out.println(str);//str 没变 System.out.println(c);//{'1','c','3'} 数组 改变 System.out.println(c1);//'0' 没变 } public static void change(String str,char[]c,char c1){ str = "change"; c[1]='c'; c1 = 'P'; }
2.子类继承父类。 方法的重写。 方法和返回值类型必须相同
class A { protected int method1(int a, int b) throws Exception { return 0; } } class B extends A{// 重写 1.子类的 访问修饰符大于服类 2.抛出的异常小于父类 public int method1(int a, int b)throws RemoteException { return 0; } }
3.类 中有 静态块 块 构造方法 时 初始化的顺序如下:
不管是 T t = new T1(); 还是 T1 t = new T1();
都是先调用 父类的静态块,然后 子类的静态块,然后 才是 父类的 块 和构造方法,最后子类 的块 和构造方法
结果如下:
t static {}
t1 static{}
T {}
T()
t1 {}
t1()
import java.lang.reflect.Array; import java.util.Scanner; public class T { static{ System.out.println("t static {}"); } { System.out.println("T {}"); } T(){ System.out.println("T()"); } public static void main(String[] args) { T1 t = new T1(); } } class T1 extends T{ static{ System.out.println("t1 static{}"); } { System.out.println("t1 {}"); } T1(){ System.out.println(" t1()"); } }
4.基本类型的包装类 的 == 比较
Integer a = new Integer(100);// new出来的已分配内存对象 Integer b = new Integer(100); Double c = new Double(10.1); Double d = new Double(10.1); System.out.println(a==b);//false System.out.println(c==d);//false Integer e = 20; //自动装配 Integer f = 20; System.out.println(e==f);//true;
5.Object 的 equals 和普通的 equals的区别
如下:
public class Test extends Object{ public static void main(String[] args) { Test o = new Test(); Test o1 = new Test(); if(o.equals(o1)){ System.out.println("aaa"); }//输出:hello // aaa //------------------- Object o2 = new Test(); Object o3 = new Test(); if(o2.equals(o3)){//false 会调用Object的 equals方法 System.out.println("bbb"); } } public boolean equals(Test other){//此方法的 方法参数类型不一样 没有重写Object的equals方法 System.out.println("hello"); return true; } public boolean equals(Object obj) {//此为Object的 equals方法重写 return (this == obj); } }
6.Thread 的start()和run()的区别一个线程对象只能调用一次start方法.从new到等待运行是单行道,所以如果你对一个已经启动的线程对象再调用一次start方法的话,会产生:IllegalThreadStateException异常.
可以被重复调用的是run()方法。
Thread类中run()和start()方法的区别如下:
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;
7.Http 和 Https 的区别
在URL前加https://前缀表明是用SSL加密的。 你的电脑与服务器之间收发的信息传输将更加安全。
Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。http的连接很简单,是无状态的,...
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
要比http协议安全
8.Mybatis 中 ${参数} 和 #{参数}的区别
默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。
示例1:
执行SQL:Select * from emp where name = #{employeeName}
参数:employeeName=>Smith
解析后执行的SQL:Select * from emp where name = ?
执行SQL:Select * from emp where name = ${employeeName}
参数:employeeName传入值为:Smith
解析后执行的SQL:Select * from emp where name =Smith
综上所述、${}方式会引发SQL注入的问题、同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,能使用#{}的情况下就不要使用${}
9.字符串操作 比较 ==
String s = "abc"; String s1 = s+""; System.out.println(s==s1);//false String s2 = "abc"; System.out.println(s==s2);//true; String s3 = "ab"+"c"; System.out.println(s==s3);//true; String s4 = '1'+'2'+'3'+"abc"; System.out.println((int)'1');//49 System.out.println((int)'2');//50 System.out.println((int)'3');//51 System.out.println(s4);//150abc
10. null的强转换后 调用static 和非 static方法
public class Test{ public static void main(String[] args){ ((Test)null).tess();// test 类加载后 可直接调用static方法 ((t5)null).te();// tttt 类加载后 可直接调用static方法 ((t5)null).te1();// NullPointerException 非静态方法报错 } public static void tess(){ System.out.println("tess"); } } class t5{ t5(){ System.out.println("t"); } public static void te(){ System.out.println("tttt"); } public void te1(){ System.out.println("t111"); } }
11.基本数据类型 和 它的包装类型 == 和 equals 比较都是true
public static void main(String[] args){ Integer b = new Integer(5); int a = 5; System.out.println(a==b);//true System.out.println(b.equals(a));//true }
12.继承关系中,成员变量 是 调用方法获得的值,的执行顺序:
public class Su { String str = get("1 string");//3 static String ss = get("1 static string");//1 static String get(String string) { System.out.println(string); return string; } public static void main(String[] args) { new s(); } } class s extends Su{ String s = get("2 string");//4 static String s2 = get("2 static string");//2 }