java里什么是等价(java-=是什么意思)
大家好,关于java里什么是等价很多朋友都还不太明白,今天小编就来为大家分享关于java-=是什么意思的知识,希望对各位有所帮助!
Java迷题:等于还是不等于
表面上看来这只是一些基础的问题当真正的了解了以后你就会发现啊原来是这么一回事!下文是几道Java谜题不仔细分析就会犯错哦
等于还是不等于?
看来看下面的一段代码
代码片段
public static void main(final String[] args){ Integer a= new Integer(); Integer b=; System out println(a== b);}
这段代码的输出是什么?相信很多人都会很容易的猜到 false因为a b两个对象的地址不同用==比较时是false恭喜你答对了
再看下面的一段代码
代码片段
public static void main(final String[] args){ Integer a=; Integer b=; System out println(a== b);}
你可能会回答这没什么不一样啊所以还是false很遗憾如果你执行上面的一段代码结果是true
上面的代码可能让你有些意外那好吧再看看下面的这段代码
代码片段
public static void main(final String[] args){ Integer a=; Integer b=; System out println(a== b);}
结果是true吗?很遗憾如果你执行上面的一段代码结果是false
感到吃惊吗?那最后再看下面的一段代码
代码片段
public static void main(final String[] args){ Integer a= Integer valueOf(); Integer b=; System out println(a== b);}
最后的结果可能你已经猜到了是true
为什么会这样?
现在我们分析一下上面的代码可以很容易的看出这一系列代码的最终目的都是用==对两个对象进行比较 Java中如果用==比较两个对象结果为true说明这两个对象实际上是同一个对象 false说明是两个对象
现在我们来看看为什么会出现上面的现象
我们先看代码片段最后的运行结果是true说明a b两个对象实际上是同一个对象但是a对象是通过调用Integer的valueOf方法创建的而b对象是通过自动装箱创建出来的怎么会是同一个对象呢?难道问题在字节码那里毕竟Java程序是依靠虚拟器运行字节码来实现的
通过jdk中自带的工具javap解析字节码核心的部分摘取如下
: bipush: invokestatic#;//Method java/lang/Integer valueOf:(I)Ljava/lang/Integer;: astore_: bipush: invokestatic#;//Method java/lang/Integer valueOf:(I)Ljava/lang/Integer;
代码中我们只调用了一次Integer valueOf方法但是字节码中出现了两次对Integer valueOf方法的调用那么另一次是哪里呢?只可能在自动装箱时调用的因此这段代码实际上等价于
public static void main(final String[] args){ Integer a= Integer valueOf(); Integer b= Integer valueOf(); System out println(a== b);}
现在问题就简单了看jdk源代码查看valueOf方法的具体实现
public static Integer valueOf(int i){ final int offset=; if(i>=&& i<=){// must cache return IntegerCache cache[i+ offset];} return new Integer(i);}
看到这儿上面的代码就很明确了对于到的数字 valueOf返回的是缓存中的对象所以两次调用Integer valueOf()返回的都是同一个对象
我们再先看代码片段根据上面的分析代码片段实际上等价于以下代码
public static void main(final String[] args){ Integer a= Integer valueOf(); Integer b= Integer valueOf(); System out println(a== b);}
由于不在到范围内所以两个对象都是通过new Integer()的方式创建的所以最后结果为false
片段和片段就不做具体分析了相信读者可以自行分析
lishixinzhi/Article/program/Java/gj/201311/27590java中:是什么意思
API(Application Programming Interface)即应用程序接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。
应用程序接口又称为应用编程接口,是一组定义、程序及协议的集合,通过 API接口实现计算机软件之间的相互通信。API的一个主要功能是提供通用功能集。API同时也是一种中间件,为各种不同平台提供数据共享。
程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的可维护性和可扩展性。
扩展资料:
API接口的功能:
运行Java程序时,虚拟机装载程序的class文件所使用的Java API class文件。所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了在Java虚拟机上运行的整个程序。
在一个平台能够支持Java程序以前,必须在这个特定平台上明确地实现API的功能。为访问主机上的本地资源,Java API调用了本地方法。由于Java API class文件调用了本地方法,Java程序就不需要再调用它们了。
通过这种方法,Java API class文件为底层主机提供了具有平台无关性、标准接口的Java程序。对Java程序而言,无论平台内部如何,Java API都会有同样的表现和可预测的行为。
正是由于在每个特定的主机平台上明确地实现了Java虚拟机和Java API,因此,Java程序自身就能够成为具有平台无关性的程序。
参考资料来源:百度百科-Java API
java-=是什么意思
1、自减运算符,如:a-=b,等价于a=a-b。
2、int i= 1; int sum= 0; sum= sum+ i。
3、Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
4、当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类[22],通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用。
5、自增和自减是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。放在操作元前面的自增、自减运算符,会先将变量的值加1或减1,然后再使该变量参与表达式的运算。放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量的值加1或减1。
java 中的class.forName()是什么意思
Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。
Class.forName是一个静态方法,同样可以用来加载类。该方法有两种形式:Class.forName(String name, boolean initialize, ClassLoader loader)和Class.forName(String className)。第一种形式的参数name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器。第二种形式则相当于设置了参数initialize的值为true,loader的值为当前类的类加载器。
如下图所示,java类型的属性名称叫name,可以通过forName的方法获取到这个类的实例,从而获取到类里面的属性。
扩展资料:注意:
在指定类给 class.forName()方法后,如果找不到指定的类,会抛出ClassNotFoundException异常。Class的静态 forName()方法有两个版本,上面的代码是只指定类名称的版本,而另一个版本可以让你指定类名称、加载时是否运行静态区块、指定类加载器:
Static Class forName(String name, boolean initialize, ClassLoader loader)
默认在加载类的时候,如果类中有定义静态区块则会运行它。你可以使用 class.forName()的第二个版本,将initialize设定为 false,这样在加载类时并不会立即运行静态区块,而会在使用类建立对象时才运行静态区块。为了印证,可以先设计一个测试类:
package cn.sunzn.demo;public class TestClass{ static{
System.out.println("[运行静态区块]");
}
}
参考资料:百度百科-JAVA反射机制
OK,本文到此结束,希望对大家有所帮助。