`

java 基础

    博客分类:
  • j2se
阅读更多

以下几个知识点是非常容易搞混的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多线程并发设计+Spring高级+数据库开发+JAVA基础等

    这套课程既可以作为从零基础开始学习的JAVA基础到高级学习教程,对于有JAVA基础的同学来说可以略过前面的JAVA基础章节,直接学习后续的JAVA高级部分课程。更可以灵活的作为章节技术,进行针对性的JAVA学习。还是要...

    免费开源Java 基础镜像

    Fabric8 Java 基础镜像 这是各种 Fabric8 项目中使用的 Java Docker 基础镜像的存储库。 这些镜像的 Docker 构建文件由Fish-pepper生成 ,fish-pepper 是一个用于生成 Docker 构建的复杂模板系统。fish-pepper允许...

    java基础知识大全(必看经典)

    Java 基础知识大全 本资源摘要信息是 Java 基础知识大全的总结,涵盖了 Java 语言的基本概念、特点、历史发展等方面的知识点。以下是本资源摘要信息的详细内容: 一、 Java 语言的特点 * 面向对象:Java 语言是...

    《Java基础入门》-课后习题答案.doc

    本文将对《Java 基础入门》课后习题答案进行总结,涵盖了 Java 基础知识点,包括 Java 开发入门、Java 基础类、变量类型、运算符、控制流语句、方法重载等。 一、Java 开发入门 * Java EE、Java SE、Java ME 是 ...

    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基础教程(第3版)_ppt.rar

    《Java基础教程(第3版)_ppt.rar》是一个包含多个PPT文件的压缩包,主要用于教学目的,提供了关于Java编程语言的基础知识。这个资源涵盖了Java的核心概念,从基本的类和对象到高级特性如多线程和数据库操作。以下是...

    Java基础案例教程(第2版)-教学设计.zip

    《Java基础案例教程(第2版)》是一本旨在教授初学者Java编程基础知识的教材,其教学设计旨在通过实例引导学生深入理解Java语言的核心概念。本教程覆盖了从环境搭建到程序设计的各个环节,旨在帮助学生建立起坚实的...

    Java基础加强系列视频课程

    资源名称:Java基础加强系列视频课程资源目录:【】黑马程序员Java基础加强(01-10)【】黑马程序员Java基础加强(11-20)【】黑马程序员Java基础加强(21-30)【】黑马程序员Java基础加强(31-40)【】黑马程序员...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    《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基础案例教程(第2版)》课后习题答案1

    【Java基础知识点】 1. **Java的起源与特性** - Java是由SUN Microsystems公司(后被Oracle收购)开发的一种面向对象的编程语言。 - Java有三个主要版本:Java Standard Edition (JavaSE),用于桌面应用;Java ...

    黑马程序员java基础试题、笔记

    "黑马程序员java基础试题、笔记"这个压缩包资源为Java初学者和希望加入"黑马程序员"培训课程的学员提供了丰富的学习材料。这些资源包括面试问题合集、整理的资料、Android面试题、学员入学面试总结、面试技巧、必须...

    Java 基础入门(传智播客出品).pdf

    Java 基础入门,适合初学入门java的同学

    java基础练习题(基础)精选

    Java基础练习题由本人整理并上传,非常适合于初学者加强巩固自己的知识,编程学好的唯一途径就是多练习。

    java基础知识的培训ppt

    java基础知识的培训ppt,对于java初学者来说可以有一些作用。

    java基础案例教程

    java基础的案例分析和实例教学,适合新手及回顾查阅,对于夯实基础有好处

    java基础知识 ppt

    java基础知识,帮助初学者更快更好地掌握java。ppt内容具体易懂,希望对刚接触java的初学者有所帮助。

Global site tag (gtag.js) - Google Analytics