搜档网
当前位置:搜档网 › Java类装载体系中的隔离

Java类装载体系中的隔离

Java类装载体系中的隔离
Java类装载体系中的隔离

Java类装载体系中的隔离性

Java中类的查找与装载出现的问题总是会时不时出现在Java程序员面前,这并不是什么丢脸的事情,相信没有一个Java程序员没遇到过ClassNotException,因此不要为被人瞅见自己也犯这样的错误而觉得不自然,但是在如果出现了ClassNotFoundException后异常后一脸的茫然,那我想你该了解一下java的类装载的体制了,同时为了进行下面的关于类装载器之间的隔离性的讨论,我们先简单介绍一下类装载的体系结构。

1. Java类装载体系结构

装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。你应该已经发现到了这样一个问题,类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?没错,确实存在这样的根,它就是神龙见首不见尾的Bootstrap ClassLoader. 为什么说它神龙见首不见尾呢,因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,尽管你能时时刻刻体会到它的存在,因为java的运行环境所需要的所有类库,都由它来装载,而它本身是C++写的程序,可以独立运行,可以说是JVM的运行起点,伟大吧。在Bootstrap完成它的任务后,会生成一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类),这个类装载器才是我们经常使用的,可以调用

ClassLoader.getSystemClassLoader() 来获得,我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。 AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵光一闪的感觉,我们按照它的类查找范围给它取名为类路径类装载器。还是先前假定的情况,当Java中出现新的类,AppClassLoader首先在类传递给它的父类类装载器,也就是 Extion ClassLoader,询问它是否能够装载该类,如果能,那AppClassLoader就不干这活了,同样Extion ClassLoader在装载时,也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图,每个类装载器有自己的父亲,类装载器在装载类时,总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时,自己就会动手装载,如果它也装载不了,那么对不起,它会大喊一声:Exception,class not found。有必要提一句,当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载器loadClass方法或者ClassLoader的findSystemClass方法装载类,如果你不去刻意改变,那么抛出的是 ClassNotFoundException。

我们简短总结一下上面的讨论:

1.JVM类装载器的体系结构可以看作是树状结构。

2.父类装载器优先装载。在父类装载器装载失败的情况下再装载,如果都装载失败则抛出ClassNotFoundException或者NoClassDefFoundError异常。

那么我们的类在什么情况下被装载的呢?

2. 类如何被装载

在java2中,JVM是如何装载类的呢,可以分为两种类型,一种是隐式的类装载,一种式显式的类装载。

2.1 隐式的类装载

隐式的类装载是编码中最常用得方式:

A b = new A();

如果程序运行到这段代码时还没有A类,那么JVM会请求装载当前类的类装器来装载类。问题来了,我把代码弄得复杂一点点,但依旧没有任何难度,请思考JVM得装载次序:

package test;

Public class A{

public void static main(String args[]){

B b = new B();

}

}

class B{C c;}

class C{}

揭晓答案,类装载的次序为A->B,而类C根本不会被JVM理会,先不要惊讶,仔细想想,这不正是我们最需要得到的结果。我们仔细了解一下JVM装载顺序。当使用Java A命令运行A类时,JVM会首先要求类路径类装载器(AppClassLoader)装载A类,但是这时只装载A,不会装载A中出现的其他类(B类),接着它会调用A中的main函数,直到运行语句b = new B()时,JVM发现必须装载B类程序才能继续运行,于是类路径类装载器会去装载B类,虽然我们可以看到B中有有C类的声明,但是并不是实际的执行语句,所以并不去装载C类,也就是说

JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。

2.2 显式的类装载

使用显示的类装载方法很多,我们都装载类test.A为例。

使用Class类的forName方法。它可以指定装载器,也可以使用装载当前类的装载器。例如:

Class.forName("test.A");

它的效果和

Class.forName("test.A",true,this.getClass().getClassLoader());

是一样的。

使用类路径类装载装载.

ClassLoader.getSystemClassLoader().loadClass("test.A");

使用当前进程上下文的使用的类装载器进行装载,这种装载类的方法常常被有着复杂类装载体系结构的系统所使用。

Thread.currentThread().getContextClassLoader().loadClass("test.A") 使用自定义的类装载器装载类

public class MyClassLoader extends URLClassLoader{

public MyClassLoader() {

super(new URL[0]);

}

}

MyClassLoader myClassLoader = new MyClassLoader();

myClassLoader.loadClass("test.A");

MyClassLoader继承了URLClassLoader类,这是JDK核心包中的类装载器,在没有指定父类装载器的情况下,类路径类装载器就是它的父类装载器,

MyClassLoader并没有增加类的查找范围,因此它和类路径装载器有相同的效果。

我们已经知道Java的类装载器体系结构为树状,多个类装载器可以指定同一个类装载器作为自己的父类,每个子类装载器就是树状结构的一个分支,当然它们又可以个有子类装载器类装载器,类装载器也可以没有父类装载器,这时Bootstrap类装载器将作为它的隐含父类,实际上Bootstrap类装载器是所有类装载器的祖先,也是树状结构的根。这种树状体系结构,以及父类装载器优先的机制,为我们编写自定义的类装载器提供了便利,同时可以让程序按照我们希望的方式进行类的装载。例如某个程序的类装载器体系结构图如下:

图:某个程序的类装载器的结构

解释一下上面的图,ClassLoaderA为自定义的类装载器,它的父类装载器为类路径装载器,它有两个子类装载器 ClassLoaderAA和ClassLaderAB,ClassLoaderB为程序使用的另外一个类装载器,它没有父类装载器,但有一个子类装载器 ClassLoaderBB。你可能会说,见鬼,我的程序怎么会使用这么复杂的类装载器结构。为了进行下面的讨论,暂且委屈一下。

3. 奇怪的隔离性

我们不难发现,图2中的类装载器AA和AB, AB和BB,AA和B等等位于不同分支下,他们之间没有父子关系,我不知道如何定义这种关系,姑且称他们位于不同分支下。两个位于不同分支的类装载器具有隔离性,这种隔离性使得在分别使用它们装载同一个类,也会在内存中出现两个Class类的实例。因为被具有隔离性的类装载器装载的类不会共享内存空间,使得使用一个类装载器不可能完成的任务变得可以轻而易举,例如类的静态变量可能同时拥有多个值(虽然好像作用不大),因为就算是被装载类的同一静态变量,它们也将被保存不同的内存空间,又例如程序需要使用某些包,但又不希望被程序另外一些包所使

用,很简单,编写自定义的类装载器。类装载器的这种隔离性在许多大型的软件应用和服务程序得到了很好的应用。下面是同一个类静态变量为不同值的例子。

package test;

public class A {

public static void main( String[] args ) {

try {

//定义两个类装载器

MyClassLoader aa= new MyClassLoader();

MyClassLoader bb = new MyClassLoader();

//用类装载器aa装载testb.B类

Class clazz=aa.loadClass("testb. B");

Constructor constructor=

clazz.getConstructor(new Class[]{Integer.class});

Object object =

constructor.newInstance(new Object[]{new Integer(1)});

Method method =

clazz.getDeclaredMethod("printB",new Class[0]);

//用类装载器bb装载testb.B类

Class clazz2=bb.loadClass("testb. B");

Constructor constructor2 =

clazz2.getConstructor(new Class[]{Integer.class});

Object object2 =

constructor2.newInstance(new Object[]{new Integer(2)});

Method method2 =

clazz2.getDeclaredMethod("printB",new Class[0]);

//显示test.B中的静态变量的值

method.invoke( object,new Object[0]);

method2.invoke( object2,new Object[0]);

} catch ( Exception e ) {

e.printStackTrace();

}

}

}

//Class B 必须位于MyClassLoader的查找范围内,

//而不应该在MyClassLoader的父类装载器的查找范围内。package testb;

public class B {

static int b ;

public B(Integer testb) {

b = testb.intValue();

}

public void printB() {

System.out.print("my static field b is ", b);

}

}

public class MyClassLoader extends URLClassLoader{ private static File file = new File("c:\\classes ");

//该路径存放着class B,但是没有class A

public MyClassLoader() {

super(getUrl());

}

public static URL[] getUrl() {

try {

return new URL[]{file.toURL()};

} catch ( MalformedURLException e ) {

return new URL[0];

}

}

}

程序的运行结果为:

my static field b is 1

my static field b is 2

程序的结果非常有意思,从编程者的角度,我们甚至可以把不在同一个分支的类装载器看作不同的java虚拟机,因为它们彼此觉察不到对方的存在。程序在使用具有分支的类装载的体系结构时要非常小心,弄清楚每个类装载器的类查找范围,尽量避免父类装载器和子类装载器的类查找范围中有相同类名的类(包括包名和类名),下面这个例子就是用来说明这种情况可能带来的问题。

假设有相同名字却不同版本的接口 A,

版本 1:

package test;

Intefer Same{ public String getVersion(); }

版本 2:

Package test;

Intefer Same{ public String getName(); }

接口A两个版本的实现:

版本1的实现

package test;

public class Same1Impl implements Same {

public String getVersion(){ return "A version 1";}

}

版本2的实现

public class Same 2Impl implements Same {

public String getName(){ return "A version 2";}

}

我们依然使用图2的类装载器结构,首先将版本1的Same和Same的实现类Same1Impl打成包same1.jar,将版本2的Same 和Same的实现类Same1Impl打成包same2.jar。现在,做这样的事情,把same1.jar放入类装载器ClassLoaderA 的类查找范围中,把same2.jar放入类装器ClassLoaderAB的类查找范围中。当你兴冲冲的运行下面这个看似正确的程序。

实际上这个错误的是由父类载器优先装载的机制造成,当类装载器ClassLoaderAB在装载Same2Impl类时发现必须装载接口 test.Same,于是按规定请求父类装载器装载,父类装载器发现了版本1的test.Same接口并兴冲冲的装载,但是却想不到Same2Impl所希望的是版本2 的test.Same,后面的事情可想而知了,异常被抛出。

我们很难责怪Java中暂时并没有提供区分版本的机制,如果使用了比较复杂的类装载器体系结构,在出现了某个包或者类的多个版本时,应特别注意。

掌握和灵活运用Java的类装载器的体系结构,对程序的系统设计,程序的实现,已经程序的调试,都有相当大的帮助。希望以上的内容能够对您有所帮助。

原文地址:

https://www.sodocs.net/doc/a612867509.html,/yuanchuang/week-9/classloader.html

学习ejb设计模式和看代码(最重要)

设计模式是练内功,其重要性可以这么说吧,如果你不会用设计模式的话,你将写出一堆使用了ejb的垃圾,又慢又是一堆bug,其结果不如不用ejb实现(ejb 不等于j2ee)

无论学习什么语言,都应该看大量代码,你看的代码量不到一定数量,是学不好j2ee的

目前有很多开源的工程可以作为教材:

jive论坛

petstore sun公司

dune sun公司

等等,研读一个,并把它用到自己的工程中来。

J2ee其他学习

当你渐渐对j2ee了解到一定深度时,你要开始关注当前领域中的一些技术变化,J2ee是一块百家争鸣的领域,大家都在这里提出自己的解决方案,例如structs,hiberate,ofbiz等等,学习这些东西要你的项目和目标而定,预先补充一下未尝不可,但不用涉及太深,毕竟学习原理和理论是最最重要的事。

目前常见j2eeAPI

JavaServer Pages(JSP)技术1.2

Java Servlet技术2.3

JDBC API 2.0

Java XML处理API(JAXP)1.1

Enterprise JavaBeans技术2.0

Java消息服务(JMS)1.0

Java命名目录接口(JNDI)1.2

Java事务API(JTA) 1.0

JavaMail API 1.2

JavaBeans激活架构(JAF)1.0

J2EE连接器体系结构(JCA)1.0

Java认证和授权服务(JAAS)1.0

学习上面的某些API要以你的项目而定,了解所有他们总之是有好处的

JAVA的各种变量类型的转换

JAVA的各种变量类型的转换 1 如何将字串 String 转换成整数 int? A. 有两个方法: 1).int i = Integer.parseInt([String]); i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(my_str).intValue(); 注: 字串转成 Double, Float, Long 的方法大同小异. 2 如何将整数 int 转换成字串 String ? A. 有叁种方法: 1.) String s = String.valueOf(i); 2.) String s = Integer.toString(i); 3.) String s = "" + i; 注: Double, Float, Long 转成字串的方法大同小异. java的各种变量类型的转换 integer to String : int i = 42; String str = Integer.toString(i); String str = "" + i double to String : String str = Double.toString(i); long to String : String str = Long.toString(l); float to String : String str = Float.toString(f); String to integer : str = "25";

int i = Integer.valueOf(str).intValue(); int i = Integer.parseInt(str); String to double : double d = Double.valueOf(str).doubleValue(); String to long : long l = Long.valueOf(str).longValue(); long l = Long.parseLong(str); String to float : float f = Float.valueOf(str).floatValue(); decimal to binary : int i = 42; String binstr = Integer.toBinaryString(i); decimal to hexadecimal : int i = 42; String hexstr = Integer.toString(i, 16); String hexstr = Integer.toHexString(i); hexadecimal (String) to integer : int i = Integer.valueOf("B8DA3",16).intValue(); int i = Integer.parseInt("B8DA3", 16); ASCII code to String int i = 64; String aChar = new Character((char)i).toString(); integer to ASCII code (byte) char c = 'A'; int i = (int) c; To extract Ascii codes from a Strin String test = "ABCD"; for ( int i = 0; i < test.length(); ++i ) {

java基本数据类型习题(选择24)

1、下列哪一个是合法的标识符: A、12class; B、+viod; C、-5; D、_black; 2、下列哪一个不是JAVA语言中保留字: A、if; B、sizeof; C、private; D、null; 3、下列描述中正确的一项是: A、标识符首字符的后面可以跟数字; B、标识符不区分大小写; C、复合数据类型变量包括布尔型、字符型、浮点型; D、数组属于基本数据类型; 4、下列哪一项不属于变量的组成部分: A、变量名; B、变量属性; C、变量初值; D、变量大小; 5、下列关于变量组成部分描述正确的一项是: A、变量名不是标识符;

B、变量名是标识符; C、浮点型属于复合类型; D、变量属性分为:基本类型和符合类型; 6、下列选项中,哪一项不属于JAVA语言的简单数据类型: A、整数型; B、数组; C、字符型; D、浮点型; 7、下列关于变量作用域的描述中,不正确的一项是: A、变量属性是用来描述变量作用域的; B、局部变量作用域只能是它所在的方法的代码段; C、类变量能在类的方法中声明; D、类变量的作用域是整个类; 8、下列关于基本数据类型的说法中,不正确的一项是: A、boolean是JAVA非凡的置值,或者为真或者为假; B、float是带符号的32位浮点数; C、double是带符号的64位浮点数; D、char应该上是8位的Unicode字符; 9、下列关于溢出的说法中,正确的一项是: A、一个整型的数据达到整型能表示的最大数值后,再加1,则机器产生上溢,结果为整型的最大值; B、一个整型的数据达到整型能表示的最小数值后,再减1,

java的基本数据类型有八种

java的基本数据类型有八种 各位读友大家好!你有你的木棉,我有我的文章,为了你的木棉,应读我的文章!若为比翼双飞鸟,定是人间有情人!若读此篇优秀文,必成天上比翼鸟! java的基本数据类型有八种四类八种基本数据类型1. 整型byte(1字节)short (2个字节)int(4个字节)long (8个字节)2.浮点型float(4个字节)double(8个字节)3.逻辑性boolean(八分之一个字节)4.字符型char(2个字节,一个字符能存储下一个中文汉字)基本数据类型与包装类对应关系和默认值short Short (short)0int Integer 0long Long 0Lchar Char '\u0000'(什么都没有)float Floa t0.0fdouble Double 0.0dboolean Boolean false 若某个类的某个成员是基本数据类型,即使没有初始化,java也会确保它获得一个默认值,如上所示。(这种初始化方法只是用于成员变量,不适用于局部变量)。jdk1.5支持自动拆装箱。可以将基本数据类型转换成它的包装类装箱Integer a = new Integer ();a = 100;拆箱int b = new Intger(100);一个字节等于8位,一个字节等于256个数,-128到127一个英文字母或一个阿拉伯数字就是一个字符,占用一个字节一个汉字两个字符,占用两个字节基本数据类型自动转换byte->short , char->int->longfloat->doubleint ->floatlong->double小可转大,大转小会失去精度。字符串与基本类型或其他类型间的转换⑴其它

Java 基本数据类型取值范围讲解

Java 基本数据类型取值范围讲解 一、Java的类型词语理解: 1) 原始数据类型,简单类型,基本类型都是一个含义; 2)复合类型,扩展类型,复杂类型、引用类型都是一个含义; 3)浮点类型,实数、实型都是一个含义; 4)逻辑型、布尔型都是一个含义; 5)本人个人认同的类型分类: 阅读时需要理解: 定点:定点的意思是把小数点定在末尾,小数点后没有数字的数据,Java中通常把它们称为整数; 常量:就是直接的值; 变量:放置常量的容器,除了放置常量之外,也可以给变量一个运算式,变量中的值是可变的; 二、Java数据类型基本概念: 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。接触每种语言的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语言,所以Java对于数据类型的规范会相对严格。数据类型是语言的抽象

原子概念,可以说是语言中最基本的单元定义,在Java里面,本质上讲将数据类型分为两种:基本类型和引用数据类型。 基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。 引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。 三、Java中的数据类型与内存的关系 在Java中,每个存放数据的变量都是有类型的,如: char ch;float x;inta,b,c; ch是字符型的,就会分配到2个字节内存。不同类型的变量在内存中分配的字节数不同,同时存储方式也 是不同的。 所以给变量赋值前需要先确定变量的类型,确定了变量的类型,即确定了数据需分配内存空间的大小,数 据在内存的存储方式。 四、Java数据类型在内存中的存储: 1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内 存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型; 2)引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存 模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储 在有序的内存栈上的,而对象本身的值存储在内存堆上的; 区别:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的(需要java中的栈、堆概念), 基本类型和引用类型的内存模型本质上是不一样的。 例1:我们分析一下”==“和equals()的区别。 首先,我定以两个String对象 String a="abc";

Java中八种基本数据类型和八种封装数据类型

Java中八种基本数据类型和八种封装数据类型 初使值的求解过程及比较 作者:Zealjiang 1.八种基本数据类型 创建名为MemberTestBasic的java文件,其内容如下:public class MemberTestBasic { /** 八种基本类型 int, short, float ,double, long, boolean, byte, char */ int i; short s; float f; double d; long l; boolean bo; byte by; char c; public static void main(String[] args) { //创建对象m

MemberTestBasic m=new MemberTestBasic(); m.printMember(); } //为对象m创建一个printMember方法 public void printMember() { System.out.print("int->"+i+"\n"); System.out.print("short->"+s+"\n"); System.out.print("float->"+f+"\n"); System.out.print("double->"+d+"\n"); System.out.print("long->"+l+"\n"); System.out.print("boolean->"+bo+"\n"); System.out.print("byte->"+by+"\n"); System.out.print("char->"+c+"\n"); } } 运行结果如下:

实验3 JAVA基本数据类型

实训报告 实验三JA V A基本数据类型(2) 【实验目的】 1.掌握标识符的定义规则。 2.掌握表达式的组成。 3.掌握Java 基本数据类型及其使用方法。 4.理解定义变量的作用,掌握定义变量的方法。 5.掌握各种运算符的使用及其优先级控制。 6.通过以上内容,掌握Java 语言的编程规则。 【预习内容】 1.一个声明Java 不同数据类型:整形、浮点型、字符型等类型的特点。 2.JAVA各类运算符:算术运算符、关系运算符、逻辑运算符的使用方法。 3. JAVA各类表达式:算术表达式、关系表达式、逻辑表达式的综合应用。 4.熟练掌握JAVA常用输入输出方法的使用。 5.System.out以及Scanner类的使用的。 【实验内容及步骤】 1、请利用Scanner类通过键盘输入三个不同值的整数a、b和c,并将中间值的数显示于屏幕上。 [程序清单] import java.util.Scanner; public class xjp1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a,b,c; System.out.print("请输入a:"); a = scan.nextInt(); System.out.print("请输入b:"); b = scan.nextInt();

System.out.print("请输入c:"); c = scan.nextInt(); if(a>b && a>c) { if(b>c) System.out.println("中间值=" + b); else System.out.println("中间值=" + c); } if(b>a && b>c) { if(a>c) System.out.println("中间值=" + a); else System.out.println("中间值=" + c); } if(c>a && c>b) { if(a>b) System.out.println("中间值=" + a); else System.out.println("中间值=" + b); } } } [程序运行结果(截图)] 2、、请利用Scanner类通过键盘输入两个整型变量a,b的值,输出a+b,a-b,a*b,a/b,(float)a/b,a%b的结果,要求连同算式一起输出,每个算式占一行。 例:a等于10,b等于5, a+b的结果输成 10+5=15

Java语言基本数据类型、转换及其封装

Java语言基本数据类型、转换及其封装Java语言基本数据类型、转换及其封装 1. 逻辑类型 ·常量 true,false。 ·变量的定义 使用关键字boolean来定义逻辑变量: boolean x; boolean tom_12; 也可以一次定义几个: boolean x,tom,jiafei,漂亮 x,tom,jiafei,漂亮都是变量的名字。定义时也可以赋给初值: boolean x=true,tom=false,漂亮=true,jiafei 2.整数类型 ·常量123,6000(十进制),077(八进制),0x3ABC(十六进制)。 ·整型变量的定义分为4种: 1.int 型 使用关键字int来定义int型整形变量 int x int tom_12 也可以定义几个: int x,tom,jiafei,漂亮 x,tom,jiafei,漂亮都是名字。定义时也可以赋给初值: int x=12,tom=-1230,漂亮=9898,jiafei 对于int型变量,分配给4个字节byte,一个字节由8位(bit)组成,4个字节占32位(bit)。bit 有两状态,分别用来表示0,1。这样计算机就可以使用2进制数来存储信息了。内存是一种特殊的电子元件,如果把内存条放大到摩天大

楼那么大,那么它的基本单位——字节,就好比是大楼的房间,每个房间的结构都是完全相同的,一个字节由8个能显示两种状态的bit组成,就好比每个房间里有8个灯泡,每个灯泡有两种状态——亮灯灭灯。 对于 int x=7; 内存存储状态如下: 00000000 00000000 00000000 00000111 最高位:左边的第一位,是符号位,用来区分正数或负数,正数使用原码表示,最高位是0,负数用补码表示,最高位是1。例如: int x=-8; 内存的存储状态如下: 11111111 11111111 11111111 11111000 要得到-8的补码,首先得到7的原码,然后将7的原码中的0变成1,1变成0,就是-8的补码。 因此,int型变量的取值范围是-2^31~2^31-1。 2. byte型 使用关键字byte来定义byte型整型变量 byte x ; byte tom_12; 也可以一次定义几个: byte x,tom,jiafei,漂亮 x,tom,jiafei,漂亮都是名字。定义时也可以赋给初值: byte x=-12,tom=28,漂亮=98,jiafei 注:对于byte型变量,内存分配给1个字节,占8位,因此byte型变量的取值范围是: -2^7~2^7-1。

Java数据类型转换:强制类型转换 自动类型转换28

数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。数据类型的转换可以分为隐式转换(自动类型转换)和显式转换(强制类型转换)两种。 隐式转换(自动类型转换) 如果以下 2 个条件都满足,那么将一种类型的数据赋给另外一种类型变量的时,将执行自动类型转换(automatic type conversion)。 ?两种数据类型彼此兼容 ?目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据) 当以上 2 个条件都满足时,拓宽转换(widening conversion)发生。例如 byte 类型向 short 类型转换时,由于 short 类型的取值范围较大,会自动将 byte 转换为 short 类型。 在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下: ?数值型数据的转换:byte→short→int→long→float→double。 ?字符型转换为整型:char→int。 以上数据类型的转换遵循从左到右的转换顺序,最终转换成表达式中表示范围最大的变量的数据类型。 例 1 顾客到超市购物,购买牙膏 2 盒,面巾纸 4 盒。其中牙膏的价格是 10.9 元,面巾纸的价格是5.8 元,求商品总价格。实现代码如下: 1.public static void main(String[] args) { 2. float price1 = 10.9f; // 定义牙膏的价格 3. double price2 = 5.8; // 定义面巾纸的价格 4. int num1 = 2; // 定义牙膏的数量 5. int num2 = 4; // 定义面巾纸的数量 6. double res = price1 * num1 + price2 * num2; // 计算总价 7. System.out.println("一共付给收银员" + res + "元"); // 输出总价 8.} 上述代码中首先定义了一个 float 类型的变量存储牙膏的价格,然后定义了一个 double 类型的变量存储面巾纸的价格,再定义两个 int 类型的变量存储物品的数量,最后进行了乘运算以及和运算之后,将结果储存在一个 double 类型的变量中进行输出。 程序执行结果如下图 1 所示:

JAVA中常用数据类型之间转换的方法

Java中常用数据类型之间转换的方法 Java中几种常用的数据类型之间转换方法: 1.short-->int转换 exp:short shortvar=0; int intvar=0; shortvar=(short)intvar 2.int-->short转换 exp:short shortvar=0; int intvar=0; intvar=shortvar; 3.int->String转换 exp:int intvar=1; String stringvar; Stringvar=string.valueOf(intvar); 4.float->String转换 exp:float floatvar=9.99f; String stringvar;

Stringvar=String.valueOf(floatvar); 5.double->String转换 exp double doublevar=99999999.99; String stringvar; Stringvar=String.valueOf(doublevar); 6.char->String转换 exp char charvar=’a’; String stringvar; Stringvar=String.valueOf(charvar); 7String->int、float、long、double转换Exp String intstring=”10”; String floatstring=”10.1f”; String longstring=”99999999”; String doubleString=”99999999.9”; Int I=Integer.parseInt(intstring); Float f=Integer.parseInt(floatstring); Long lo=long.parseInt(longstring); Double d=double.parseInt(doublestring); 8String->byte、short转换

java数据类型转换

一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double 型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问题等。下面笔者就 开发中的一些体会介绍给大家。 我们知道,Java的数据类型分为三大类,即布尔型、字符型和数值型,而其中数值型又分为整型和浮点型;相对于数据类型,Java的变量类型为布尔型boolean;字符型char;整型byte、short、int、long;浮点型float、double。其中四种整型变量和两种浮点型变量分别对应于不同的精度和范围。此外,我们还经常用到两种类变量,即String和Date。对于这些变量类型之间的相互转换在我们编程中经常要用到,在下面的论述中,我们将阐述如何实现这些转换。 1 数据类型转换的种类\r java数据类型的转换一般分三种,分别是: (1). 简单数据类型之间的转换 (2). 字符串与其它数据类型的转换 (3). 其它实用数据类型转换 下面我们对这三种类型转换分别进行论述。 2 简单数据类型之间的转换 在Java中整型、实型、字符型被视为简单数据类型,这些类型由低级到高级分别为 (byte,short,char)--int--long--float--double 简单数据类型之间的转换又可以分为: ●低级到高级的自动类型转换 ●高级到低级的强制类型转换 ●包装类过渡类型能够转换 2.1自动类型转换 低级变量可以直接转换为高级变量,笔者称之为自动类型转换,例如,下面的语句可以在Java 中直接通过: byte b;int i=b;long l=b;float f=b;double d=b; 如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如\r char c='c'; int i=c; System.out.println("output:"+i); 输出:output:99; 对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。 short i=99;char c=(char)i;System.out.println("output:"+c); 输出:output:c; 但根据笔者的经验,byte,short,int三种类型都是整型,因此如果操作整型数据时,最好统一使用int型。

Java基本数据类型详解——全英文

Java Basic Data Types Variables are nothing but reserved memory locations to store values. This means that when you create a variable you reserve some space in memory. Based on the data type of a variable, the operating system allocates memory and decides what can be stored in the reserved memory. Therefore, by assigning different data types to variables, you can store integers, decimals, or characters in these variables. There are two data types available in Java: 1.Primitive Data Types 2.Reference/Object Data Types Primitive Data Types: There are eight primitive data types supported by Java. Primitive data types are predefined by the language and named by a key word. Let us now look into detail about the eight primitive data types. byte: Byte data type is a 8-bit signed two.s complement integer. Minimum value is -128 (-2^7) Maximum value is 127 (inclusive)(2^7 -1) Default value is 0 Byte data type is used to save space in large arrays, mainly in place of integers, since a byte is four times smaller than an int. Example : byte a = 100 , byte b = -50 short: Short data type is a 16-bit signed two's complement integer. Minimum value is -32,768 (-2^15) Maximum value is 32,767(inclusive) (2^15 -1) Short data type can also be used to save memory as byte data type. A short is 2 times smaller than an int Default value is 0. Example : short s= 10000 , short r = -20000

java基本数据类型之间的转换.

java 基本数据类型之间的转换 - fishinhouse的专栏 - CSDNBlog fishinhouse的专栏做一件事,最难的是开始,最重要的是坚持。如果坚持,就会达到目的! 登录注册全站当前博客空间博客好友相册留言wl ID:fishinhouse java 基本数据类型之间的转换收藏新一篇: 常用log4j配置 | 旧一篇: java代码编写的30条建议我们知道,Java的数据类型分为三大类,即布尔型、字符型和数值型,而其中数值型又分为整型和浮点型;相对于数据类型,Java的变量类型为布尔型boolean;字符型char;整型byte、short、int、long;浮点型float、double。其中四种整型变量和两种浮点型变量分别对应于不同的精度和范围。此外,我们还经常用到两种类变量,即String和Date。对于这些变量类型之间的相互转换在我们编程中经常要用到,在下面的论述中,我们将阐述如何实现这些转换。 1 数据类型转换的种类 java数据类型的转换一般分三种,分别是: (1. 简单数据类型之间的转换 (2. 字符串与其它数据类型的转换 (3. 其它实用数据类型转换下面我们对这三种类型转换分别进行论述。 2 简单数据类型之间的转换在Java中整型、实型、字符型被视为简单数据类型,这些类型由低级到高级分别为(byte,short,char--int--long--float--double 简单数据类型之间的转换又可以分为:●低级到高级的自动类型转换●高级到低级的强制类型转换●包装类过渡类型能够转换 2.1自动类型转换低级变量可以直接转换为高级变量,笔者称之为自动类型转换,例如,下面的语句可以在Java中直接通过:byte b; int i=b; long l=b; float f=b; double d=b; 如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如r char c='c'; int i=c; System.out.println("output:" i; 输出:output:99; 对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。 short i=99;char c=(chari;System.out.println("output:" c; 输出:output:c; 但根据笔者的经验,byte,short,int三种类型都是整型,因此如果操作整型数据时,最好统一使用int 型。 2.2强制类型转换将高级变量转换为低级变量时,情况会复杂一些,你可以使用强制类型转换。即你必须采用下面这种语句格式: int i=99;byte b=(bytei;char c=(chari;float f=(floati; 可以想象,这种转换肯定可能会导致溢出或精度的下降,因此笔者并不推荐使用这种转换。 2.3包装类过渡类型转换在我们讨论其它变量类型之间的相互转换时,我们需要了解一下Java的包装类,所谓包装类,就是

java基本数据类型练习题

1 . 用8位无符号二进制数能表示的最大十进制数为 ( C ) A. 127 B. 128 C. 255 D. 256 2 .以下能作为char类型的字面值的有( B ) A. "e" B. 'f' C. '\u12' D. '\u0012' E. '\n' 3 . byte变量的取值范围是( B ) A. 0~65535 B. -128~127 C. -256-255 D. 0~32767 4. 以下选项中正确的有(AC ) A. int i = 32; B. float f = 45.32; C. double d=3.2; D. double d=9.21D; 5 .假定x和y为double型,则表达式x=2,y=x+3/2的值是( D ) A. 3.5 B. 3 C. 2.0 D. 3.0 6 .下列对于>>和>>>操作符描述正确的是( ) A.当左面的操作数是正数时,>>和>>>结果相同。 B. B. (-1 >> 1)的结果是0。 C. C. (-1 >>> 1) 的结果是-1。 D. 只有在右面的操作数大于等于1时, >>> 才会返回负数。 7 .有如下一段代码: 1)public class ReturnIt{ 2) returnType methodA(byte x, double y){ 3) return x/y*2; 4) } 5) } 在第2行中,方法methodA的有效返回类型returnType应该是?(D) A. int B. byte C. short D. double 8. 下列代码的执行结果是( D ) 1)public class Beirun{ 2) public static void main(String args[]){ 3) float t=9.0f; 4) int q=5; 5) System.out.println((t++)*(--q)); 6) } 7)} A. 40 B. 40.0 C. 36 D. 36.0 9.下列代码的执行结果是( D ) 1)public class Beirun{ 2) public static void main(String args[]){ 3) System.out.println(5/2); 4) } 5)} A. 2.5 B. 2.0 C. 2.50 D. 2 10. 下列代码的执行结果是( B ) 1)public class Beirun{ 2) public static void main(String args[]){

java中基本数据类型的取值范围

我们前面提到变量的声明格式:变量类型变量名; 这里我们学习JAVA的数据类型. 数据类型可以分为两大类: 1)基本类型; 2)扩展类型。 本节中,我们就一起来学习一下Java语言的基本数据类型。它包括类型描述取值范围 Boolean 布尔型只有两个值true、false Char 字符型 Byte 8位带符号整数 -128到127之间的任意整数 Short 16位无符号整数 -32768~32767之间的任意整数 Int 32位带符号整数 -2^31到2^31-1之间的任意整数 Long 64位带符号整数 -2^63到2^63-1之间的任意整数 Float 32位单精度浮点数根据IEEE754-1985标准 Double 64位双精度浮点数根据IEEE754-1985标准 一些提示: 不象其它程序设计语言,Java语言中的整型的位数是固定的,而不会根据硬件平台以及操作系统的不同而不同。 1> boolean型 在上一章的逻辑运算符中,我们就已经看到过了取值为true和false的变量,这种变量称为boolean型变量。 实例说明 源程序:test601.java public class test601 { public static void main(string args[]) { boolean x=true; boolean y=false; System.out.println("x&&y="+(x&&y)); System.out.println("x||y="+(x||y)); System.out.println("x^y="+(x^y)); System.out.println("!x="+(!x)); } }

java基本数据类型与其封装类

java基本数据类型与其封装类 1 Boolean VS boolean public final class Boolean extends [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Object.html]Object[/url]implements [url=file:///G:/html_zh_CN/html/zh_CN/api/java/io/Serializable.html]Serializable[/url], [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Comparable.html]Comparable[/url]<[url=fil e:///G:/html_zh_CN/html/zh_CN/api/java/lang/Boolean.html]Boolean[/url]> Boolean 类将基本类型为boolean的值包装在一个对象中。一个Boolean类型的对象只包含一个类型为boolean的字段。 此外,此类还为boolean和String的相互转换提供了许多方法,并提供了处理boolean时非常有用的其他一些常量和方法。 2 Byte VS byte public final class Byte extends [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Number.html]Number[/url]implements [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Comparable.html]Comparable[/url]<[url=fil e:///G:/html_zh_CN/html/zh_CN/api/java/lang/Byte.html]Byte[/url]> Byte类将基本类型byte的值包装在一个对象中。一个Byte类型的对象只包含一个类型为byte的字段。 此外,该类还为byte和String的相互转换提供了几种方法,并提供了处理byte时非常有用的其他一些常量和方法。 3 Character VS char public final class Character extends [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Object.html]Object[/url]implements [url=file:///G:/html_zh_CN/html/zh_CN/api/java/io/Serializable.html]Serializable[/url], [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Comparable.html]Comparable[/url]<[url=fil e:///G:/html_zh_CN/html/zh_CN/api/java/lang/Character.html]Character[/url]> Character类在对象中包装一个基本类型char的值。Character类型的对象包含类型为char的单个字段。 此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反之亦然。 4 Double VS double public final class Double extends [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Number.html]Number[/url]implements [url=file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Comparable.html]Comparable[/url]<[url=fil e:///G:/html_zh_CN/html/zh_CN/api/java/lang/Double.html]Double[/url]> Double类在对象中包装了一个基本类型double的值。每个Double类型的对象都包含一个double类型的字段。 此外,该类还提供了多个方法,可以将double转换为String,将String转换为double,还提供了其他一些处理double时有用的常量和方法。

Java的原始数据类型一共就8个

Java的原始数据类型一共就8个,分别是:byte、short、int、long、boolean、char、float、double。注意这些是大小写敏感的,而Boolean是boolean的封装类(wrapper class)。 在java中一个类只能有一个直接父类,但是可以实现多个接口,在继承的同时可以实现接口,之所以取消多继承的原因是多继承使得代码产生很多问题,而使 用单一继承则可以使代码更可靠。 Java有四种访问类型,分别为:public、protected、default、private,其中public变量可以被所有的外部类访问,而protected可以被同一个包及该类的子类访问,default即没有任何修饰符的变量,可以被同一个包中的类访问,而private变量只能在该类内部被访问。题目中的外部类应该理解为除该类自身的所有其他类,因此只有使用private可以达到要求。 类文档API的内容主要是:类层次、类及用途描述、成员变量列表、构造方法列表、成员方法列表、从类层次上继承的方法列表、成员变量的详细说明、构造方法详细说明、成员方法详细说明。 类中有几种变量,分别是:局部变量(local\automatic\temporary\stack variable)是定义在方法里的变量;实例变量(instance valriable)是在方法外而在类声明内定义的变量,有时也叫成员变量;类变量(class variable)是用关键字static声明的实例变量。它们的生存期分别是:局部变量在定义该变量的方法被调用时创建,而在该方法退出后被撤销;实例变量在使用newr Xxxx()创建该类的实例时被创建,而其生存期和该类的实例对象的生存期相同;类变量在该类被加载时被创建,不一定要用new Xxxx()创建,所有该类的实例对象共享该类变量,其生存期是类的生存期。任何变量在使用前都必须初始化,但需要指出的是局部变量必须显式初始化。而实例变量不必,原始类型的实例变量在该类的构造方法被调用时为它分配的默认值,整型是0,布尔型是false,而浮点型是0.0f,引用类型(类类型)的实例变量的默认值是null(没有进行实际的初始

Java基本数据类型

Java基本数据类型 Java是一种强类型语言,即Java中的每一个变量都必须有一个声明的类型。在Java中,有两种类型: 基本类型(primitive type) 有八种 逻辑类boolean 文本类char 整数类byte, short, int, long 浮点类double, float 本章主要讲述基本数据类型。 一.逻辑类──boolean 与C语言不同,Java定义了专门的布尔类型。布尔类型的文字只有两个,

它们是true和false。布尔类型的变量使用关键字boolean来定义。布尔型的文字和变量常常被用在条件判断语句中。 注意:在Java中,布尔型变量不是数值型变量,它不能被转换成任意一种类型。数值型变量也不能被当作布尔型变量使用。这一点和C语言完全不同。 以下是一个有关boolean类型变量的声明和初始化: boolean truth = true; 二.文本类──char和String 1、使用char类型可表示单个字符。一个char代表一个16-bit无符号的(不分正负的)Unicode字符。一个char文字必须包含在单引号内(…?)。 …a? …\t? 一个制表符 …\u????? 一个特殊的Unicode字符。????应严格按照四个16进制数字进行替换 和在C语言中一样,Java也支持转义字符。Java中使用“\”将转义字符与一般的字符区分开来。 Java中的转义字符

2、String不是原始类型,而是一个类(class),它被用来表示字符序列。字符本身符合Unicode标准,且上述char类型的反斜线符号适用于String。与C和C++不同,String不能用\0作为结束。 String 不是一个原始数据类型,它是一个类 具有用双引号引用的文字 “The quick brown fox jumped over the lazy dog.” 可按如下情形使用: String greeting = “Good Morning!! \n”; String err_meg = “ record not found !”; 三.整数类──byte, short, int, long 在Java编程语言中有四种整数类型,每种类型可使用关键字byte, short, int 和long中的任意一个进行声明。 整数类型的文字可使用十进制、八进制和16进制表示,如下所示: 2 十进制值是2 047 首位的0表示这是一个八进制的数值 0xBBAC 首位的0x表示这是一个16进制的数值 注意──所有Java编程语言中的整数类型都是带符号的数字。 整数数据类型—范围 Integer Length Name or Type Range 8 bits byte -2 7 ... 2 7 -1 16 bits short -2 15 ... 2 15 -1 32 bit int -2 31 ... 2 31 -1 64 bits long -2 63 ... 2 63 -1 int是最常用的整数类型。但是如果你要表达很大的数,比如在地理信息系

相关主题