applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序。
如下所示是独立的Java应用程序和applet程序之间重要的不同:
Java中applet类继承了 java.applet.Applet类
Applet类没有定义main(),所以一个 Applet程序不会调用main()方法,
Applets被设计为嵌入在一个HTML页面。
当用户浏览包含Applet的HTML页面,Applet的代码就被下载到用户的机器上。
要查看一个applet需要JVM。 JVM可以是Web浏览器的一个插件,或一个独立的运行时环境。
用户机器上的JVM创建一个applet类的实例,并调用Applet生命周期过程中的各种方法。
Applets有Web浏览器强制执行的严格的安全规则,applet的安全机制被称为沙箱安全。
applet需要的其他类可以用Java归档(JAR)文件的形式下载下来。
Applet的生命周期
Applet类中的四个方法给你提供了一个框架,你可以再该框架上开发小程序:
init: 该方法的目的是为你的applet提供所需的任何初始化。在Applet标记内的param标签被处理后调用该方法。
start: 浏览器调用init方法后,该方法被自动调用。每当用户从其他页面返回到包含Applet的页面时,则调用该方法。
stop:当用户从包含applet的页面移除的时候,该方法自动被调用。因此,可以在相同的applet中反复调用该方法。
destroy: 此方法仅当浏览器正常关闭时调用。因为applets只有在HTML网页上有效,所以你不应该在用户离开包含Applet的页面后遗漏任何资源.
paint: 该方法在start()方法之后立即被调用,或者在applet需要重绘在浏览器的时候调用。paint()方法实际上继承于java.awt。
"Hello, World" Applet:
下面是一个简单的Applet程序HelloWorldApplet.java:
import java.applet.*;
import java.awt.*;
public class HelloWorldApplet extends Applet
{
public void paint (Graphics g)
{
g.drawString ("Hello World", 25, 50);
}
}
这些import语句将以下类导入到我们的applet类中:
java.applet.Applet.
java.awt.Graphics.
没有这些import语句,Java编译器就识别不了Applet和Graphics类。
Applet 类
每一个applet都是java.applet.Applet 类的子类,基础的Applet类提供了供衍生类调用的方法,以此来得到浏览器上下文的信息和服务。
这些方法做了如下事情:
得到applet的参数
得到包含applet的HTML文件的网络位置
得到applet类目录的网络位置
打印浏览器的状态信息
获取一张图片
获取一个音频片段
播放一个音频片段
调整此 applet 的大小
除此之外,Applet类还提供了一个接口,该接口供Viewer或浏览器来获取applet的信息,并且来控制applet的执行。
Viewer可能是:
请求applet作者、版本和版权的信息
请求applet识别的参数的描述
初始化applet
销毁applet
开始执行applet
结束执行applet
Applet类提供了对这些方法的默认实现,这些方法可以在需要的时候重写。
"Hello,World"applet都是按标准编写的。唯一被重写的方法是paint方法。
Applet的调用
applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序。
<applet>标签是在HTML文件中嵌入applet的基础。以下是一个调用"Hello World"applet的例子;
<html>
<title>The Hello, World Applet</title>
<hr>
<applet code="HelloWorldApplet.class" width="320" height="120">
If your browser was Java-enabled, a "Hello, World"
message would appear here.
</applet>
<hr>
</html>
注意: 你可以参照HTML Applet标签来更多的了解从HTML中调用applet的方法。
<applet>标签的属性指定了要运行的Applet类。Width和height用来指定applet运行面板的初始大小。applet必须使用</applet>标签来关闭。
如果applet接受参数,那么参数的值需要在标签里添加,该标签位于<applet>和</applet>之间。浏览器忽略了applet标签之间的文本和其他标签。
不支持Java的浏览器不能执行<applet>和</applet>。因此,在标签之间显示并且和applet没有关系的任何东西,在不支持的Java的浏览器里是可见的。
Viewer或者浏览器在文档的位置寻找编译过的Java代码,要指定文档的路径,得使用<applet>标签的codebase属性指定。
如下所示:
<applet codebase="http://amrood.com/applets"
code="HelloWorldApplet.class" width="320" height="120">
如果applet所在一个包中而不是默认包,那么所在的包必须在code属性里指定,例如:
<applet code="mypackage.subpackage.TestApplet.class"
width="320" height="120">
获得applet参数
下面的例子演示了如何使用一个applet响应来设置文件中指定的参数。该Applet显示了一个黑色棋盘图案和第二种颜色。
第二种颜色和每一列的大小通过文档中的applet的参数指定。
CheckerApplet 在init()方法里得到它的参数。也可以在paint()方法里得到它的参数。然而,在applet开始得到值并保存了设置,而不是每一次刷新的时候都得到值,这样是很方便,并且高效的。
applet viewer或者浏览器在applet每次运行的时候调用init()方法。在加载applet之后,Viewer立即调用init()方法(Applet.init()什么也没做),重写该方法的默认实现,添加一些自定义的初始化代码。
Applet.getParameter()方法通过给出参数名称得到参数值。如果得到的值是数字或者其他非字符数据,那么必须解析为字符串类型。
下例是CheckerApplet.java的梗概:
import java.applet.*;
import java.awt.*;
public class CheckerApplet extends Applet
{
int squareSize = 50;// 初始化默认大小
public void init () {}
private void parseSquareSize (String param) {}
private Color parseColor (String param) {}
public void paint (Graphics g) {}
}
下面是CheckerApplet类的init()方法和私有的parseSquareSize()方法:
public void init ()
{
String squareSizeParam = getParameter ("squareSize");
parseSquareSize (squareSizeParam);
String colorParam = getParameter ("color");
Color fg = parseColor (colorParam);
setBackground (Color.black);
setForeground (fg);
}
private void parseSquareSize (String param)
{
if (param == null) return;
try {
squareSize = Integer.parseInt (param);
}
catch (Exception e) {
// 保留默认值
}
}
该applet调用parseSquareSize(),来解析squareSize参数。parseSquareSize()调用了库方法Integer. parseInt(),该方法将一个字符串解析为一个整数,当参数无效的时候,Integer.parseInt()抛出异常。
因此,parseSquareSize()方法也是捕获异常的,并不允许applet接受无效的输入。
Applet调用parseColor()方法将颜色参数解析为一个Color值。parseColor()方法做了一系列字符串的比较,来匹配参数的值和预定义颜色的名字。你需要实现这些方法来使applet工作。
指定applet参数
如下的例子是一个HTML文件,其中嵌入了CheckerApplet类。HTML文件通过使用标签的方法给applet指定了两个参数。
<html>
<title>Checkerboard Applet</title>
<hr>
<applet code="CheckerApplet.class" width="480" height="320">
<param name="color" value="blue">
<param name="squaresize" value="30">
</applet>
<hr>
</html>
注意: 参数名字大小写不敏感。
应用程序转换成Applet
将图形化的Java应用程序(是指,使用AWT的应用程序和使用java程序启动器启动的程序)转换成嵌入在web页面里的applet是很简单的。
下面是将应用程序转换成applet的几个步骤:
编写一个HTML页面,该页面带有能加载applet代码的标签。
编写一个JApplet类的子类,将该类设置为public。否则,applet不能被加载。
消除应用程序的main()方法。不要为应用程序构造框架窗口,因为你的应用程序要显示在浏览器中。
将应用程序中框架窗口的构造方法里的初始化代码移到applet的init()方法中,你不必显示的构造applet对象,浏览器将通过调用init()方法来实例化一个对象。
移除对setSize()方法的调用,对于applet来讲,大小已经通过HTML文件里的width和height参数设定好了。
移除对 setDefaultCloseOperation()方法的调用。Applet不能被关闭,它随着浏览器的退出而终止。
如果应用程序调用了setTitle()方法,消除对该方法的调用。applet不能有标题栏。(当然你可以给通过html的title标签给网页自身命名)
不要调用setVisible(true),applet是自动显示的。
事件处理
Applet类从Container类继承了许多事件处理方法。Container类定义了几个方法,例如:processKeyEvent()和processMouseEvent(),用来处理特别类型的事件,还有一个捕获所有事件的方法叫做processEvent。
为了响应一个事件,applet必须重写合适的事件处理方法。
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;
public class ExampleEventHandling extends Applet
implements MouseListener {
StringBuffer strBuffer;
public void init() {
addMouseListener(this);
strBuffer = new StringBuffer();
addItem("initializing the apple ");
}
public void start() {
addItem("starting the applet ");
}
public void stop() {
addItem("stopping the applet ");
}
public void destroy() {
addItem("unloading the applet");
}
void addItem(String word) {
System.out.println(word);
strBuffer.append(word);
repaint();
}
public void paint(Graphics g) {
//Draw a Rectangle around the applet's display area.
g.drawRect(0, 0,
getWidth() - 1,
getHeight() - 1);
//display the string inside the rectangle.
g.drawString(strBuffer.toString(), 10, 20);
}
public void mouseEntered(MouseEvent event) {
}
public void mouseExited(MouseEvent event) {
}
public void mousePressed(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseClicked(MouseEvent event) {
addItem("mouse clicked! ");
}
}
如下调用该applet:
<html>
<title>Event Handling</title>
<hr>
<applet code="ExampleEventHandling.class"
width="300" height="300">
</applet>
<hr>
</html>
最开始运行,applet显示 "initializing the applet. Starting the applet.",然后你一点击矩形框,就会显示"mouse clicked" 。
显示图片
applet能显示GIF,JPEG,BMP等其他格式的图片。为了在applet中显示图片,你需要使用java.awt.Graphics类的drawImage()方法。
如下实例演示了显示图片的所有步骤:
import java.applet.*;
import java.awt.*;
import java.net.*;
public class ImageDemo extends Applet
{
private Image image;
private AppletContext context;
public void init()
{
context = this.getAppletContext();
String imageURL = this.getParameter("image");
if(imageURL == null)
{
imageURL = "java.jpg";
}
try
{
URL url = new URL(this.getDocumentBase(), imageURL);
image = context.getImage(url);
}catch(MalformedURLException e)
{
e.printStackTrace();
// Display in browser status bar
context.showStatus("Could not load image!");
}
}
public void paint(Graphics g)
{
context.showStatus("Displaying image");
g.drawImage(image, 0, 0, 200, 84, null);
g.drawString("www.javalicense.com", 35, 100);
}
}
如下调用该applet:
<html>
<title>The ImageDemo applet</title>
<hr>
<applet code="ImageDemo.class" width="300" height="200">
<param name="image" value="java.jpg">
</applet>
<hr>
</html>
播放音频
Applet能通过使用java.applet包中的AudioClip接口播放音频。AudioClip接口定义了三个方法:
public void play(): 从一开始播放音频片段一次。
public void loop(): 循环播放音频片段
public void stop(): 停止播放音频片段
为了得到AudioClip对象,你必须调用Applet类的getAudioClip()方法。无论URL指向的是否是一个真实的音频文件,该方法都会立即返回结果。
直到要播放音频文件时,该文件才会下载下来。
如下实例演示了播放音频的所有步骤:
import java.applet.*;
import java.awt.*;
import java.net.*;
public class AudioDemo extends Applet
{
private AudioClip clip;
private AppletContext context;
public void init()
{
context = this.getAppletContext();
String audioURL = this.getParameter("audio");
if(audioURL == null)
{
audioURL = "default.au";
}
try
{
URL url = new URL(this.getDocumentBase(), audioURL);
clip = context.getAudioClip(url);
}catch(MalformedURLException e)
{
e.printStackTrace();
context.showStatus("Could not load audio file!");
}
}
public void start()
{
if(clip != null)
{
clip.loop();
}
}
public void stop()
{
if(clip != null)
{
clip.stop();
}
}
}
如下调用applet:
<html>
<title>The ImageDemo applet</title>
<hr>
<applet code="ImageDemo.class" width="0" height="0">
<param name="audio" value="test.wav">
</applet>
<hr>
你可以使用你电脑上的test.wav来测试上面的实例。
如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!
penJdk1.8中的makefile,记录下java的执行文件编译过程及jvm编译过程。
openjdk源码中有很多目录,根据功能做了模块化划分,每个目录实现其相应的功能。每个目录下的结构都差不多,分为src(源码)、make(makefile)、test(或没有)、其他特殊目录。
openjdk
common 一些公共文件,比如下载源码的shell脚本、生成make的autoconf等文件
corba 分布式通讯接口
hotspot 虚拟机实现
jaxp xml处理代码
jaxws ws实现
apijdk jdk源码
langtools java语言工具实现,比如javac、javap等
make make文件
nashorn java中js的运行时实现
test 测试文件
src 源码目录
bsd bsd实现
linux linux实现
macosx macos实现
share 公用代码,linux平台代码会在这里
solaris solaris实现
windows window实现
make makefile
test 单元测试文件
该目录主要实现了jdk提供的基于jvm的工具,比如:java, javac, javah, javap等。
langtools
src 源码目录
share java源代码
bin 模板
classes java源码文件
com 存放了java提供的一些基础类实现,打包成tools.jar
javax
jdk
sample 样例源码
make makefile目录
test 测试用例目录
可执行文件编译Makefile
文件名为:/openjdk/jdk/make/CompileLaunchers.gmkjava中提供的bin目录下的java、javac、javap等都不是完全通过c/c++编写实现的,是通过c/c++入口,启动虚拟机加载class文件实现的相关功能。通过c/c++的main函数入口,创建jvm虚拟机后,通过执行相关功能的java代码实现其功能,所以java相关的功能如编译、运行、查看jvm信息等功能都是通过启动一个jvm虚拟机或者通过jvmti等实现的。
在makefile文件中可以查看到该部分定义。
ifndef BUILD_HEADLESS_ONLY
$(eval $(call SetupLauncher,appletviewer, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.applet.Main"$(COMMA) }',, \
$(XLIBS)))
endif
$(eval $(call SetupLauncher,extcheck, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.extcheck.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,idlj, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.corba.se.idl.toJavaPortable.Compile"$(COMMA) }'))
$(eval $(call SetupLauncher,jar, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.jar.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,jarsigner, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.security.tools.jarsigner.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,javac, \
-DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javac.Main"$(COMMA) }'))
ifeq ($(ENABLE_SJAVAC), yes)
$(eval $(call SetupLauncher,sjavac, \
-DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.sjavac.Main"$(COMMA) }'))
endif
$(eval $(call SetupLauncher,javadoc, \
-DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javadoc.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,javah, \
-DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javah.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,javap, \
-DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javap.Main"$(COMMA) }'))
$(eval $(call SetupLauncher,jdeps, \
-DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.jdeps.Main"$(COMMA) }'))
BUILD_LAUNCHER_jconsole_CFLAGS_windows := -DJAVAW
BUILD_LAUNCHER_jconsole_LDFLAGS_windows := user32.lib
$(eval $(call SetupLauncher,jconsole, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "-J-Djconsole.showOutputViewer"$(COMMA) "sun.tools.jconsole.JConsole"$(COMMA) }' \
-DAPP_CLASSPATH='{ "/lib/jconsole.jar"$(COMMA) "/lib/tools.jar"$(COMMA) "/classes" }'))
$(eval $(call SetupLauncher,jdb, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.example.debug.tty.TTY"$(COMMA) }' \
-DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }'))
$(eval $(call SetupLauncher,jhat, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.hat.Main"$(COMMA) }'))
具体各个具体功能实现可以由makefile中找到相关的类文件查看实现。这些类在目录langtools目录中。
在linux上编译openjdk的时候,所有java提供的工具程序(bin目录下的可执行程序)入口都是jdk/src/bin/share/bin/main.c。但是具体的功能代码实现其实是在langtools下通过java代码实现的,到底是怎么是怎么实现的呢。1、在jdk/src/share/bin/defines.h中通过宏开关实现了jvm虚拟机执行参数的定义,如下:
#如果定义了JAVA_ARGS宏,则会把jvm的参数从宏定义中获取
# 此处参照/openjdk/jdk/make/CompileLaunchers.gmk文件在声明javac的地方,定义了该宏内容
# -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.javac.Main"$(COMMA) }')),所以生成的elf文件javac中
# 会得到该值为{ "-J-ms8m"$(COMMA) "com.sun.tools.javac.Main"$(COMMA) }
#ifdef JAVA_ARGS
static const char* const_progname = "java";
static const char* const_jargs[] = JAVA_ARGS;
/*
* ApplicationHome is prepended to each of these entries; the resulting
* strings are concatenated (separated by PATH_SEPARATOR) and used as the
* value of -cp option to the launcher.
*/
#ifndef APP_CLASSPATH
#define APP_CLASSPATH { "/lib/tools.jar", "/classes" }
#endif /* APP_CLASSPATH */
static const char* const_appclasspath[] = APP_CLASSPATH;
#else /* !JAVA_ARGS */
#ifdef PROGNAME
static const char* const_progname = PROGNAME;
#else
static char* const_progname = NULL;
#endif
static const char** const_jargs = NULL;
static const char** const_appclasspath = NULL;
#endif /* JAVA_ARGS */
#ifdef LAUNCHER_NAME
static const char* const_launcher = LAUNCHER_NAME;
#else /* LAUNCHER_NAME */
static char* const_launcher = NULL;
#endif /* LAUNCHER_NAME */
#ifdef EXPAND_CLASSPATH_WILDCARDS
static const jboolean const_cpwildcard = JNI_TRUE;
#else
static const jboolean const_cpwildcard = JNI_FALSE;
#endif /* EXPAND_CLASSPATH_WILDCARDS */
#if defined(NEVER_ACT_AS_SERVER_CLASS_MACHINE)
static const jint const_ergo_class = NEVER_SERVER_CLASS;
#elif defined(ALWAYS_ACT_AS_SERVER_CLASS_MACHINE)
static const jint const_ergo_class = ALWAYS_SERVER_CLASS;
#else
static const jint const_ergo_class = DEFAULT_POLICY;
#endif /* NEVER_ACT_AS_SERVER_CLASS_MACHINE */
最终生成的elf程序常量区段会有程序名称及入口的class类名称。
当使用javac编译java文件时,入口参数1为java文件路径,然后启动一个java虚拟机vm,把com.sun.tools.javac.Main aaa.java传递给java虚拟机vm执行,传递给虚拟机参数如下:
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 7
option[0] = '-Dsun.java.launcher.diag=true'
option[1] = '-Dapplication.home=/opt/source/jdk8u-dev/build/linux-x86_64-normal-server-slowdebug/jdk'
option[2] = '-Djava.class.path=/opt/source/jdk8u-dev/build/linux-x86_64-normal-server-slowdebug/jdk/lib/tools.jar:/opt/source/jdk8u-dev/build/linux-x86_64-normal-server-slowdebug/jdk/classes'
option[3] = '-Xms8m'
option[4] = '-Dsun.java.command=com.sun.tools.javac.Main aaa.java'
option[5] = '-Dsun.java.launcher=SUN_STANDARD'
option[6] = '-Dsun.java.launcher.pid=5997'
jdk编译后会生成很多jar包,除了jvm虚拟机提供的一些平台功能外,其他语言层面的功能都是由java开发的jar包对外提供的,所以现在有很多语言都基于jvm做了实现。
openjdk提供了由运行时rt.jar, 工具tools.jar,编码charset.jar等其他功能jar。
下面详细介绍几个重要的jar包是怎么生成的。
tools.jar包
tools.jar包在jdk的lib目录下,主要提供jdk/bin目录下java工具的虚拟机里面的实现代码,由java开发。生成tools.jar包的makefile文件是:文件名为:/openjdk/jdk/make/CreateJars.gmk,内容如下:
源码路径:langtools目录
#声明tools包含的目录范围
TOOLS_JAR_INCLUDES := \
com/sun/codemodel \
com/sun/istack/internal/tools \
com/sun/jarsigner \
com/sun/javadoc \
com/sun/jdi \
com/sun/source \
com/sun/tools/attach \
com/sun/tools/classfile \
com/sun/tools/corba \
com/sun/tools/doclets \
com/sun/tools/doclint \
com/sun/tools/example/debug/expr \
com/sun/tools/example/debug/tty \
com/sun/tools/extcheck \
com/sun/tools/hat \
com/sun/tools/internal/jxc \
com/sun/tools/internal/jxc/ap \
com/sun/tools/internal/ws \
com/sun/tools/internal/ws/wscompile/plugin/at_generated \
com/sun/tools/internal/xjc \
com/sun/tools/javac \
com/sun/tools/javadoc \
com/sun/tools/javah \
com/sun/tools/javap \
com/sun/tools/jdeps \
com/sun/tools/jdi \
com/sun/tools/script/shell \
com/sun/xml/internal/dtdparser \
com/sun/xml/internal/rngom \
com/sun/xml/internal/xsom \
org/relaxng/datatype \
sun/applet \
sun/jvmstat \
sun/rmi/rmic \
sun/security/tools/jarsigner \
sun/tools/asm \
sun/tools/attach \
sun/tools/jar \
sun/tools/java \
sun/tools/javac \
sun/tools/jcmd \
sun/tools/jinfo \
sun/tools/jmap \
sun/tools/jps \
sun/tools/jstack \
sun/tools/jstat \
sun/tools/jstatd \
sun/tools/native2ascii \
sun/tools/serialver \
sun/tools/tree \
sun/tools/util
# tools.jar排除sjavac工具
# The sjavac tools is not ready for public consumption.
TOOLS_JAR_EXCLUDES = com/sun/tools/sjavac
#调用打包生成tools.jar文件
$(eval $(call SetupArchive,BUILD_TOOLS_JAR, , \
SRCS := $(JDK_OUTPUTDIR)/classes, \
SUFFIXES := .class .prp .gif .properties .xml .css .xsd .js .html .txt .java \
Tool aliasmap options, \
INCLUDES := $(TOOLS_JAR_INCLUDES), \
EXCLUDES := $(TOOLS_JAR_EXCLUDES), \
EXTRA_FILES := META-INF/services/com.sun.jdi.connect.Connector \
META-INF/services/com.sun.jdi.connect.spi.TransportService \
META-INF/services/com.sun.tools.attach.spi.AttachProvider \
META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin \
META-INF/services/com.sun.tools.internal.xjc.Plugin, \
JAR := $(IMAGES_OUTPUTDIR)/lib/tools.jar, \
SKIP_METAINF := true, \
CHECK_COMPRESS_JAR := true))
rt.jar包
rt.jar包在jdk的lib目录下,主要提供java语言层面的运行时库,由java开发。rt.jar包含的文件范围由:/openjdk/jdk/make/profile-rtjar-includes.txt定义,内容如下:
#
# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# Included or excluded types must take one of two forms
# - *.class to indicate all classes; or else
# - a full single type name e.g.
# com/sun/security/auth/callback/DialogCallbackHandler$$1.class
# You can not use arbitrary wildcards like DialogCallbackHandler*.class.
#
# Notes:
# - Nested types must use $$ in place of $ as $ is the make meta-character
# - If a package is not listed in any profile's inclusion list then it will
# not appear in any profile. But if a package is also missing from the
# full JRE's inclusion list then it will still be part of the full JRE.
# This is because the full JRE's inclusion lists are only used to define
# the exclusion lists for profiles; they are not used to define the full
# JRE contents - that is still done with the pre-profile legacy mechanism
# (all packagesthat can be found, less those not intended for rt.jar).
# This was done to minimize the impact of profiles on the regular
# non-profile build.
#
PROFILE_1_RTJAR_INCLUDE_PACKAGES := \
com/sun/demo/jvmti/hprof \
com/sun/java/util/jar/pack \
com/sun/net/ssl \
com/sun/nio/file \
com/sun/security/cert/internal/x509 \
java/io \
java/lang \
java/math \
java/net \
java/nio \
java/security \
java/text \
java/time \
java/util \
javax/net \
javax/script \
javax/security \
jdk \
sun/invoke \
sun/launcher \
sun/misc \
sun/net/ \
sun/nio \
sun/reflect \
sun/security \
sun/text \
sun/usagetracker \
sun/util
PROFILE_1_RTJAR_INCLUDE_TYPES :=
PROFILE_1_RTJAR_EXCLUDE_TYPES :=
PROFILE_1_INCLUDE_METAINF_SERVICES :=
PROFILE_2_RTJAR_INCLUDE_PACKAGES := \
com/sun/java_cup/internal/runtime \
com/sun/net/httpserver \
com/sun/org/apache \
com/sun/rmi/rmid \
com/sun/xml/internal/stream \
java/rmi \
java/sql \
javax/rmi/ssl \
javax/sql \
javax/transaction \
javax/xml \
org/w3c \
org/xml/sax \
sun/net/httpserver \
sun/rmi \
sun/util/xml
PROFILE_2_RTJAR_INCLUDE_TYPES :=
PROFILE_2_RTJAR_EXCLUDE_TYPES :=
PROFILE_2_INCLUDE_METAINF_SERVICES := \
META-INF/services/sun.util.spi.XmlPropertiesProvider
PROFILE_3_RTJAR_INCLUDE_PACKAGES := \
com/sun/jmx \
com/sun/jndi \
com/sun/management \
com/sun/naming/internal \
com/sun/nio/sctp \
com/sun/org/apache/xml/internal/security \
com/sun/rowset \
com/sun/security/auth \
com/sun/security/jgss \
com/sun/security/ntlm \
com/sun/security/sasl \
com/sun/tracing \
java/lang/instrument \
java/lang/management \
java/security/acl \
java/util/prefs \
javax/annotation/processing \
javax/lang/model \
javax/management \
javax/naming \
javax/security/auth/kerberos \
javax/security/sasl \
javax/smartcardio \
javax/sql/rowset \
javax/tools \
javax/xml/crypto \
org/ietf/jgss \
org/jcp/xml \
sun/instrument \
sun/management \
sun/net/dns \
sun/net/www/protocol/http/ntlm \
sun/net/www/protocol/http/spnego \
sun/nio/ch/sctp \
sun/security/acl \
sun/security/jgss \
sun/security/krb5 \
sun/security/provider/certpath/ldap \
sun/security/smartcardio \
sun/tracing
PROFILE_3_RTJAR_INCLUDE_TYPES :=
PROFILE_3_RTJAR_EXCLUDE_TYPES := \
com/sun/security/auth/callback/DialogCallbackHandler$$1.class \
com/sun/security/auth/callback/DialogCallbackHandler$$2.class \
com/sun/security/auth/callback/DialogCallbackHandler$$Action.class \
com/sun/security/auth/callback/DialogCallbackHandler$$ConfirmationInfo.class \
com/sun/security/auth/callback/DialogCallbackHandler.class \
javax/management/remote/rmi/_RMIConnectionImpl_Tie.class \
javax/management/remote/rmi/_RMIConnection_Stub.class \
javax/management/remote/rmi/_RMIServerImpl_Tie.class \
javax/management/remote/rmi/_RMIServer_Stub.class
FULL_JRE_RTJAR_INCLUDE_PACKAGES := \
com/oracle \
com/sun/accessibility/internal/resources \
com/sun/activation/registries \
com/sun/awt \
com/sun/beans \
com/sun/corba \
com/sun/image/codec/jpeg \
com/sun/imageio \
com/sun/istack \
com/sun/java/browser \
com/sun/java/swing \
com/sun/jmx/remote/protocol/iiop \
com/sun/jndi/cosnaming \
com/sun/jndi/toolkit/corba \
com/sun/jndi/url/corbaname \
com/sun/jndi/url/iiop \
com/sun/jndi/url/iiopname \
com/sun/media/sound \
com/sun/org/glassfish \
com/sun/org/omg \
com/sun/swing \
com/sun/xml/internal/bind \
com/sun/xml/internal/fastinfoset \
com/sun/xml/internal/messaging \
com/sun/xml/internal/org \
com/sun/xml/internal/stream/buffer \
com/sun/xml/internal/txw2 \
com/sun/xml/internal/ws \
java/applet \
java/awt \
java/beans \
javax/accessibility \
javax/activation \
javax/activity \
javax/imageio \
javax/jws \
javax/print \
javax/rmi/CORBA \
javax/sound \
javax/swing \
javax/xml/bind \
javax/xml/soap \
javax/xml/ws \
org/omg \
sun/applet \
sun/audio \
sun/awt \
sun/corba \
sun/dc \
sun/font \
sun/java2d \
sun/net/ftp \
sun/net/smtp \
sun/net/www/content/audio \
sun/net/www/content/image \
sun/net/www/content/text \
sun/net/www/protocol/ftp \
sun/net/www/protocol/mailto \
sun/net/www/protocol/netdoc \
sun/print \
sun/security/tools/policytool \
sun/swing \
sun/tools/jar
FULL_JRE_RTJAR_INCLUDE_TYPES := \
com/sun/security/auth/callback/DialogCallbackHandler$$1.class \
com/sun/security/auth/callback/DialogCallbackHandler$$2.class \
com/sun/security/auth/callback/DialogCallbackHandler$$Action.class \
com/sun/security/auth/callback/DialogCallbackHandler$$ConfirmationInfo.class \
com/sun/security/auth/callback/DialogCallbackHandler.class \
javax/annotation/*.class \
javax/management/remote/rmi/_RMIConnectionImpl_Tie.class \
javax/management/remote/rmi/_RMIConnection_Stub.class \
javax/management/remote/rmi/_RMIServerImpl_Tie.class \
javax/management/remote/rmi/_RMIServer_Stub.class \
javax/rmi/*.class
FULL_JRE_RTJAR_EXCLUDE_TYPES :=
FULL_JRE_INCLUDE_METAINF_SERVICES := \
META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin \
META-INF/services/com.sun.tools.internal.xjc.Plugin \
META-INF/services/javax.print.PrintServiceLookup \
META-INF/services/javax.print.StreamPrintServiceFactory \
META-INF/services/javax.sound.midi.spi.MidiDeviceProvider \
META-INF/services/javax.sound.midi.spi.MidiFileReader \
META-INF/services/javax.sound.midi.spi.MidiFileWriter \
META-INF/services/javax.sound.midi.spi.SoundbankReader \
META-INF/services/javax.sound.sampled.spi.AudioFileReader \
META-INF/services/javax.sound.sampled.spi.AudioFileWriter \
META-INF/services/javax.sound.sampled.spi.FormatConversionProvider \
META-INF/services/javax.sound.sampled.spi.MixerProvider \
META-INF/services/sun.java2d.cmm.PCMM \
META-INF/services/sun.java2d.pipe.RenderingEngine
生成tools.jar包的makefile文件是:文件名为:/openjdk/jdk/make/CreateJars.gmk,内容如下:
#声明rt排除的范围
# Full JRE exclude list for rt.jar and resources.jar
# This value should exclude types destined for jars other than rt.jar and resources.jar.
# When building a Profile this value augments the profile specific exclusions
RT_JAR_EXCLUDES += \
com/sun/codemodel \
com/sun/crypto/provider \
com/sun/istack/internal/tools \
com/sun/jarsigner \
com/sun/java/accessibility \
com/sun/javadoc \
com/sun/jdi \
com/sun/net/ssl/internal/ssl \
com/sun/source \
com/sun/tools \
com/sun/xml/internal/dtdparser \
com/sun/xml/internal/rngom \
com/sun/xml/internal/xsom \
javax/crypto \
javax/swing/AbstractButtonBeanInfo.class \
javax/swing/beaninfo \
javax/swing/BoxBeanInfo.class \
javax/swing/JAppletBeanInfo.class \
javax/swing/JButtonBeanInfo.class \
javax/swing/JCheckBoxBeanInfo.class \
javax/swing/JCheckBoxMenuItemBeanInfo.class \
javax/swing/JColorChooserBeanInfo.class \
javax/swing/JComboBoxBeanInfo.class \
javax/swing/JComponentBeanInfo.class \
javax/swing/JDesktopPaneBeanInfo.class \
javax/swing/JDialogBeanInfo.class \
javax/swing/JEditorPaneBeanInfo.class \
javax/swing/JFileChooserBeanInfo.class \
javax/swing/JFormattedTextFieldBeanInfo.class \
javax/swing/JFrameBeanInfo.class \
javax/swing/JInternalFrameBeanInfo.class \
javax/swing/JLabelBeanInfo.class \
javax/swing/JLayeredPaneBeanInfo.class \
javax/swing/JListBeanInfo.class \
javax/swing/JMenuBarBeanInfo.class \
javax/swing/JMenuBeanInfo.class \
javax/swing/JMenuItemBeanInfo.class \
javax/swing/JOptionPaneBeanInfo.class \
javax/swing/JPanelBeanInfo.class \
javax/swing/JPasswordFieldBeanInfo.class \
javax/swing/JPopupMenuBeanInfo.class \
javax/swing/JProgressBarBeanInfo.class \
javax/swing/JRadioButtonBeanInfo.class \
javax/swing/JRadioButtonMenuItemBeanInfo.class \
javax/swing/JScrollBarBeanInfo.class \
javax/swing/JScrollPaneBeanInfo.class \
javax/swing/JSeparatorBeanInfo.class \
javax/swing/JSliderBeanInfo.class \
javax/swing/JSpinnerBeanInfo.class \
javax/swing/JSplitPaneBeanInfo.class \
javax/swing/JTabbedPaneBeanInfo.class \
javax/swing/JTableBeanInfo.class \
javax/swing/JTextAreaBeanInfo.class \
javax/swing/JTextFieldBeanInfo.class \
javax/swing/JTextPaneBeanInfo.class \
javax/swing/JToggleButtonBeanInfo.class \
javax/swing/JToolBarBeanInfo.class \
javax/swing/JTreeBeanInfo.class \
javax/swing/JWindowBeanInfo.class \
javax/swing/SwingBeanInfoBase.class \
javax/swing/text/JTextComponentBeanInfo.class \
META-INF/services/com.sun.jdi.connect.Connector \
META-INF/services/com.sun.jdi.connect.spi.TransportService \
META-INF/services/com.sun.tools.attach.spi.AttachProvider \
META-INF/services/com.sun.tools.xjc.Plugin \
META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor \
org/relaxng/datatype \
sun/awt/HKSCS.class \
sun/awt/motif/X11GB2312.class \
sun/awt/motif/X11GB2312\$$$$Decoder.class \
sun/awt/motif/X11GB2312\$$$$Encoder.class \
sun/awt/motif/X11GBK.class \
sun/awt/motif/X11GBK\$$$$Encoder.class \
sun/awt/motif/X11KSC5601.class \
sun/awt/motif/X11KSC5601\$$$$Decoder.class \
sun/awt/motif/X11KSC5601\$$$$Encoder.class \
sun/jvmstat \
sun/net/spi/nameservice/dns \
sun/nio/cs/ext \
sun/rmi/rmic \
sun/security/ec \
sun/security/internal \
sun/security/mscapi \
sun/security/pkcs11 \
sun/security/provider/Sun.class \
sun/security/rsa/SunRsaSign.class \
sun/security/ssl \
sun/security/tools/jarsigner \
sun/swing/BeanInfoUtils.class \
sun/text/resources/cldr \
sun/tools/asm \
sun/tools/attach \
sun/tools/java \
sun/tools/javac \
sun/tools/jcmd \
sun/tools/jconsole \
sun/tools/jinfo \
sun/tools/jmap \
sun/tools/jps \
sun/tools/jstack \
sun/tools/jstat \
sun/tools/jstatd \
sun/tools/native2ascii \
sun/tools/serialver \
sun/tools/tree \
sun/tools/util \
sun/util/cldr/CLDRLocaleDataMetaInfo.class \
sun/util/resources/cldr \
$(LOCALEDATA_INCLUDES) \
com/oracle/jrockit/jfr \
oracle/jrockit/jfr \
jdk/jfr
# 在jdk编译输出classes目录下查询所有定义依赖的文件
# Find all files in the classes dir to use as dependencies. This could be more fine granular.
ALL_FILES_IN_CLASSES := $(call not-containing, _the., $(filter-out %javac_state, \
$(call CacheFind, $(JDK_OUTPUTDIR)/classes)))
RT_JAR_MANIFEST_FILE := $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.rt.jar_manifest
RESOURCE_JAR_MANIFEST_FILE := $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.resources.jar_manifest
$(RT_JAR_MANIFEST_FILE): $(MAINMANIFEST) $(BEANMANIFEST)
$(MKDIR) -p $(@D)
$(RM) $@ $@.tmp
$(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \
-e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" \
$(MAINMANIFEST) >> $@.tmp
$(ECHO) >> $@.tmp
$(CAT) $(BEANMANIFEST) >> $@.tmp
$(MV) $@.tmp $@
# This defines a target-specific variables to make the shell logic easier to see.
# We need to find the Version.class file for the profile currently being built
$(IMAGES_OUTPUTDIR)/lib$(PROFILE)/rt.jar: \
CLASS_FILE = $(if $(PROFILE), $(strip $(foreach class, $(PROFILE_VERSION_CLASS_TARGETS), $(if $(findstring $(PROFILE), $(class)), $(class)))), NO_SUCH_FILE)
# This is the real target
$(IMAGES_OUTPUTDIR)/lib$(PROFILE)/rt.jar: $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.rt.jar.contents $(RT_JAR_MANIFEST_FILE) $(PROFILE_VERSION_CLASS_TARGETS) $(BEANLESS_CLASSES_TARGETS)
$(ECHO) Creating rt.jar $(PROFILE) Compressed=$(COMPRESS_JARS)
$(MKDIR) -p $(@D)
$(RM) $@ $@.tmp
$(CD) $(JDK_OUTPUTDIR)/classes && \
$(JAR) $(RT_JAR_CREATE_OPTIONS) $@.tmp $(RT_JAR_MANIFEST_FILE) \
@$(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.rt.jar.contents && \
if [ -f $(CLASS_FILE) ]; then \
$(ECHO) Updating rt.jar $(PROFILE) && \
$(CD) $(patsubst %$(VERSION_CLASS_PATH), %, $(CLASS_FILE)) && \
$(JAR) $(RT_JAR_UPDATE_OPTIONS) $@.tmp $(VERSION_CLASS_PATH); \
$(CD) $(BEANLESS_CLASSES) && \
$(JAR) $(RT_JAR_UPDATE_OPTIONS) $@.tmp $(CLASSES_TO_DEBEAN); \
fi
$(MV) $@.tmp $@
jconsole.jar
jconsole.jar包在jdk的lib目录下,是一个Java监视和管理控制台的客户端程序,由javax swing开发。jsoncole可以附加本地java进程,通过api查询方式或者使用jms协议查询java虚拟机一些观测数据。jconsole.jar主要组成由jdk/src/share/classes/sun/tools/jconsole、jdk/src/share/classes/com/sun/tools/jconsole目录下文件组成。
jdk本身提供了2中方式,一种是bin目录下的jconsole程序,另外一种就是lib下的jconsole.jar包。bin下的jsoncole直接运行,启动打开jconsole的main入口, lib下的jsoncole.jar需要使用java -jar jsoncole.jar运行。
向对象和面向过程的区别
面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展。
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
缺点:性能比面向过程低
Java语言有哪些特点?
1,简单易学;2,面向对象(封装,继承,多态);3,平台无关性(Java虚拟机实现平台无关性);4,可靠性;5,安全性;6,支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而Java语言却提供了多线程支持);7,支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的,因此Java语言不仅支持网络编程而且很方便);8,编译与解释并存;
什么是字节码?采用字节码的最大好处是什么?什么Java是虚拟机?
先看下java中的编译器和解释器:Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。采用字节码的好处: Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。
什么是Java虚拟机
任何一种可以运行Java字节码的软件均可看成是Java的虚拟机(JVM)
什么是Java程序的主类?应用程序和小程序的主类有何不同?
一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。
什么是JDK?什么是JRE?
JDK: 顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime Environment),Java运行环境,还包含了其他供开发者使用的工具包。
JRE:普通用户而只需要安装JRE(Java Runtime Environment)来 来运行Java程序。而程序开发者必须安装JDK来编译、调试程序。
环境变量Path和ClassPath的作用是什么?如何设置这两个环境变量?
Java环境变量PATH和CLASSPATH
Java应用程序与小程序之间有那些差别?
简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。
字符型常量和字符串常量的区别
Java语言采用何种编码方案?有何特点?
Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。
构造器Constructor是否可被override
在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以Constructor也就不能被override,但是可以overload,所以你可以看到一个类中有多个构造函数的情况。
重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。
java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍,访问控制符public,protected,private,以及默认的区别
https://www.2cto.com/kf/201605/509637.html
String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?
可变性:String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[]value,这两种对象都是可变的。
线程安全性:String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
性能:每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:如果要操作少量的数据用 = String单线程操作字符串缓冲区 下操作大量数据 = StringBuilder多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
自动装箱与拆箱
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。
类、方法、成员变量和局部变量的可用修饰符 -
http://blog.csdn.net/yttcjj/article/details/6939239
在一个静态方法内调用一个非静态成员为什么是非法的?
由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。
在Java中定义一个不做事且没有参数的构造方法的作用
Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
接口和抽象类的区别是什么?
1.接口的方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法2.接口中的实例变量默认是final类型的,而抽象类中则不一定3.一个类可以实现多个接口,但最多只能实现一个抽象类4.一个类实现接口的话要实现接口的所有方法,而抽象类不一定5.接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
成员变量与局部变量的区别有那些?
创建一个对象用什么运算符?对象实体与对象引用有何不同?
new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)
什么是方法的返回值?返回值在类的方法里的作用是什么?
方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!
一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?
主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。
构造方法有哪些特性?
1,名字与类名相同;2,没有返回值,但不能用void声明构造函数;3,生成类的对象时自动执行,无需调用。
静态方法和实例方法有何不同?
静态方法和实例方法的区别主要体现在两个方面:
对象的相等与指向他们的引用相等,两者有什么不同?
对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的内存地址是否相等。
在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
帮助子类做初始化工作。
什么是多态机制?Java语言是如何实现多态的?
多态
equals 和 == 的区别?
通俗点讲:==是看看左右是不是一个东西。equals是看看左右是不是长得一样。如何记住嘛。如果单纯是想记住,==:等于。equals:相同。两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人。你只要记住equals,==就不用记了。你们去感受一下。
术语来讲的区别:1.==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同 2.==是指对内存地址进行比较 equals()是对字符串的内容进行比较3.==指引用是否相同 equals()指的是值是否相同
*请认真填写需求信息,我们会在24小时内与您取得联系。