- 浏览: 184671 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (99)
- IT生活 (9)
- Oracle (3)
- java模式 (0)
- j2se (9)
- uml (0)
- javabean (3)
- 网络 (3)
- java 并发 (2)
- java xml (4)
- POI (1)
- jbpm (2)
- apache httpclient (1)
- tomcat (5)
- ssh2 错误 (2)
- mina_xsocket (0)
- struts2 (1)
- easymock (2)
- tomcat远程调试和加入JMS (1)
- eclipse_C/C++ (1)
- 数据结构 (1)
- spring (3)
- 工作记录 (6)
- 学习英语 (1)
- flex4_flexViewer_arcgis (4)
- esb (0)
- java多线程 (3)
- jvm_并发编程 (1)
- 流程 (1)
- 测试 (1)
- terracotta集群 (3)
- jvm_调优_gc_监控命令 (11)
- IT _视频 (1)
- log4jUtil (2)
- jrebel使用 (1)
- lucene-solr (3)
- linux_centos (4)
- hadoop (3)
- 集群部署 (1)
最新评论
-
叮咚可乐名:
Java并发编程和高并发解决方案视频课程网盘地址:https: ...
java处理高并发高负载类网站的优化方法 . -
q8txy8q:
非常不错,thanks.
推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1 -
maimode:
好东西,非常实用
java操作XML文件 dom 篇 -
junJZ_2008:
嗯,就应该这样,常言道:好记性,不如乱笔头~!现在不知道是年纪 ...
第一次写博客
以下几个知识点是非常容易搞混的Java知识点。大家不准开编译器,并且先不看答案,要是能全部答对,那Java基础是挺牢固的。如果答对了,还能分析出具体原因,那算你NB。近段时间有参加一些公司的面试,做了一些基础题,发现总有掌握得不好的地方。今天一并总结了这些问题,希望对大家有所帮助。如果大家认为还有其它易混淆的地方,也可以跟贴发出来,大家一起讨论。至于想投新手贴的,请先测测你肚里的货。确实有货,又想投的,就投吧,哈哈。
一、关于Switch
代码:
- 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);
- }
- }
- }
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和==运算符
代码:
- 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)));
- }
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覆盖
代码:
- 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());
- }
- }
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强类型
代码:
- /**
- * @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);
- }
- }
/** * @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。
五、假构造函数
代码:
- /**
- * @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();
- }
- }
/** * @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.
六、提前引用
代码:
- /**
- * @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);
- }
- }
/** * @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节指出“静态初始化块和静态变量是按照其在代码中出现的顺序依次执行初始化操作的,而不能在类变量声明出现之前就引用它”。
七、对象引用
代码:
- /**
- * @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;
- }
- }
/** * @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类静态域、块,非静态域、块,构造函数的初始化顺序
2014-01-22 10:10 847引用 :http://ini.iteye.com/blog ... -
Java中获取键盘输入值的三种方法
2013-06-09 16:44 839Java中获取键盘输入值的三种方法 以下将列出几种方 ... -
提升JSP页面响应速度的七大技巧
2012-09-06 11:23 752方法一:在servlet的init ... -
java GridBag 布局
2010-12-02 14:20 991panelBasic.add(this.lbs ... -
java动态代理- 三
2010-11-06 14:53 856Java代码 public ... -
java动态代理- 二
2010-11-06 14:32 898Proxy 提供用于创建动态代理类和实例的静态方法。简洁方法: ... -
java动态代理- 一
2010-11-06 14:29 800java 动态代理深度学习, 一.相关类及其方法: jav ... -
java 内部类
2010-11-04 09:22 895关于JAVA匿名内部类的一点讨论.基本理论:--------- ...
相关推荐
这套课程既可以作为从零基础开始学习的JAVA基础到高级学习教程,对于有JAVA基础的同学来说可以略过前面的JAVA基础章节,直接学习后续的JAVA高级部分课程。更可以灵活的作为章节技术,进行针对性的JAVA学习。还是要...
java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础...
市面上目前流传的java基础视频教程都是讲一些最基础的java语法和相关API的应用,然而用人单位对初级程序员的要求越来越高,那些讲解java基础语法的视频教程已经无法满足大众的学习要求。本套视频教程录制完中国第一...
Java基础 java学习笔记 Java Java基础Markdown学习笔记,可转换成PDF、Word等格式
Java基础入门教程 第5章 Java基础类的应用(共42页).ppt Java基础入门教程 第6章 集合框架(共28页).ppt Java基础入门教程 第7章 Java中的异常处理(共26页).ppt Java基础入门教程 第8章 文件流的输入输出操作...
资源名称:Java基础加强系列视频课程资源目录:【】黑马程序员Java基础加强(01-10)【】黑马程序员Java基础加强(11-20)【】黑马程序员Java基础加强(21-30)【】黑马程序员Java基础加强(31-40)【】黑马程序员...
《Java 基础入门》课后习题答案 第 第 1 章 Java 开发入门 一、填空题 1、 Java EE、Java SE、Java ME 2、 JRE 3、 javac 4、 bin 5、 path、classpath 二、选择题 1、ABCD 2、C 3、D 4、B 5、B 三、简答题 1、 面向...
Java基础加强Java基础加强Java基础加强
Java基础思维导图涵盖大部分Java基础重点内容。适用于新手小白理解Java学习之路。
\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类
完整版精品java课件 Java基础入门教程 Java程序设计 第1章 Java语言概述(共38页).ppt 完整版精品java课件 Java基础入门教程 Java程序设计 第2章 java语言基础(共31页).ppt 完整版精品java课件 Java基础入门教程 ...
java基础开发第一册希望对你们有帮助,其他还有很多资料
Java基础入门.pdf
java基础知识的培训ppt,对于java初学者来说可以有一些作用。
Java 基础入门,适合初学入门java的同学
java基础知识大全(必看经典),里面包含了最基本的java基础知识,适合学习java的初学者和想要复习java基础的同学。
Java基础入门教程 第5章 Java基础类的应用(共42页).ppt Java基础入门教程 第6章 集合框架(共28页).ppt Java基础入门教程 第7章 Java中的异常处理(共26页).ppt Java基础入门教程 第8章 文件流的输入输出操作...
java基础的案例分析和实例教学,适合新手及回顾查阅,对于夯实基础有好处
Java 基础
java基础知识,帮助初学者更快更好地掌握java。ppt内容具体易懂,希望对刚接触java的初学者有所帮助。