无聊的问题总结.
1.&和&&的区别.
java中的逻辑运算符:
& 逻辑与(AND)
| 逻辑或(OR)
^ 逻辑抑或(XOR)
! 逻辑非
&& 条件与(AND)
|| 条件或(OR)
注意&&和||会进行短路计算,第一个条件可以判断表达式的结果时,不对后面的条件进行判断了.
位操作运算符:
& 按位与(AND)
| 按位或(OR)
^ 按位抑或(XOR)
~ 按位取反
所以,问&和&&的区别时,千万别仅仅说一个是位操作符,一个是逻辑运算符.
2. short s=0;
s+=1;
正确,而
s=s+1;
不正确,为什么?
java中byte ,short,char之类的运算都是提升为int类型进行的,所以运算完之后要进行强制类型转换,复合赋值操作符编译器会自动添加强制转换操作.建议:尽量不要对byte,short,char这样的类型使用复合赋值运算符.
3.String str=new String("abc");
这句话创建了几个对象?
如果有人这么问问题,直接不要理会了,这个问题太难回答.不精通jvm的话还难精确的说会创建很多"对象".自己目前能想到的,比如String类型对应的Class对象,这个Class内部的对象就好多个,可以去看Class类的源代码.
如果问创建了多少个"String对象",那起码还好说点,起码有个限定是吧?首先对于"abc",如果常量池中已经有了的话,那就不用创建了,如果没有肯定要解析常量池,并创建String对象,进行intern()操作.所以这里肯定会存在一个常量池里的对象.new String("abc");当然会导致在堆中创建一个对象.这里自己也不知道答案该如何归纳,1个或2个?等深入的学习一下再总结.
【有资料说字符串字面常量是在类加载的时候创建的,那样的话,执行上面语句的时候肯定只有一个String对象创建,因为执行这句话之前肯定要加载类,继而创建字符串字面量对应的对象,也就说执行这句话之前,"abc"已经存在了,这句话可以说是创建了一个String对象。但是,问问题的人可能根本不知道自己想问什么,所以答案可能是五花八门的了。】
String str="a"+"b"+"c"+"d";
这句话会创建几个对象?
用SUN的jdk处理,经过javac编译之后,常量运算已经直接处理掉了,所以生成的class文件里的常量池表中有"abcd"这个串.(遵从java语言规范的编译器应该都是这个样子的)
所以执行这句话的时候,只会有一个对象.对于连编译和运行都分不清的人就不用多解释了.
这个问题有人用组合的方法得出很多结论,后来看到有人说,Thinking in Java上介绍的,内部原理是用的StringBuilder来连接的,这里有2个问题,第一,如果这个例子会用StringBuilder来连接的话,那么String对象还是只有1个,第二,如果问一共有几个对象,再考虑StringBuilder来连接的问题的话,那这里面起码又带来了StringBuilder类对应的Class对象及其内部对象,这个数量就很大了.一个值得思考的问题是,既然能看到Thinking In Java中的结论,为什么不能看看TIJ中分析问题的思路呢.
顺便写点测试代码:
- publicclassMain{
- publicstaticvoidmain(Stringarg[]){
- Stringstr="a"+"b"+"c"+"d";
- }
- }
按照TIJ上的方法,也是我喜欢的方法:
javap -c Main
- Compiledfrom"Main.java"
- publicclassMainextendsjava.lang.Object{
- publicMain();
- Code:
- 0:aload_0
- 1:invokespecial#1;
- 4:return
- publicstaticvoidmain(java.lang.String[]);
- Code:
- 0:ldc#2;
- 2:astore_1
- 3:return
- }
可以看到,里面只有一个String abcd.
"a"+"b"+"c"+"d"都是常量的缘故,编译的时候就直接处理掉了,所以不会在运行的时候再通过StringBuilder来连接了.
改变代码,换个例子:
- publicclassMain{
- publicstaticvoidmain(Stringarg[]){
- Strings="c";
- Stringstr="a"+"b"+s+"d";
- }
- }
这个会出现几个String?
javap -c Main
- Compiledfrom"Main.java"
- publicclassMainextendsjava.lang.Object{
- publicMain();
- Code:
- 0:aload_0
- 1:invokespecial#1;
- 4:return
- publicstaticvoidmain(java.lang.String[]);
- Code:
- 0:ldc#2;
- 2:astore_1
- 3:new#3;
- 6:dup
- 7:invokespecial#4;
- 10:ldc#5;
- 12:invokevirtual#6;
- 15:aload_1
- 16:invokevirtual#6;
- 19:ldc#7;
- 21:invokevirtual#6;
- 24:invokevirtual#8;
- 27:astore_2
- 28:return
- }
可以发现这个例子中的String 有,"c","ab"(编译时对可确定的常量进行处理了),"d",以及最后通过StringBuilder.toString生成的String "abcd".
看书的意义是什么?起码不是背结论.
4.<java堆与栈>,一个垃圾帖子却被到处推荐来推荐去,很诡异的现象,很多人也喜欢给别人讲问题的时候引用,自己批评过一些,慢慢的感觉到没有必要了.原贴只是一个习作,貌似是作者初学的时候的一个总结,已经是若干年前的事情了,如果现在把原作者找出来让他自己看,估计也会出汗了.
分析参考http://zangxt.iteye.com/blog/440330
5.类的初始化顺序,这个实在没有必要讨论,自己运行一下就知道了,最笨的方法就是自己调试,单步跟踪,但也是收获最大的.
6.以前总有人说,private 的方法默认是final的,后来又有人说static 方法默认也是final.第一个创造这个说法的人可能是为了让自己理解一些东西方便一些,但是慢慢就认为是真理了。
分析参考http://zangxt.iteye.com/blog/461227
7.java的方法调用中,参数传递机制为pass by value.
很多人喜欢生造一个传引用的说法,但根本不知道传引用是什么意思.这点在<The Java Programming Language>(作者里有个人叫做James Gosling)上有详细和权威的说明,也说明了java为什么没有pass by reference ,<Core Java>中有内存图的说明,龙书<编译原理:技术与工具>第二版里面也有说明.其实真正把引用和对象两个概念理解了,也就不会有乱七八糟的说法了.如果不理解,记住!
分享到:
相关推荐
在这个资源中,我们将总结一些Java基础常见问题,涵盖面向对象、构造方法、接口、抽象类、String和Object等方面的知识点。 1. 面向对象编程 面向对象编程是一种编程范式,它将问题解决方式从面向过程转换为面向...
Java 基础知识总结 Java 是一种广泛使用的编程语言,由 Sun 公司的 James Gosling 等人于 1991 年开始开发。Java 有三种技术架构:JavaEE、JavaSE 和 JavaME。JavaSE 是桌面应用程序的开发基础,JavaEE 是企业环境...
Java是一种广泛使用的面向对象的编程语言,其基础知识涵盖了多个方面,包括语法、面向对象特性、异常处理、多线程...以上只是Java基础知识的一个概述,每个话题都值得深入探讨和实践,不断学习和总结是提升技能的关键。
Java基础知识总结 Java是一种广泛使用的编程语言,掌握Java基础知识是每个Java开发者所必需的。以下是Java基础知识的总结,涵盖了异常、泛型、反射、IO和注解等方面。 一、异常 在Java中,所有的异常都有一个共同...
JAVA基础知识总结 JAVA基础知识总结 JAVA基础知识总结
这篇“Java基础知识总结(经典)”涵盖了Java开发中的核心概念和重要知识点,旨在为初学者和有经验的开发者提供一个全面的回顾。以下是主要的学习点: 1. **Java环境配置**:在开始编程之前,必须安装Java ...
Java基础常见面试题总结 基础概念与常识和常见面试题
"java基础总结资料"涵盖了Java语言的核心概念,是学习和复习Java基础知识的重要资源。以下是一些主要的知识点: 1. **Java语法基础**:包括变量声明、数据类型(基本类型和引用类型)、运算符、流程控制(如if语句...
Java基础知识总结 一些的基础知识 适合初学者和回顾以前的知识
【Java学习笔记】JavaWeb开发中常见问题总结 在JavaWeb开发中,开发者经常会遇到各种问题,这些问题涵盖从基础语法到高级设计模式的各个方面。以下是一些关键知识点的概述: 1. **Java基础知识**: - **Classpath...
设计模式是解决软件设计中常见问题的模板,比如工厂模式、单例模式、观察者模式等。这些模式帮助开发者编写可维护、可扩展的代码。 Java语言基础的学习不仅仅是掌握语法,更重要的是理解面向对象的思想,并能够熟练...
【Java基础总结大全】 Java是世界上最流行的编程语言之一,其跨平台特性主要依赖于Java虚拟机(JVM)。JVM是Java的核心组成部分,它解析并执行编译后的Java字节码,确保Java程序可以在任何支持JVM的操作系统上运行...
Java是世界上最流行的编程语言之一,尤其在企业级应用...以上就是"Java 基础核心总结"文件中涵盖的主要内容。通过深入学习和实践这些知识点,开发者可以扎实掌握Java编程,为进一步的进阶学习和项目开发打下坚实基础。
java基础知识点总结及面试问题java基础知识点总结及面试问题java基础知识点总结及面试java基础知识点总结及面试问题
这份"Java基础加强-个人总结doc"文档,结合了张孝祥老师的PPT,为我们提供了全面而深入的学习材料。以下是这份文档可能涵盖的一些核心知识点: 1. **基础知识**:这部分涵盖了Java语言的基础语法,包括变量、数据...
Java基础总结大全涵盖了Java编程语言的核心概念,从JVM、JRE和JDK的区别,到环境变量的设置,再到变量的定义和类型转换,深入浅出地讲解了Java的基础知识。 1. JVM、JRE和JDK: - JVM(Java Virtual Machine)是...
Java 基础知识总结是 Java 程序员不可或缺的一部分,本总结将涵盖 Java 的基础知识,包括 Java 概述、Java 语法基础、变量、数据类型、运算符、控制语句、方法、数组、继承、多态、接口、异常、IO 流等。 一、Java ...
### Java基础知识总结(绝对经典) #### 一、Java概述 - **起源与发展**:Java语言始于1991年Sun公司的James Gosling等人所开发的Oak语言,原计划用于控制嵌入式设备如有线电视交换盒和个人数字助理(PDA)。1994年...
本资料集是Java基础知识的精华总结,旨在帮助初学者快速掌握Java编程的核心概念。 一、Java基础语法 1. 变量与数据类型:Java提供了八种基本数据类型,包括整型(byte, short, int, long)、浮点型(float, double...