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");//
static String ss = get("1 static string");//
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");//
static String s2 = get("2 static string");//
}
java -- 容易放错的误区的更多相关文章
- Oracle EBS Java Applet报错:找不到类
Oracle EBS Home Page可以打开,但是无法打开EBS的Form,查看Java控制台,有错误报出. java控制台报错,如下: Java Plug-in 1.6.0_07 使用 JRE ...
- Android Studio 首次安装报错 Java.lang.RuntimeException:java.lang.NullPointerException...错
下次安装报:Java.lang.RuntimeException: java.lang.NullPointerException......错 只需在文件..\Android Studio\bin\i ...
- 使用 Gradle 编译 Java 项目时报错: Could not find Tools.jar
在使用Android studio进行编译成jar的时候,遇到Gradle 编译错误,听前辈们说是jdk的版本不对,于是乎就更新了一下jdk, 然而可能是我重新安装jdk的时候改变了安装路径, 在pr ...
- java常见报错及解决
Java常见报错信息: Java 常见异常种类 Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定 ...
- android studio java工程 报错
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com android studio java工程 ...
- Centos7 JDK安装过程中 解决java -version 报错: bash: /home/jdk1.8.0_161/bin/java: Permission denied
1.执行Linux命令 -----vim /etc/profile 编辑profile 文件,在里面添加: #set java enviroment JAVA_HOME=/opt/JavaHome ...
- debug运行java程序报错
debug运行java程序报错 ERROR: transport error 202: connect failed: Connection timed out ERROR: JDWP Transpo ...
- Java字符串易错方法总结
Java字符串易错方法总结 public String[] split(String regex) 和 public String[] split(String regex,int limit) li ...
- java @override 报错处理
转载自:http://blog.sina.com.cn/s/blog_9c7605530101kl9r.html 一.java @override 报错处理 做项目的时候,同事那边电脑上编译通过的ja ...
随机推荐
- 用NSAttributedString实现简单的图文混排
iOS7以后,因为TextKit的强大,可以用NSAttributedString很方便的实现图文混排(主要是利用了NSTextAttachment). 关于Textkit的牛逼之处,可以参考objc ...
- Android 手机卫士--参照文档编写选择器
本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...
- win7的6个网络命令
1 名称: Ipconfig 参数: /all : 显示详细信息 /renew: 更新所有适配器 /renew EL*:更新所有名称以EL为开头的连接 /release *Con*: 释放所有匹配的连 ...
- 前端开发必备!Emmet使用手册
介绍 Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具: 基本上,大多数的文本编辑器都会允许你存储和重用一些代码块,我们称之为"片段".虽然片 ...
- 萌新笔记——封装hiredis——C++与redis对接(一)(string的SET与GET操作)
在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接.于是查询了一些资料,最后找到了hiredis.然而直接用它的话,难免有点不方便.于是,对其进行封装. hiredis直接去g ...
- 64位下pwntools中dynELF函数的使用
这几天有同学问我在64位下怎么用这个函数,于是针对同一道题写了个利用dynELF的方法 编译好的程序 http://pan.baidu.com/s/1jImF95O 源码在后面 from pwn im ...
- linux 下安装web开发环境
以下使用 linux centos系统 一.JDK的安装 1.下载jdk-8u111-linux-x64.tar.gz 2.解压该文件,将解压后的文件复制到 /usr/local/jdk1.7 目录下 ...
- monkey之monkey命令详解
四大类-- 常用选项.事件选项.约束选项.调试选项 1.常用选项 --help:打印帮助信息 -v:指定打印信息的详细级别,一个-v增加一个级别 ,默认级别为 0 .用于指定反馈信息级别(信息级别就是 ...
- Gearman使用示例
最近的一个旧项目重构过程中,使用到了gearman这个开源项目,简单来讲,这是一个类似MQ的异步系统,一边派发任务,一边处理任务(有类似MQ中的消息发送方与接收方),目前支持java,php等多种语言 ...
- PHP 原创视频教程-网站开发新手视频教程
PHP 原创视频教程-网站开发新手视频教程 有偿招徒弟,,视频免费提供. 本视频教程,面向的是毫无经验的新手,快速上手的. 第一次做视频做的不好的,请各位看官多多包含. 第一部分,HTML 视频教程 ...