「空模式java」空模式什么
今天给各位分享空模式java的知识,其中也会对空模式什么进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java单例模式出现空指针问题。
1.首先单例模式,构造方法要私有化,private Cart (){} ;
2.private MapGoodsBean,Integer cartMap;你不分配空间给map,就会报空指针异常,要
3.实现线程安全的单例模式,不难
//双重检查实现单例
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
4.Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。
优点:线程安全;延迟加载;效率较高。
求Java教程或课件,我只要关于以下方面的就可以了。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class c9_3 extends JApplet implements ItemListener
{
Container ctp=getContentPane( );
JLabel lb1=new JLabel("姓名:"),
lb2=new JLabel("英语:"),
lb3=new JLabel(" ");
String name[ ]={"李林","赵欣","张扬","童梅"},
score[ ]={"80","94","75","87"};
JComboBox cbx=new JComboBox( ); //创建下拉式列表框对象
public void init( )
{
ctp.setLayout(new FlowLayout( )); //设置流式布局
for (int j=0;jname.length;j++) //添加选项到下拉式列表框对象中
cbx.addItem(name[j]);
ctp.add(lb1);
ctp.add(cbx); //添加下拉式列表框对象到容器上
cbx.addItemListener(this); //注册cbx给监听对象
ctp.add(lb2);
ctp.add(lb3);
}
public void itemStateChanged(ItemEvent e)
{
int c=0;
String str=(String)e.getItem( ); //获取所选项给str
for(int i=0;iname.length;i++)
if(str==name[i]) //判断str是否是name数组中某个元素的内容
c=cbx.getSelectedIndex( ); //将该选项的下标给c
lb3.setText(score[c]); //获取该学生的成绩
}
}
程序说明:
下拉式列表框产生ItemEvent代表的选择事件。该程序中的
语句cbx.addItemListener(this);表示注册JComboBox类的对象cbx
给监听者对象。当用户单击下拉列表的某个选项时,系统自动
产生一个包含这个事件有关信息的ItemEvent类的对象e,并把该
对象作为实际参数传递给被自动调用的监听者的选择事件响应
方法:itemStateChanged(ItemEvent e)。在这个方法中通过调用
ItemEvent 事件的方法e.getItem( )获得引发当前选择事件的下拉
列表事件源(被选中的项),再调用getSelectedIndex( )获取该选项的
下标值,从而得到name数组的下标值,最终将这个元素的内容
作为新的标签文本输出。
图9.4 c9_3运行结果
9.7
JList
组
件
JList称为列表组件,它将所有选项放入列表框中。如果将
JList放入滚动面板(JScrollPane)中,则会出现滚动菜单效果。利
用JList提供的成员方法,用户可以指定显示在列表框中的选项
个数,而多余的选项则可通过列表的上下滚动来显现。
JList组件与JComboBox组件的最大区别是:JComboBox组
件一次只能选择一项,而JList组件一次可以选择一项或多项。
选择多项时可以是连续区间选择(按住Shift键进行选择),也可以
是不连续的选择(按住Ctrl键进行选择)。
9.7.1
JList
类的构造方法及成员方法
表9.14
JList
类的构造方法和成员方法
构
造
方
法
方 法说 明
JList(Vectorl istData) 使用包含元素的向量构造JList对象
JList( ) 使用空的模式构造JList对象
JList(ListModel dataModel) 使用dataModel模式构造JList对象
JList(Object[ ] listData) 使用指定的数组构造JList对象
成
员
方
法
void
addListSelectionListener(ListSelectionListener e) 添加指定的ListSelectionListener
int getSelectedIndex( ) 获取所选项的第一个下标
int getSelectedIndices( ) 获取所有选项的下标
void setSelection Background(Color c) 设置单元格的背景颜色
void setSelection Foreground(Color c) 设置单元格的前景颜色
int getVisibleRowCount( ) 得到可见的列表选项值
void setVisibleRowCount (int num) 设置可见的列表选项
9.7.2
ListSelectionEvent
事件
JList组件的事件处理一般可分为两种:一种是当用户单击列
表框中的某一个选项并选中它时,将产生ListSelectionEvent类的
选择事件,此事件是Swing的事件;另一种是当用户双击列表框
中的某个选项时,则产生MouseEvent类的动作事件。JList类通过
locatToindex( )方法来得知是单击还是双击。
若希望实现JList的ListSelectionEvent事件,首先必须声明实
现监听者对象的类接口ListSelectionListener,并通过JList类的
addListSelectionListener( )方法注册文本框的监听者对象,再在
ListSelectionListener接口的valueChanged (ListSelectionEvent e)方
法体中写入有关代码,就可以响应ListSelectionEvent事件了。下
面通过示例程序来加以说明。
【示例程序c9_4.java】 设置一个JLabel组件和JList组件,
点击列表框中的选项,将所选项的值作为JLabel组件的文本输出。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class c9_4 extends JApplet implements ListSelectionListener
{ JList lis=null;
JLabel lb=null;
String[ ] s={"小学","初中","高中","大学","研究生"};
public void init( )
{ Container cp=getContentPane( );
cp.setLayout(new BorderLayout( ));
lb=new JLabel( );
lis=new JList(s);
lis.setVisibleRowCount(3); //设置列表框的可见选项行数,
选项超过则出现滚动条
lis.setBorder(BorderFactory.createTitledBorder("请选择"));//
设置列表框的边框文本
lis.addListSelectionListener(this); //注册lis给监听者对象
cp.add(lb,BorderLayout.NORTH);
//将lis对象放入滚动容器,再将此容器加载到界面上。
cp.add(new JScrollPane(lis),BorderLayout.CENTER);
}
public void valueChanged(ListSelectionEvent e)
{ int m=0;
String str="选取的是:";
//取得所有选项的下标值给index数组
int[ ] index = lis.getSelectedIndices( );
for(int i=0;iindex.length;i++)
{ //根据取得的下标值,找到相应的数组元素
m=index[i];
str=str+s[m]+" ";
}
lb.setText(str);//输出选中项的值
}
}
上述程序中的语句:
lis.addListSelectionListener(this);
表示把lis注册给ListSelectionEvent的监听者
ListSelectionListener。当用户单击某个选项时,系统会自动引用
ListSelectionListener的valueChanged( )方法来处理选项的改变。
程序c9_4的运行结果见图9.5。
图9.5 程序c9_4的运行结果
9.8
JTextField
与JTextArea
组件
9.8.1
JTextField
组件的构造方法及成员方法
JtextField被称为文本框。它定义了一个单行条形文本区,
可以输出任何基于文本的信息,也可以接受用户的输入。表9.15
列出了JTextField类的构造方法和成员方法。
表9.15
JTextField
类构造方法和成员方法
方
法
JTextField( )
JTextField(int n)
JTextField(String s)
JTextField(String s,int n)
JTextField(Document doc,String s, int n)
int getColumns( )
void setColumns(int Columns)
void addActionListener(ActionListener e)
void setFont(Font f)
void setHorizontalAlignment(int alig)
void setActionCommand(String com)
功 能 说 明
创建一个JTextField对象
创建一个列宽为n的空JTextField对象
创建一个JTextField对象,并显示字符串s
创建一个JTextField对象,并以指定的字宽n显示字符串s
使用指定的文件存储模式创建一个JTextField对象,并以指定的
字宽n显示字符串s
获取此对象的列数
设置此对象的列数
添加指定的动作事件监听程序
设置字体
设置文本的水平对齐方式(LEFT、CENTER、RIGHT)
设置动作事件使用的命令字符串
9.8.2
JTextArea
组件的构造方法及成员方法
JTextArea被称为文本域。它与文本框的主要区别是:文本
框只能输入/输出一行文本,而文本域可以输入/输出多行文本。
表9.16列出了JTextArea类的构造方法和成员方法。
表9.16
JTextArea
类构造方法和成员方法
方 法功 能 说 明
构
造
方
法
JTextArea ( ) 创建一个JTextArea对象
JTextArea (int n,int m) 创建一个具有n行m列的空JTextArea对
象
JTextArea(String s) 创建一个JTextArea对象,并显示字符
串s
JTextArea(String s,int n,int m) 创建一个JTextArea对象并以指定的行
数n和列数m显示字符串联s
JTextArea(String s,int n,int m,
文章出处:
到这上看看还有挺多的!。。。。
什么是 Java 虚拟机?
您好,提问者:
Java虚拟机简称JVM,它的作用如下:
1、其实Java不可跨平台,真正实现跨平台的是JVM虚拟机。
2、JVM其实就是一个编译java、运行class的一个跟操作系统的一个软件。
3、JVM的作用只针对于Java,而系统中的东西与它无关。
4、其实说白了就是一个软件,就像VMware一样。
Java虚拟机
一、什么是Java虚拟机
Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。
为什么要使用Java虚拟机
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
2.谁需要了解Java虚拟机
Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。
3.Java虚拟机支持的数据类型
Java虚拟机支持Java语言的基本数据类型如下:
byte://1字节有符号整数的补码
short://2字节有符号整数的补码
int://4字节有符号整数的补码
long://8字节有符号整数的补码
float://4字节IEEE754单精度浮点数
double://8字节IEEE754双精度浮点数
char://2字节无符号Unicode字符
几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。
虚拟机支持的其它数据类型包括:
object//对一个Javaobject(对象)的4字节引用
returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令
注:Java数组被当作object处理。
虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可
移植性。
二、Java虚拟机体系结构
Java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但它们的功能必须在真实机器上以某种方式实现。
Java指令集
Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。
Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。
虚拟机的内层循环的执行过程如下:
do{
取一个操作符字节;
根据操作符的值执行一个动作;
}while(程序未结束)
由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:
第一个字节*256+第二个字节字节码指令流一般只是字节对齐的。指令tabltch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。
2.寄存器
Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。
Java虚拟机的寄存器有四种:
pc:Java程序计数器。
optop:指向操作数栈顶端的指针。
frame:指向当前执行方法的执行环境的指针。
vars:指向当前执行方法的局部变量区第一个变量的指针。
Java虚拟机
Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性(特别是对于寄存器数目不多的处理器)。
所有寄存器都是32位的。
3.栈
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。
(1)局部变量区 每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。
(2)运行环境区 在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播。
·动态链接
运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。
·正常的方法返回
如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。
·异常和错误传播
异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用
·程序使用了throw语句。
当异常发生时,Java虚拟机采取如下措施:
·检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。
·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。
·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。
·如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误传播将被继续下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。
(3)操作数栈区 机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。
每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。
4.无用单元收集堆
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java语言具有无用单元收集能力:它不给程序员显式释放对象的能力。Java不规定具体使用的无用单元收集算法,可以根据系统的需求使用各种各样的算法。
5.方法区
方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在无用单元收集堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。
空模式java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于空模式什么、空模式java的信息别忘了在本站进行查找喔。
发布于:2022-11-26,除非注明,否则均为
原创文章,转载请注明出处。