`
shixiuteng
  • 浏览: 38733 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

非常容易搞混的Java知识点

    博客分类:
  • java
阅读更多

以下几个知识点是非常容易搞混的Java知识点。不准开编译器,并且先不看答案,要是能全部答对,那Java基础是挺牢固的。如果答对了,还能分析出具体原因,那算你NB。

一、关于Switch
代码:

Java代码 复制代码
  1. public class TestSwitch {   
  2.     public static void main(String[] args) {   
  3.         int i = 2;   
  4.         switch (i) {   
  5.         case 1:   
  6.             System.out.println(1);   
  7.         case 2:   
  8.             System.out.println(2);   
  9.         case 3:   
  10.             System.out.println(3);   
  11.         default:   
  12.             System.out.println(4);   
  13.         }   
  14.     }   
  15. }  
public class TestSwitch {
	public static void main(String[] args) {
		int i = 2;
		switch (i) {
		case 1:
			System.out.println(1);
		case 2:
			System.out.println(2);
		case 3:
			System.out.println(3);
		default:
			System.out.println(4);
		}
	}
}





结果:
2
3
4

分析:
少了break;所以2以下的case和default都执行了一遍。

二、Equals和==运算符
代码:

Java代码 复制代码
  1. public static void test() {   
  2.     String x = "hello";   
  3.     String y = "world";   
  4.     String z = new String("helloworld");   
  5.     String a = "helloworld";   
  6.     System.out.println("x+y equals z:" + (x + y).equals(z));   
  7.     System.out.println("a == z:" + (a == z));   
  8.     System.out.println("x == hello:" + (x == "hello"));   
  9.     System.out.println("a == helloworld:" + (a == "hello" + "world"));   
  10.     System.out.println("a == x+y:" + (a == (x + y)));   
  11. }  
	public static void test() {
		String x = "hello";
		String y = "world";
		String z = new String("helloworld");
		String a = "helloworld";
		System.out.println("x+y equals z:" + (x + y).equals(z));
		System.out.println("a == z:" + (a == z));
		System.out.println("x == hello:" + (x == "hello"));
		System.out.println("a == helloworld:" + (a == "hello" + "world"));
		System.out.println("a == x+y:" + (a == (x + y)));
	}





结果:
x+y equals z:true
a == z:false
x == hello:true
a == helloworld:true
a == x+y:false

分析:
1.String.equals()方法比较的是字符串的内容,所以(x + y).equals(z)为true.
2.“==”比较的是 String 实例的引用,很明显 a 和z 并不是同一个 String 实例,所以(a == z)为false.
3.根据常量池的知识,容易得知(x == "hello")和(a == "hello" + "world")都为true.
(常量池指的是在编译期被确定并被保存在已编译的.class 文件中的一些数据。它包含了
关于方法、类、接口等,当然还有字符串常量的信息。也就是所谓的持久代。)
4.那么(a == (x + y))为什么是false呢?这点暂点有点不大清楚。初步认为是x+y是引用相加,不能放入常量池。

三、Override覆盖
代码:

Java代码 复制代码
  1. public class Parent {   
  2.   
  3.     public static String say() {   
  4.         return "parent static say";   
  5.     }   
  6.   
  7.     public String say2() {   
  8.         return "parent say";   
  9.     }   
  10. }   
  11.   
  12. public class Child extends Parent {   
  13.     public static String say() {   
  14.         return "child static say";   
  15.     }   
  16.   
  17.     public String say2() {   
  18.         return "child say";   
  19.     }   
  20. }   
  21.   
  22. /**  
  23.  * @author 子弹哥  
  24.  *   
  25.  */  
  26. public class OverrideTest {   
  27.   
  28.     public static void main(String[] args) {   
  29.         Parent p = new Child();   
  30.         System.out.println(p.say());   
  31.         System.out.println(p.say2());   
  32.   
  33.     }   
  34.   
  35. }  
public class Parent {

	public static String say() {
		return "parent static say";
	}

	public String say2() {
		return "parent say";
	}
}

public class Child extends Parent {
	public static String say() {
		return "child static say";
	}

	public String say2() {
		return "child say";
	}
}

/**
 * @author 子弹哥
 * 
 */
public class OverrideTest {

	public static void main(String[] args) {
		Parent p = new Child();
		System.out.println(p.say());
		System.out.println(p.say2());

	}

}






结果:
parent static say
child say
分析:
1.我们创建了一个Parent类的实例。变量 p 的数据类型为 Parent 类 但是它仍旧是 Child 类的一个实例。因为Child类覆盖了Parent类的方法say2(),所以p.say2()调用为子类的方法。
2.为什么p.say()却是调用父类Parent的方法呢?因为Java中规定“实例方法被覆盖,静态方法被隐藏”.
关于Override的一些规则:
用子类的静态方法隐藏父类中同样标识的实例方法是不合法的,编译器将会报错;
用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的,编译器同样会报错;
带关键字 final的方法(静态和实例方法)都不能被覆盖;
实例方法能够被覆盖;
抽象方法必须在具体类中被覆盖。

四、Java强类型
代码:

Java代码 复制代码
  1. /**  
  2.  * @author 子弹哥  
  3.  *   
  4.  */  
  5. public class Type {   
  6.   
  7.     public static void main(String[] args) {   
  8.         double i = 5.0;   
  9.         double j = 1 / 4 + 3 / 4 + i + 12 / 6.0 + 3 / 4 + 1 / 4;   
  10.         System.out.println(j);   
  11.     }   
  12.   
  13. }  
/**
 * @author 子弹哥
 * 
 */
public class Type {

	public static void main(String[] args) {
		double i = 5.0;
		double j = 1 / 4 + 3 / 4 + i + 12 / 6.0 + 3 / 4 + 1 / 4;
		System.out.println(j);
	}

}








结果:
7.0

分析:
Java 是强类型的 strongly type,它支持8 种基本数据类型。通过对这些基本数据类型用法的严格检查 Java 编译器能够及时地在开发过程中捕捉到许多简单细微的错误。基本数据类型的转换可以隐性地发生,所以转换时会有精度损失。由于1/4和3/4发生隐性类型转换,精度损失,不会生成0.25和0.75,所以有分号的数都为0。

五、假构造函数
代码:

Java代码 复制代码
  1. /**  
  2.  * @author 子弹哥  
  3.  *   
  4.  */  
  5. public class Constructor {   
  6.   
  7.     private int a, b, c;   
  8.   
  9.     public void Constructor() {   
  10.         a = 3;   
  11.         b = 5;   
  12.         c = a + b;   
  13.     }   
  14.   
  15.     public void test() {   
  16.         System.out.println("The value of c :" + c);   
  17.     }   
  18.   
  19.     public static void main(String[] args) {   
  20.         Constructor c = new Constructor();   
  21.         c.test();   
  22.     }   
  23. }  
/**
 * @author 子弹哥
 * 
 */
public class Constructor {

	private int a, b, c;

	public void Constructor() {
		a = 3;
		b = 5;
		c = a + b;
	}

	public void test() {
		System.out.println("The value of c :" + c);
	}

	public static void main(String[] args) {
		Constructor c = new Constructor();
		c.test();
	}
}








结果:
The value of c :0

分析:
public void Constructor()并不是一个真正的构造函数,而是一个方法。所以c的值为默认值0.


六、提前引用
代码:

Java代码 复制代码
  1. /**  
  2.  * @author 子弹哥  
  3.  *   
  4.  */  
  5. public class ForwardReference {   
  6.   
  7.     static int first = test();   
  8.     static int second = 2;   
  9.   
  10.     static int test() {   
  11.         return second;   
  12.     }   
  13.   
  14.     public static void main(String[] args) {   
  15.         System.out.println("first = " + first);   
  16.     }   
  17.   
  18. }  
/**
 * @author 子弹哥
 * 
 */
public class ForwardReference {

	static int first = test();
	static int second = 2;

	static int test() {
		return second;
	}

	public static void main(String[] args) {
		System.out.println("first = " + first);
	}

}





结果:
first = 0

分析:
由于在初始化second之前test方法就访问了它,那么方法得到的是second的默认值,即 0。 因此输出结果first= 0,而不是2。假如你使用方法调用来初始化静态变量,那么你必须保证 这些方法并不依赖于在它们之后声明的其它静态变量。静态变量以及静态初始化块是在类被加载进 JVM 时执行初始化操作的。Java 语言规范8.5节指出“静态初始化块和静态变量是按照其在代码中出现的顺序依次执行初始化操作的,而不能在类变量声明出现之前就引用它”。


七、对象引用
代码:

Java代码 复制代码
  1. /**  
  2.  * @author 子弹哥  
  3.  *   
  4.  */  
  5. public class TestRef {   
  6.   
  7.     public static void main(String[] args) {   
  8.         StringBuffer a = new StringBuffer("a");   
  9.         StringBuffer b = new StringBuffer("b");   
  10.         append(a, b);   
  11.         System.out.println(a.toString() + "," + b.toString());   
  12.         b = a;   
  13.         System.out.println(a.toString() + "," + b.toString());   
  14.     }   
  15.   
  16.     public static void append(StringBuffer a, StringBuffer b) {   
  17.         a.append(b);   
  18.         b = a;   
  19.     }   
  20. }  
/**
 * @author 子弹哥
 * 
 */
public class TestRef {

	public static void main(String[] args) {
		StringBuffer a = new StringBuffer("a");
		StringBuffer b = new StringBuffer("b");
		append(a, b);
		System.out.println(a.toString() + "," + b.toString());
		b = a;
		System.out.println(a.toString() + "," + b.toString());
	}

	public static void append(StringBuffer a, StringBuffer b) {
		a.append(b);
		b = a;
	}
}







结果:
ab,b
ab,ab


分析:
大家来分析一下这题,我还没有完全理解。
我的分析,可能是错的,哈哈,算是抛砖引玉。

1.a.append(b);-->ab 。因为a是引用,所以调用a的方法,相当于直接调用jvm中的a,所做的append也相当于直接在对象上操作,生效。
2.append方法中第一次b=a,-->b。因为a,b都为main方法内局部变量,跨append方法作用域b对a的引用不生效。
3.main方法中第二次b=a,-->ab。因为在同一作用域方法中,b对a的引用生效,。

分享到:
评论

相关推荐

    容易搞混的Java知识点

    容易搞混的Java知识点,面试题,面试宝典

    Java初学者容易混淆的知识点

    Java初学者容易混淆的知识点

    java综合知识点总结

    java学习过程中一些知识点和易混淆点,包括基础篇,框架篇,数据库篇以及具体业务篇

    java基础学习总结的知识点 java基础总结

    对java中一些容易混淆的知识点进行了总结

    学习Java时自己整理的知识点 4

    这些txt文本都是我自己学习Java时整理的一些容易搞混的知识点.每天的知识点放在一个文本里,所以有的多一点,有的少一点.不过还是希望能和大家分享,共同进步...

    Java初学者容易混淆的几个问题

    Java初学者容易混淆的几个问题 值得看看

    java知识总结------关键知识点总结

    java知识总结针对java学习过程可能出现的一些容易混淆的问题进行了汇总

    个人对java基础的一些知识点常误区

    这里记录本人学习java时经常记不住或有误区、或易混淆的知识点记录

    错题集,偏JAVA知识点

    北大青鸟S1考试题,做了下十几套卷子,把一些我认为比较混淆和重要以及我错误的题目摘了出来,加入了自己的分析

    学习Java时自己整理的知识点_1

    这些txt文本都是我自己学习Java时整理的一些容易搞混的知识点,每天的知识点放在一个文本里,所以有的多一点,有的少一点,不过还是希望能和大家分享,共同进步...

    基于java集合中的一些易混淆的知识点(详解)

    下面小编就为大家带来一篇基于java集合中的一些易混淆的知识点(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    学习Java时自己整理的知识点5

    这些txt文本都是我自己学习Java时整理的一些容易搞混的知识点.每天的知识点放在一个文本里,所以有的多一点,有的少一点.不过还是希望能和大家分享,共同进步...

    学习Java时自己整理的知识点_2

    这些txt文本都是我自己学习Java时整理的一些容易搞混的知识点.每天的知识点放在一个文本里,所以有的多一点,有的少一点.不过还是希望能和大家分享,共同进步...

    学习Java时自己整理的知识点_3

    这些txt文本都是我自己学习Java时整理的一些容易搞混的知识点.每天的知识点放在一个文本里,所以有的多一点,有的少一点.不过还是希望能和大家分享,共同进步...

    Java常见问题演示

    对Java中容易混淆的知识点的整理,static的使用

    Java 基础知识部分总结

    本文就 java 基础部分容易混淆的一些知识点进行了一下总结。因为 Java 本身知识点非常多,不可能在很短的篇幅就能叙述 完,而且就某一个点来讲,如欲仔细去探究,也能阐述的非常多。这里不做全面仔细的论述,仅做为...

    JAVA上百实例源码以及开源项目

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    java开源包11

    Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash 用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC...

    java开源包6

    Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash 用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC...

Global site tag (gtag.js) - Google Analytics