0

学java必看的书【合集20篇】

浏览

882

文章

155

篇1:Java中sleep与wait的区别

全文共 1443 字

+ 加入清单

javasleepwait都是用来进行线程控制的,这两者之间有什么区别呢?下面,小编带你去了解一下sleep与wait的区别。

sleep与wait在作用上的区别

sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。例如:

try{

System.out.println("Im going to bed");

Thread.sleep(1000);

System.out.println("I wake up");

}

catch(IntrruptedException e) {

}

wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。例如:

https://Thread 1

try{

obj.wait();https://suspend thread until obj.notify() is called

}

catch(InterrputedException e) {

}

sleep与wait在本质上的区别

sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.

而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但这个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处继续执行.

其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题

在java.lang.Thread类中,提供了sleep(),

而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程

sleep()可以将一个线程睡眠,参数可以指定一个时间。

而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。

wait有两种形式wait()和wait(milliseconds).

sleep与wait在用法上的区别

sleep()不释放同步锁,wait()释放同步缩。

sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断。

wait()可以用notify()直接唤起。

小编总结:sleep和wait的区别

1、这两个方法来自不同的类分别是Thread和Object。

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

synchronized(x){

x.notify()

https://或者wait()

}

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。

展开阅读全文

篇2:java中随机生成随机数及不重复的随机数字

全文共 172 字

+ 加入清单

工具/材料

Visual Studio 2015

操作方法

1

先在第一行引入util库,如下图所示,然后实例化Random,接着调用nextInt生成随机数,如下图所示

2

运行程序,可以看到生成了一个0到5之间的随机数,如下图所示

3

下面我们来实现随机生成不重复的随机数,如下图所示,程序随机生成6个随机数并且不重复

4

运行程序以后,你会看到生成的6个随机数都彼此不重复,如下图所示

展开阅读全文

篇3:如何定义和遍历二维数组java

全文共 156 字

+ 加入清单

java中我们经常会使用二维数组,那么如何定义和输出二维数组呢?下面小编给大家分享一下。

工具/材料

Java编辑器

操作方法

1

首先我们打开编辑器,新建一个Java文件,如下图所示

2

接下来我们在Java文件中定义main函数,如下图所示

3

接着在main函数中用括号声明二维数组,如下图所示

4

最后在利用嵌套for循环遍历二维数组即可,如下图所示

展开阅读全文

篇4:如何选择JAVA学习书籍

全文共 238 字

+ 加入清单

操作方法

1

任何技术都是需要入门的,所以一开始的时候建议选择java变成入门类的书籍学习,先对基础的语法和基本用法搞清楚。

2

基本语法用法搞清楚之后,就要锻炼一下自己的思想了,可以挑选Java编程思想这类书籍来打开大脑的思维,能够打好自己的基础,也能够锻炼思维方式。

3

基础条件打好之后就是进阶了,《重构 改善既有代码的设计》 这本书是挺不错的,名气也很大,内容有很多实践经验。

4

如果再往高处发展的话,就是应用架构模式的学习了,挑选书籍的时候就针对架构知识来进行挑选,那么基础性的书籍就别去看了。

展开阅读全文

篇5:java什么是链表

全文共 1320 字

+ 加入清单

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

链表(Chain本文所说链表均为单向链表,以下均简称单向链表)实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。而向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。

节点(Node)是由一个需要储存的对象及对下一个节点的引用组成的。也就是说,节点拥有两个成员:储存的对象、对下一个节点的引用。

这样说可能大家不是很明白,我贴一张图大家可能更容易理解。

那么大家可能清除了,为什么说有了头节点就可以操作所有节点。因为有着不断的引用嘛!

那么在链表里的属性大概就只有两个了:头节点和节点数量。当然,根据需要,我们通常需要更多的属性。

简单的链表可以写为下面的样子:

1 package myChain;

2

3 /**

4 * (单向)链表

5 *

6 * @author Johness

7 */

8 public class PersonChain {

9 private PersonChainNode head; // 头节点

10 private int size; // 链表的实体(即节点的数量)

11 private int modCount; // 链表被操作的次数(备用)

12

13 /**

14 * 获得链表中节点数量

15 *

16 * @return 链表中节点数

17 */

18 public int getSize() {

19 return this.size;

20 }

21

22 /**

23 * 添加节点的一般方法

24 *

25 * @param p

26 * 添加到链表节点的对象 由于实现细节,作为唯一标识,同一个编号的Person只能添加一次

27 */

28 public void addNode(Person p) {

29 if (!contains(p.personNo)) { // 如果链表中没有该对象,则准备添加

30 if (head != null) { // 如果有头节点,则添加新节点作为头节点

31 head = new PersonChainNode((myChain.Person) p, head);

32 size++;

33 modCount++;

34 } else { // 如果没有头节点,则添加对象作为头节点

35 head = new PersonChainNode((myChain.Person) p, null);

36 size++;

37 modCount++;

38 }

39 }

40 }

41 }

以上的代码就是一般链表的骨架了。拥有两个重要属性。

展开阅读全文

篇6:java中序列化是什么

全文共 1351 字

+ 加入清单

简单来说序列化就是一 种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化 后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!

如 上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问题吗?别急,其中一个最大的问题就是对象引用!举个例子来 说:假如我有两个类,分别是A和B,B类中含有一个指向A类对象的引用,现在我们对两个类进行实例化{ A a = new A(); B b = new B(); },这时在内存中实际上分配了两个空间,一个存储对象a,一个存储对象b,接下来我们想将它们写入到磁盘的一个文件中去,就在写入文件时出现了问题!因为 对象b包含对对象a的引用,所以系统会自动的将a的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,内存分配了三个 空间,而对象a同时在内存中存在两份,想一想后果吧,如果我想修改对象a的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所 希望的!

以下序列化机制的解决方案:

1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)

2.当要保存一个对象时,先检查该对象是否被保存了。

3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象

通过以上的步骤序列化机制解决了对象引用的问题!

序列化的实现

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

修改默认的序列化机制

在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义时给它加上transient关键字即可,对于 transient字段序列化机制会跳过不会将其写入文件,当然也不可被恢复。但有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类 型,这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢?好在序列化机制为包含这种特殊问题的类提供了如下的方法定义:

private void readObject(ObjectInputStream in) throws

IOException, ClassNotFoundException;

private void writeObject(ObjectOutputStream out) throws

IOException;

(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)

使用以上方法我们可以手动对那些你又想序列化又不可以被序列化的数据字段进行写出和读入操作。

展开阅读全文

篇7:java什么是反射

全文共 1258 字

+ 加入清单

反射指程序可以访问、检测和修改它本身状态或行为的一种能力程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

java中的反射,我们常见是取得构造方法,成员变量,普通方法,还有对数组反射的操作。

1、反射的精辟定义:反射就是把Java类中的各种成分映射成相应的Java类。

2、Class实例表示正在运行的Java应用程序中的类和接口。所有的

3、反射除了方法体得不到,别的都可以得到。包括可以得到类里私有的成员变量。本人觉得这破坏了Java的封装性,不知道为什么要这么设计。

一、构造方法的反射

(1)得到需要反射的类Class。知道类名可以使用forName(String className) 方法。也可以通过对象的.getClass方法获得。或者明确去获得哪个类型。比如我们有一个Person类,我们想得到这个类的实例可以写成 Person.class。

(2)构造方法用Constructor类表示。可以通过刚才得到的Class,使用getConstructor方法获得,想获得什么形参的构造方法,就传入什么形参类型的Class,比如想取得String的String(StringBuffer buffer) 构造方法可以这样:String.class.getConstructor(StringBuffer.class)。

(3)使用取得的构造方法创建对象,我们需要使用newInstance方法,形参为可变参数,按上面取得的String的构造方法,我们就可以这样创建对象,String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer())

二、成员变量的反射

(1)我们同样需要取得反射的类Class。

(2)Java中使用Field类表示字段,我们想获得成员变量可以使用Class的getField(String name)方法,参数为成员变量的名字。也有getFields()方法取得该类的所有成员变量,返回值为Field的数组。取得Field的值,使用 get方法,设置值使用set方法。

(3)暴力访问私有成员使用setAccessible方法,getType() 取得Field类型,getName()取得Field的字段名称。

三、普通方法的反射

(1)取得反射类Class。

(2)方法使用Method类定义,获得方法使用getMethod(String name, Class… parameterTypes) ,用法很像获得构造方法,只是多出一个方法名的参数。

(3)getReturnType()获得方法的返回值类型,getParameterTypes()获得所有形参类型。

(4)用invoke调用方法第一个参数为需要调用的对象,第二个参数为用于调用的参数。

展开阅读全文

篇8:net和java的区别

全文共 712 字

+ 加入清单

net是微软的王牌,不能跨平台,运行时,速度和java基本不相上下,但是.NET的开发速度很快,但是安全性总是.NET开发者的瓶颈,在有就是在.NET中的线程很难控制.

Java是跨平台的,而且Java开发的安全性最高,线程很好控制,运行速度是依据框架而定的,如果用Struts开发Web它的速度会比较平均,但是用JSF它的启动很慢,但是一旦加载完毕后,速度飞快,只要不清楚浏览器记录,它就会永远保持此速度.但是Java也存在许多问题,比如开发速度及其缓慢,搭建框架时需要弄许多配置文件。

比较:

1.在 web 开发方面 java 绝对第一, 因为java 比 .net、 php更加稳定,安全,开发效率高,功能更加强大。java 在web 应用方面 光java服务器就有好多(tomcat,jboss,weblogic,websphere),这些都可以运行java项目,而.net 只可以在微软的IIS服务器上运行局限性很大。

2.在单机软件开发方面,如果开发windows应用那还是 .net 好一些,因为windows 和 .net都是微软的产品所以在开发window应用方面.net更兼容一些。

3.在智能设备软件开发上,java更强,你该知道 android 智能手机 ,它的应用都是用java 开发的,其实在android出来之前,就有J2me 能开发手机上的软件了。

总的说来,java 的前景比.net 好,现在做java 的公司绝对比.net 多。两者在上述三个方面都能做,我在上面三个方面比较了一下哪个更强。 也就是说 java 比 .net更强。这么说吧,一般银行的网上系统都选用 java开发,这就不言而喻了。

展开阅读全文

篇9:java中成员变量和局部变量的区别

全文共 898 字

+ 加入清单

成员变量局部变量都是java中的两种变量,那么,它们两者具体上有哪些区别呢?

1、java中成员变量和局部变量的区别

1.成员变量在类中,局部变量在方法中。

2.声明成员变量时可以不初始化(被final修饰且没有static的必须显式赋值),而局部变量必须手动初始化。 3.成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及static修饰;两者都可 以定义成final型。

4.成员变量存储在堆,局部变量存储在栈。

5.存在时间不同。

2、定义

成员变量:作为类的成员而存在,直接存在于类中。

局部变量:作为方法或语句块的成员而存在,存在于方法的参数列表和方法定义中。

局部变量在使用前必须被程序员主动的初始化,和此形成对比,系统中的成员变量则会被系统提供一个默认的初始值。所以在语法上,类的成员变量能够定义后直接使用,而局部变量在定义后先要赋初值,然后才能使用。

3、小编举例

类变量是类中独立于方法之外的变量,用static 修饰。

实例变量也是类中独立于方法之外的变量,不过没有static修饰。

局部变量是类的方法中的变量。

看下面的伪代码说明:

public class Variable{

static int allClicks=0;https://类变量

String str="hello world";https://实例变量

public void method(){

int i =0;https://局部变量

}

}

实例变量也称为:“域”,“成员变量”,在实体类或数据类中被称为“属性”或“字段”。当实例变量可以改变时,被称为对象的状态。

final用于常量的声明,规范要求常量的变量名是大写的。

statci 在java 里面用于对类方法和属性进行修饰,其作用是什么呢?

有两种情况是non-static无法做到的,这时你就要使用statice。

第一种:你希望不论产生了多少个对象,或不存在 任何对象的情形下,那些特定数据的存储空间都只有一份;

第二种:你希望某个函数不要和class object绑在一起。即使没有产生任何object,外界还是可以调用其static函数,或是取用其static data。

展开阅读全文

篇10:手机QQ的Java版本如何修改个人资料

全文共 531 字

+ 加入清单

手机QQ的java版本修改个人资料方法:登录手机QQ后,点击菜单=》我的资料=》个人资料,进入后即可设置相应的个人资料(包括昵称、个性签名、QQ秀、性别、姓名、生日、毕业院校、生肖、星座和个人说明)。

手机QQ是将QQ聊天软件搬到手机上,满足随时随地免费聊天的需求。新版手机QQ更引入了语音视频、拍照、传文件等功能,与电脑端无缝连接,包括音乐 试听、手机影院等功能。手机QQ是腾讯公司专门为手机用户打造的的一款随时随地聊天的手机即时通讯软件,即使没有电脑照样可以跟好友聊天,语音视频,发图片;还能下载最新铃声,图片。

手机QQ跟电脑QQ互联,能显示全部105个系统QQ头像,96个QQ图形表情让聊天更有乐趣。可显示QQ群、最近联系人、陌生人、黑名单。在线添加好友,查看好友资料和QQ秀,保存聊天记录。个性化设置皮肤、声音,更改在线状态,针对智能手机还提供了传送文件的功能。 即使出门在外也可以跟好友聊天、视频、语音对讲、拍照即时发送、浏览娱乐资讯、下载酷铃美图、在线视听、欣赏MV……(根据不同手机型号功能会有差异)和电脑上的QQ一样好玩。手机QQ还可以发邮件、进行手机搜索,访问手机Qzone,浏览手机腾讯网……为用户打造手机在线生活平台,畅享手机娱乐、聊天生活。

展开阅读全文

篇11:win10环境下如何配置java环境变量

全文共 441 字

+ 加入清单

很多程序员小伙伴们已经升级到了win10版本,那么win10的java环境该怎么配置

工具/材料

Windows10

jdk

操作方法

1

右击“此电脑”,选择“属性”

2

选择“高级系统设置”

3

选择“环境变量

4

选择“新建”

5

点击新建后,就会出现这个,变量名为“JAVA_HOME”,变量值,必须是自己装jdk时的路径,路径问题也需要注意

6

接下来找到“CLASSPATH”,没有的话就“新建”

7

变量名为“CLASSPATH”变量值“.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar;”

8

找到Path,对其进行编辑,在其原有变量值前加上“;%JAVA_HOME%in;%JAVA_HOME%jrein;”,加的方法就是这样的C:变量值

9

记得完成后要点两个确定

10

最后,就是测试自己配置是否成功了,同时按 R+ WIN,输入cmd

11

进入命令提示符,输入JAVA,点击“Enter”,出来这些中文,就行了

12

再输入JAVAC,点击“Enter”,出来这些中文就行了,win10的java环境就配置好了

展开阅读全文

篇12:java中基本数据类型的值范围

全文共 301 字

+ 加入清单

java中一共有八种基本数据类型,分别是 byte、short、int、long、float、double、char、boolean ,进一步划分的话,又可以分为整型,浮点型,boolean型和char型,每种数据类型都有自己的值范围

操作方法

1

整型包括byte、short、int、long四种,其取值范围整理如下图

2

浮点型根据精度的不同分为float和double两种,其取值范围整理如下图,double的精度比float高,一般默认浮点数都是double类型的

3

boolean型,只有两个选择,true或者false

4

char型,存放字符类的数据,采用unicode编码,举个小例子,u0031对应的是1,如下图

展开阅读全文

篇13:java如何判断两个字符串是否相等

全文共 359 字

+ 加入清单

java如何判断两个字符串是否相等?估计很多朋友觉得这个问题很简单,但如果稍不注意,就会被坑了,下面我们来看一下。

操作方法

1

一般情况下,我们都是使用==来判断两个字符串是否相等,如图的代码没问题。

2

但如果我们用字符串的构造函数来初始化两个字符串,再用==来做比较,却发现运行结果是不相等的。因为这两个字符串是不同的两个对象,用==是比较这两个字符串是否是同一个对象的。

3

那么如果要比较两个字符串是否相同,即他们的值是否相等,我们就不太适合使用==来判断了,而是应该使用字符串的equals方法来比较,代码如图。

4

无论是使用=号来赋值字符串(String str1 = "sogou";),还是使用new语句来初始化字符串(String str1 = new String("sogou");)使用equals方法都可以得到正确的结果。

展开阅读全文

篇14:java什么是实例意思指的是

全文共 4601 字

+ 加入清单

1. 首先看下定义的注解类:

类注解定义, MyClassAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.*;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: class annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.TYPE)

public @interface MyClassAnnotation

{

String uri();

String desc();

}

默认构造方法注解定义,MyConstructorAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: Constructor annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.CONSTRUCTOR)

public @interface MyConstructorAnnotation

{

String uri();

String desc();

}

方法注解定义,MyMethodAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: method annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.METHOD)

public @interface MyMethodAnnotation

{

String uri();

String desc();

}

字段注解定义, MyFieldAnnotation.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: field annotation

*/

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.FIELD)

public @interface MyFieldAnnotation

{

String uri();

String desc();

}

2. 再看下我们注解的应用和测试:

在类上面使用了MyClassAnnotation注解, 默认构造方法上使用了MyConstructorAnnotation注解, 自定义方法上使用了MyMethodAnnotation注解, 自定义字段上使用了MyFieldAnnotation注解, 在Mail函数中则实现了访问这些注解,并打印注解信息.

MySample.java:

[java] view plain copy

package com.ross.annotation;

import java.lang.reflect.*;

/**

* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com

* Date: 2012-1-29

* Since: MyJavaExpert v1.0

* Description: This class is used to show how to use the annotation of each level

*/

@MyClassAnnotation (uri = "com.ross.MySample" , desc = "The class name" )

public class MySample

{

@MyFieldAnnotation (uri = "com.ross.MySample#id" , desc = "The class field" )

public String id;

/**

* Description: default constructor

*/

@MyConstructorAnnotation (uri = "com.ross.MySample#MySample" , desc = "The default constuctor" )

public MySample()

{

}

/**

* Description: normal method

*/

@MyMethodAnnotation (uri = "com.ross.MySample#setId" , desc = "The class method" )

public void setId(String id)

{

this .id = id;

}

/**

* Description: MyAnnotation test

* @throws NoSuchMethodException

* @throws SecurityException

* @throws NoSuchFieldException

*/

public static void main(String[] args) throws SecurityException,

NoSuchMethodException, NoSuchFieldException

{

MySample oMySample = new MySample();

https:// get class annotation

MyClassAnnotation oMyAnnotation = MySample.class

.getAnnotation(MyClassAnnotation.class );

System.out.println("Classs uri: " + oMyAnnotation.uri() + "; desc: "

+ oMyAnnotation.desc());

https:// get constructor annotation

Constructor oConstructor = oMySample.getClass().getConstructor();

MyConstructorAnnotation oMyConstructorAnnotation = (MyConstructorAnnotation) oConstructor

.getAnnotation(MyConstructorAnnotation.class );

System.out.println("Constructors uri: "

+ oMyConstructorAnnotation.uri() + "; desc: "

+ oMyConstructorAnnotation.desc());

https:// get method annotation

Method oMethod = oMySample.getClass().getDeclaredMethod("setId" ,String. class );

MyMethodAnnotation oMyMethodAnnotation = oMethod

.getAnnotation(MyMethodAnnotation.class );

System.out.println("Methods uri: " + oMyMethodAnnotation.uri()

+ "; desc: " + oMyMethodAnnotation.desc());

https:// get field annotation

Field oField = oMySample.getClass().getDeclaredField("id" );

MyFieldAnnotation oMyFieldAnnotation = oField

.getAnnotation(MyFieldAnnotation.class );

System.out.println("Fields uri: " + oMyFieldAnnotation.uri()

+ "; desc: " + oMyFieldAnnotation.desc());

}

}

控制台打印结果:

[plain] view plain copy

Classs uri: com.ross.MySample; desc: The class name

Constructors uri: com.ross.MySample#MySample; desc: The default constuctor

Methods uri: com.ross.MySample#setId; desc: The class method

Fields uri: com.ross.MySample#id; desc: The class field

至此本实例就完成了, 其实就是抓住两点一个是定义注解类,另外一个是如何访问注解, 就算是学会了.

展开阅读全文

篇15:Java ADT中如何使用ImageView控件

全文共 470 字

+ 加入清单

我们使用javaADT做Android应用的时候,经常会需要使用ImageView控件插入图片。那么如何在Java ADT中使用ImageView控件呢?下面小编给大家分享一下。

工具/材料

Java ADT

操作方法

1

首先我们打开Java ADT软件,在左侧空白处右键单击选择New下面的Android Application Project选项,如下图所示

2

接下来在弹出的新建项目页面填写Application的基本信息,如下图所示

3

然后我们在res文件夹下面新建一个drawable文件夹,如下图所示

4

接着准备一张图片拷贝到新建的drawable文件夹下面,如下图所示

5

接下来我们在控件列表中找到ImageView控件,将其拖拽到模拟器界面中,如下图所示

6

然后会自动弹出如下图所示的界面,我们选择Project Resources选项,接着选择刚才拷贝的图片,如下图所示

7

接下来我们打开ImageView的资源定义文件夹,用src属性引入图片文件,如下图所示

8

最后我们回到模拟器的主界面,你就会看到图片被插入进来了,到这里我们就完成了利用ImageView插入图片的功能了

展开阅读全文

篇16:Java中throw和throws的区别

全文共 1333 字

+ 加入清单

java中有throw语句和throws语句,这两种语句都是用来抛出异常的。那么,这两种语句在具体运行的时候又有哪些区别呢?下面小编带你去了解一下。

1.语句抛出的异常

用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。

throw是语句抛出一个异常。

语法:

throw (异常对象);

throw e;

throws是方法可能抛出异常的声明。用在声明方法时,表示该方法可能要抛出异常。

语法:

[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}

public void doA(int a) throws Exception1,Exception3{......}

2.系统自动抛出的异常

所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。

3.小编举例

throws E1,E2,E3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常E1,E2,E3可能是该函数体产生的。

throw则是明确了这个地方要抛出这个异常。

如: void doA(int a) throws Exception1,Exception3{

try{

......

}catch(Exception1 e){

throw e;

}catch(Exception2 e){

System.out.println("出错了!");

}

if(a!=b)

throw new Exception3("自定义异常");

}

代码块中可能会产生3个异常,(Exception1,Exception2,Exception3)。

如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。

如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!");)。所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用写了。

而Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。

throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。

throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。

throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

throws说明你有那个可能,倾向。

throw的话,那就是你把那个倾向变成真实的了。

同时:

1、throws出现在方法函数头;而throw出现在函数体。

2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。

3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

展开阅读全文

篇17:手机QQ Java版本为什么无法传输文件

全文共 616 字

+ 加入清单

手机QQjava版本无法传输文件是由于Java应用程序没有权限访问手机中的文件,即使接收了也无法保存;接收到的图片可以暂时保存在内存中,退出程序或者收到新的图片时会被清除。

手机QQ是将QQ聊天软件搬到手机上,满足随时随地免费聊天的需求。新版手机QQ更引入了语音视频、拍照、传文件等功能,与电脑端无缝连接,包括音乐 试听、手机影院等功能。手机QQ是腾讯公司专门为手机用户打造的的一款随时随地聊天的手机即时通讯软件,即使没有电脑照样可以跟好友聊天,语音视频,发图片;还能下载最新铃声,图片。

手机QQ跟电脑QQ互联,能显示全部105个系统QQ头像,96个QQ图形表情让聊天更有乐趣。可显示QQ群、最近联系人、陌生人、黑名单。在线添加好友,查看好友资料和QQ秀,保存聊天记录。个性化设置皮肤、声音,更改在线状态,针对智能手机还提供了传送文件的功能。 即使出门在外也可以跟好友聊天、视频、语音对讲、拍照即时发送、浏览娱乐资讯、下载酷铃美图、在线视听、欣赏MV……(根据不同手机型号功能会有差异)和电脑上的QQ一样好玩。手机QQ还可以发邮件、进行手机搜索,访问手机Qzone,浏览手机腾讯网……为用户打造手机在线生活平台,畅享手机娱乐、聊天生活。软件名称:手机QQ软件版本:2.3 官方正式版软件大小:5.68MB软件授权:免费适用平台:Android下载地址://dl.pconline.com.cn/download/61068.html

展开阅读全文

篇18:velocity调用java方法

全文共 4686 字

+ 加入清单

velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅使用简单的模板语言(template language)来引用由java代码定义的对象。下面由小编整理了几种vlookup函数的使用方法,希望对大家有所帮助。

JAVA语言特点

1.简单性

Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。

2.面向对象

Java是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。

Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。例如,Java提供产生图形用户接口部件的类(java.awt包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(java.io包)和支持网络功能的类(java.net包)。

3.分布性

Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。

网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。

4.编译和解释性

Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。

在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。

velocity调用java方法2

1, 注释,任何一种语言中,注释总是必不可少的。

(1) 单行注释:

## 这是单行注释

(2) 多行注释:

#*

这是多行注释

*#

2, 输出,也就是数据展现。

$userName

这样便可以输出用户名了。但是,并不是绝对的能够输出用户名,因为可能这里输出的变量并不存在。如果userName这个变量不存在,或者为空,$userName将会被当 作字符串直接输出,也就是当我们期望在userName为空的时候输出空,但是却输出了’$userName’。为了避免这种情况,推荐这样的变量输出写法:

$!{userName}

3, 变量声明与赋值

一般情况下,我们不推荐在html页面中直接声明Velocity变量,因为这会增加html界面的复杂度。如果确实有必要,可以使用下面的语句声明变量并赋值:

#set($userName=’hanmeimei’)

请注意:Velocity的变量声明都要带着$符号。

在LML中,我们经常在所谓的后台,也就是Action中给变量赋值,这样在Action对应的html模板中也可以直接使用该变量。可使用一下两种方法:

(1) 传统的getter/setter

(2) ViewBag.Add(key,value)

相比之下,第二种非传统的方式更快速。

4, 算术运算

Velocity支持在模板中使用(+,—,*,/),例如:

#set($a=1)

#set($b=1)

#set($c=$a + $b)

C在算对的情况下等于2,算错的情况下等于3.。有一个问题大家需要注意,我在使用四则运算的时候,发现’—‘不起作用,最后经过尝试,发现需要在变量和运算符之 间留一个空格,这样就没问题了。如果,你也遇到这样的问题,也可以这么尝试一下。

5, 逻辑运算

支持一下几个运算符,就如同java一样:

&&:与。

||:或。

!:非。

6, 迭代

#foreach ($item in $list)

这是第 $velocityCount 个元素: $item

#end

$velocityCount,表示当前序号。

还要说一下我们在LML中分页显示数据用到的迭代,如下:

#foreach($item in $pager.result.rows)

$item.userName

##以下两种方式可迭代列

#set($row=$item.values().toArray())

##方式1

#foreach($a in $row) $!a #end

##方式2

#foreach($i in [0..2]) $row.item($i) #end

#end

$pager.result是在分页Action中查询到的一个数据集Result。

我们也可以在模板中直接声明并赋值一个list,而后进行迭代:

#set( $list = ["a", "b", "c"])

#foreach ($item in $list)

$velocityCount

#end

还有一种情况,我们需要迭代从1到10,所有的整数:

#foreach ($item in [1..10])

$velocityCount

#end

注意中间就是两个点。

查阅很多资料,都直接说明Velocity不能迭代数组,下面说明原因:

对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组又是一个特殊的Array,所以虽然数组可以进行循环列举,但却不能定位访问特定位置 的 元素,如 strs[2],数组对固定位置元素的访问调用了Array的反射方法get(Object array, int index),而Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的方式来包装,要么就通过公用Util类的方式来提供,传入数组对象和要访问的位置参数,从而达到返回所需值的目的。

Velocity支持迭代的数据类型有:Vector、Hashtable或者Array

7, 条件判断

#if (条件1)

#elseif (条件2)

#else

#end

一直不是很理解Velocity的数据类型,所以在项目中最多使用的是String,就像这里的条件表达式,我们经常这样写: if(“$!{userSex}”==”0”),虽然性别使用int表示。

8, 文件引入,#include与#parse

两者作用类似,但是有以下不同:

(1) 与#include不同的是,#parse只能指定单个对象。而#include可以有多个

如果您需要引入多个文件,可以用逗号分隔就行:

#include ("a.gif", "b.txt", "c.htm" )

在括号内可以是文件名,但是更多的时候是使用变量的:

#include ( “a.txt”, $photo )

(2) #include被引入文件的内容将不会通过模板引擎解析;

而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。

以上两点摘自互联网,到目前我基本没有使用过#include。#parse最大的用处或许是这样用:

#parse(“title.html”)

类似layout。

9, 内置对象

Velocity内置了一些对象,在模版里可以直接调用,列举如下:

$request、$response、$session

这些一直也没使用过,完全可以在Action页面把各种对象处理好了。

基本上,在我们的一般开发中,掌握以上语法已经可以应付自如了。是不是很简单呢,我们希望的不就是简单吗,简单所以快。写的不好,敬请见谅。

补充:

LML支持在html模板中直接调用java方法,并可以向方法传递参数(字面值,或者Velocity变量),还可以输出方法的返回值。当然,为了避免模板页面过于复杂,我们还是应该尽量减少在模板中调用java方法。如果确实有必要调用,则需要现在模板页面对应的Action类上先行声明:

@Helper( { TestHelper.class })

这样就可以在html模板中调用:

$!TestHelper.Test("$!{userName}")

velocity调用java方法3

项目结构 velocity tool java类

public class T {

public String msg() {

return "难道必须没有报名嘛 会疯掉的!";

}

public String getMessage() {

return "message";

}

public String sayHello(String s) {

return "say hello by macro " + s;

}

}

以上是类 无包名

以上是tools.xml文件内容存放在web-inf下

input.encoding=utf-8

output.encoding=utf-8

# Filepath for error template, relative to web application root directory

tools.view.servlet.error.template = error.vm

# Directory for layout templates, relative to web application root directory

tools.view.servlet.layout.directory = /

# Filepath of the default layout template

# relative to the layout directory

# NOT relative to the root directory of the webapp!

tools.view.servlet.layout.default.template = default.vm

以上是velocity.properties 存放与web-inf下

velocity

org.apache.velocity.tools.view.VelocityViewServlet

org.apache.velocity.toolbox

/WEB-INF/tools.xml

org.apache.velocity.properties

/WEB-INF/velocity.properties

velocity

*.vm

index.vm

以上是web.xml

$screen_content

呵呵的部分

以上是default.vm

#set($page_title="Layout Test")

#set($layout="default.vm" )

$t.getMessage()

展开阅读全文

篇19:如何学习java?:数组的定义及使用

全文共 141 字

+ 加入清单

操作方法

1

虽然java学习过程非常辛苦,但是只要自己有耐心,敢于去尝试,一定可以把java学好。首先数组定义语法分为两种,如下图所示。

2

其中type是java中的任意数据类型,另一个是数组名。

3

[]表示的是该变量是一个数组类型变量。

4

在给数组元素赋值时,就需要用到数组类型变量和名字,如下图所示

展开阅读全文

篇20:java区块链技术是什么?区块链有何特征?

全文共 909 字

+ 加入清单

提到区块技术多数人都会想到比特币,却很少有人会提及java区块链技术。普通人对区块链了解少,不知道java区块链技术,也不知道java是编写区块链技术的一种编程语言。区块链是多种底层技术的合集,现在被大家当成一种新兴技术,它有多种特性,并不是一种编程语言写出来的。但是单独使用java技术依旧可以编写出简单的区块链。下面一起来学学java区块链技术是什么?区块链有何特征

一、java区块链技术是什么区块链技术刚开始只是用来创造比特币,没想到比特币的行情随着时间不断上涨,随即全球各国都将关注点聚焦在比特币和区块链上。此时很多擅长编程的技术人员也尝试用java编写区块链技术。其实java区块链技术就是java语言编写出来的区块链,同样会具有去中心化和开源代码等特性。要是你对区块链技术感兴趣,又懂得java编程,可以尝试编一个试试。毕竟只要先将区块呈现出来,然后将区块链链接,再通过挖矿方式不断挖出新的区块就行。不过我们现在常见的区块链技术可不只是java一种编程技术,而是融入了C++和C#等多种编程技术。

二、java区块链有什么特征对于用户来说java编程语言很少接触,所以会觉得懵。但是区块链技术这几年很流行,所以普用人对java区块链技术都有所了解。区块链因为是采用的开源代码,所以它的所有代码都是公开透明没有秘密的。而且区块链技术还具有去中心化的特性,不会受到企业机构或者人的影响,而java也可以让区块链保持这一特性。当然区块链还具有防篡改性,数据一旦记录就不更改,而且对于用户的身份信息具有隐匿性。区块链还有可追溯性,可以查看到数据的来源,能够运用到一些需要追溯责任的领域。

这几年全球各个国家都很注重区块链技术的发展,区块链不再只是数字货币专属技术,它被运用到了更多的领域。现在java区块链技术不但促进着数字货币的发展,在各国的金融、交通、医疗和农业领域都起着非常重大的作用。要是你对区块链技术感兴趣,可以到OKLink上学习它的基础知识,也可以从上面的各种虚拟币开始了解。当你学会使用OKLink浏览器,你还可以通过所学的区块链技术和数字货币知识做投资,毕竟现在已经有不少人做数字货币投资赚了钱。

展开阅读全文