1、1. suppressWarnings( “unchecked“) java 中是什么意思 ?J2SE 提供的最后一个批注是 SuppressWarnings。该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。 一点背景:J2SE 5.0 为 Java 语言增加了几个新的特性,并且和它们一起增加了许多新的警告并承诺在将来增加更多的警告。您可以为 “javac“ 增加 -Xlint 参数来控制是否报告这些警告(如上面的 Deprecated 部分所示)。 默认情况下,Sun 编译器以简单的两行的形式输出警告。通过添加 -Xlint:keyword 标记(例如 -Xl
2、int:finally),您可以获得关键字类型错误的完整说明。通过在关键字前面添加一个破折号,写为 -Xlint:-keyword,您可以取消警告。(-Xlint 支持的关键字的完整列表可以在 javac 文档页面上找到。)下面是一个清单: 关键字 用途 deprecation 使用了不赞成使用的类或方法时的警告 unchecked 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。 fallthrough 当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。 path 在类路径、源文件路径等中有不存在的路径时的警告。 se
3、rial 当在可序列化的类上缺少 serialVersionUID 定义时的警告。 finally 任何 finally 子句不能正常完成时的警告。 all 关于以上所有情况的警告。 SuppressWarnings 批注允许您选择性地取消特定代码段(即,类或方法)中的警告。其中的想法是当您看到警告时,您将调查它,如果您确定它不是问题,您就可以添加一个 SuppressWarnings 批注,以使您不会再看到警告。虽然它听起来似乎会屏蔽潜在的错误,但实际上它将提高代码安全性,因为它将防止您对警告无动于衷 您看到的每一个警告都将值得注意。 下面是使用 SuppressWarnings 来取消 d
4、eprecation 警告的一个例子: public class DeprecatedExample2 Deprecatedpublic static void foo() public class DeprecatedUser2 SuppressWarnings(value=“deprecation“)public static void main(String args) DeprecatedExample2.foo();SuppressWarnings 批注接收一个 “value“ 变量,该变量是一个字符串数组,它指示将取消的警告。合法字符串的集合随编译器而变化,但在 JDK 上,可以传
5、递给 -Xlint 的是相同的关键字集合(非常方便)。并且要求编译器忽略任何它们不能识别的关键字,这在您使用一些不同的编译器时非常方便。 因为 SuppressWarnings 批注仅接收一个参数,并为该参数使用了特殊的名称 “value“,所以您可以选择省略 value=,作为一种方便的缩写: public class DeprecatedUser2 SuppressWarnings(“deprecation“)public static void main(String args) DeprecatedExample2.foo();您可以将单个数组参数中的任意数量的字符串值传递给批注,并在
6、任何级别上放置批注。例如,以下示例代码指示将取消整个类的 deprecation 警告,而仅在 main() 方法代码内取消 unchecked 和 fallthrough 警告: import java.util.*;SuppressWarnings(“deprecation“)public class NonGenerics SuppressWarnings(“unchecked“,“fallthrough“)public static void main(String args) Runtime.runFinalizersOnExit();List list = new ArrayLis
7、t();list.add(“foo“);public static void foo() List list = new ArrayList();list.add(“foo“);SuppressWarnings 是否比前两个批注更有用?绝对是这样。不过,在 JDK 1.5.0 版本中还没有完全支持该批注,如果您用 1.5.0 来尝试它,那么它将类似无操作指令。调用 -Xlint:-deprecation 也没有任何效果。Sun 没有声明什么时候将增加支持,但它暗示这将在即将推出的一个 dot 版本中实现。 更进一步 如果您试图在 Javadocs 页面中查看这些属性,那么您可能很难找到它们。它
8、们位于核心的 java.lang 包中,但有点隐蔽,它们出现在 Javadoc 类的最底端,列在 Exceptions 和 Errors 后面。 注意到了附加在 SuppressWarnings 批注后面的陌生的批注 Target 和 Retention 了吗?这些称为元数据批注,它们描述了该批注在哪里适用。我将在本系列的第二篇文章中介绍它们,以及介绍如何将元数据批注应用到您自己的批注中2. BufferImage的使用?BufferedImage 子类描述具有可访问图像数据缓冲区的 Image。BufferedImage 由图像数据的 ColorModel 和 Raster 组成。Raste
9、r 的 SampleModel 中 band 的数量和类型必须与 ColorModel 所要求的数量和类型相匹配,以表示其颜色和 alpha 分量。所有 BufferedImage 对象的左上角坐标都为 (0, 0)。因此,用来构造 BufferedImage 的任何 Raster 都必须满足:minX=0 且 minY=0。 此类依靠 Raster 的数据获取和设置方法,以及 ColorModel 的颜色特征化方法。3.有关 ExtJs表单控件的用法(1)创建一个表单控件Ext.QuickTips.init();/初始化信息提示功能 var form = new Ext.form.Panel
10、( title:表单 ,/表单标题 height:120,/表单高度 width:200,/表单宽度 frame:true,/是否渲染表单 renderTo :form, defaults:/统一设置表单字段默认属性 autoFitErrors : false,/展示错误信息时是否自动调整字段组件宽度 labelSeparator ::, /分隔符 labelWidth : 50,/标签宽度 width : 150,/字段宽度 allowBlank : false,/是否允许为空 blankText : 不允许为空, labelAlign : left,/标签对齐方式 /msgTarget :
11、qtip /显示一个浮动的提示信息 /msgTarget :title /显示一个浏览器原始的浮动提示信息 msgTarget :under /在字段下方显示一个提示信息 / msgTarget :side /在字段的右边显示一个提示信息 /msgTarget :none /不显示提示信息 /msgTarget :errorMsg /在errorMsg元素内显示提示信息 , items: xtype : textfield, fieldLabel : 姓名 /标签内容 , xtype : numberfield, fieldLabel : 年龄 , selectOnFocus : true,/
12、得到焦点时自动选择文本regex : /(?:1-90-9?|1010-9|120)$/, regexText:年龄错误 /验证错误之后的提示信息, );(2). Ext.form.field.Text 示例Ext.QuickTips.init(); var loginForm = Ext.create(Ext.form.Panel, title:提示验证实例(text), bodyStyle:padding:5 5 5 5,/表单边距 frame : true, height:120, width:200, renderTo :form, defaultType: textfield,/设置
13、表单字段的默认类型 defaults:/统一设置表单字段默认属性 labelSeparator ::, /分隔符 labelWidth : 50,/标签宽度 width : 150,/字段宽度 allowBlank : false,/是否允许为空 labelAlign : left,/标签对齐方式 msgTarget :side /在字段的右边显示一个提示信息 , items: fieldLabel : 用户名 , name : userName, selectOnFocus : true,/得到焦点时自动选择文本 /验证电子邮件格式的正则表达式 regex : /(w+)(.w+)*(w-+
14、.)1,5(A-Za-z)2,4$/, regexText:格式错误 /验证错误之后的提示信息, , name : password, fieldLabel : 密码 , inputType : password/设置输入类型为password , buttons: text : 登陆, handler : function() loginForm.form.setValues(userName:,password:123456); ); (3). Ext.form.field.TestArea示例Ext.QuickTips.init(); var testForm = Ext.create(
15、Ext.form.Panel, title:TextArea示例, bodyStyle:padding:5 5 5 5,/表单边距 frame : true, height:150, width:250, renderTo :form, / items: xtype : textarea, fieldLabel : 备注 , id:memo,/字段组件id labelSeparator ::, /分隔符 labelWidth : 60,/标签宽度 width:200 , buttons:text:确定 ,handler:showValue ) function showValue() var
16、memo = testForm.getForm().findField(memo);/取得输入控件 alert(memo.getValue();/取得控件值 (4)Ext.form.field.Number 示例Ext.QuickTips.init(); var form = Ext.create(Ext.form.FormPanel, title:Ext.form.field.Number示例, bodyStyle:padding:5 5 5 5,/表单边距 renderTo :form, / frame : true, height:150, width:250, defaultType:
17、 numberfield,/设置表单字段的默认类型 defaults:/统一设置表单字段默认属性 labelSeparator ::, /分隔符 labelWidth : 80,/标签宽度 width : 200,/字段宽度 labelAlign : left,/标签对齐方式 msgTarget :side /在字段的右边显示一个提示信息 , items: fieldLabel:整数, hideTrigger : true,/隐藏微调按钮 allowDecimals : false,/不允许输入小数 nanText :请输入有效的整数/无效数字提示 , fieldLabel:小数, decim
18、alPrecision : 2,/精确到小数点后两位 allowDecimals : true,/允许输入小数 nanText :请输入有效的小数/无效数字提示 , fieldLabel:数字限制, baseChars :12345/输入数字范围 , fieldLabel:数值限制, maxValue : 100,/最大值 minValue : 50/最小值 ); 3. Java中的参数传递规则Java中的传递参数规则有两种,分别是值传递和引用传递值传递:如果是以基本数据类型(包括 String类型)做参数进行传递,或以某个类名(包括数组名)作为参数而直接对其类进行操作,这样的传递叫做值传递。
19、引用传递:如果是以某个类名为类型做为参数进行传递而针对该类的属性进行的操作,这样的传递叫做引用传递。也就是说在值传递的过程中其操作不会对所传进来的对象有任何的影响,它传进来的只是该对象的一个副本,其本身不会有任何的改变;而引用传递则传进来的是该对象的一个别名,即引用该对象在虚拟机中的“地址”,因此引用传递会对该“地址”的内部属性产生影响,而不会改变该“地址”在虚拟机中的位置,即引用传递在外部看来是没有发生过任何变话的,但从内部看来,它的属性会随着调用它的方法的改变而改变。4. 构造函数与构造代码块的区别?构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建
20、立。就会调用这个代码块。构造函数:是给与之对应的对象进行初始化。它具有针对性。构造代码块。作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。和构造函数的区别:构造代码块是给所有对象进行统一初始化构造函数是给对应对象初始化5. 创建一个对象在内存中的步骤?Person p = new Person ();创建一个对象都在内存中做了什么事情?1:先将硬盘上指定位置的 Person. class文件加载进内存。2:执行 main方法时,在栈内存中开辟了 main方法的空间(压栈-进栈),然后在 main方法的栈区分配了一个变量 p。3:在堆内存中开辟一个实体空间,分配了一个内存首地址
21、值。New4:在该实体空间中进行属性的空间分配,并进行了默认初始化。5:对空间中的属性进行显示初始化。6:进行实体的构造代码块初始化。7:调用该实体对应的构造函数,进行构造函数初始化。 ()8:将首地址赋值给 p ,p 变量就引用了该实体。(指向了该对象)6. 什么叫覆盖?当子父类中出现了一模一样的方法时,建立子类对象会运行子类中的方法。好像父类中的方法被覆盖掉一样。所以这种情况,是函数的另一个特性:覆盖(复写,重写), 什么时候使用覆盖呢?当一个类的功能内容需要修改时,可以通过覆盖来实现。7. 在继承中,发现子类构造函数运行时,先运行了父类的构造函数。为什么呢?原因:子类的所有构造函数中的第
22、一行,其实都有一条隐身的语句 super();super(): 表示父类的构造函数,并会调用于参数相对应的父类中的构造函数。而super():是在调用父类中空参数的构造函数。为什么子类对象初始化时,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个 super()?)因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。注意:子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句 super(); 如果父类中没有空参数的构造函数,
23、那么子类的构造函数内,必须通过 super语句指定要访问的父类中的构造函数。如果子类构造函数中用 this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。8. Final的特点?1:这个关键字是一个修饰符,可以修饰类,方法,变量。2:被 final修饰的类是一个最终类,不可以被继承。3:被 final修饰的方法是一个最终方法,不可以被覆盖。4:被 final修饰的变量是一个常量,只能赋值一次。9. 抽象类的特点:1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由 abstract关键字修饰(可以描述类和方法,不可以描述变量) 。2:抽象方法只定义方法声明,并
24、不定义方法实现。3:抽象类不可以被创建对象(实例化)。4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。5 抽象类中是否有构造函数?有,用于给子类对象进行初始化。6:抽象类中可以定义非抽象方法7:抽象关键字 abstract和哪些不可以共存?final, private , static8:中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。10.接口的特点:1:接口使用关键字 interface定义的2:接口中包含的成员,常见的有全局常量,抽象方法,但是其格式是固定的。Public static final Stri
25、ng a=“stupid women”Public abstract void get();3:接口中有抽象方法,说明接口不可以实例化。接口的子类必须实现了接口中所有的抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。4:类与接口的关系是实现的关系。实现用 implements关键字。5:接口可以被多实现,这是多继承改良后的结果。接口的出现避免了单继承的局限性。6:一个类在继承另一个类的同时,还可以实现多个接口。所以接口的出现避免了单继承的局限性。还可以将类进行功能的扩展。接口的作用: 1:接口是对外提供的规则。2:接口是功能的扩展。3:接口的出现降低了耦合性。11.抽象类和接口的区
26、别:1:抽象类只能被继承,而且只能单继承。接口需要被实现,而且可以多实现。 2:抽象类中可以定义非抽象方法,子类可以直接继承使用。接口中都有抽象方法,需要子类去实现。3:抽象类使用的是 is a 关系。接口使用的 like a 关系。 4:抽象类的成员修饰符可以自定义。接口中的成员修饰符是固定的。全都是 public的。12.多态的特点:1:体现:父类引用或者接口的引用指向了子类对象。Animal a=new cat();2:好处:提高了程序的课扩展性。3:弊端:父类引用或者接口引用指向的子类对象必须是父类或者接口中已经存在的,访问具有局限性。4:多态的前提:(1) 、必须有继承或者实现的关系
27、(2) 、通常有覆盖操作5:Student instanceof Person = true;/student 继承了 person类关键字 instanceof ;/判断对象是否实现了指定的接口或继承了指定的类6:多态在子父类中的成员上的体现的特点:(1) 、成员变量 - 编译运行都看 = 左边。(2) 、成员函数 - 编译看 = 左边,运行看 = 右边。(3) 、静态函数 - 编译运行都看 = 左边。13.多线程的特点:a) 一个进程至少有一个线程在运行。b) JVM在启动的时候,有一个主线程,负责程序的执行,调用的事 main函数,主线程执行的代码都在 main函数中。c) 返回当前线程
28、的名称:Thread.currentThread().getName()d) 线程要运行的代码都统一存放在了 run方法中e) 线程要运行必须要通过类中指定的方法开启。start 方法。14.throw 和 throws关键字的区别:throw用于抛出异常对象,后面跟的是异常对象;throw 用在函数内。throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws 用在函数上。通常情况:函数内容如果有 throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。15.创建线程的两种方式:1. 继承 Thread,由子类复写 run()方
29、法步骤:a)定义继承 Thread类b)复写 run()方法,把线程运行的代码存储到 run方法中c)通过创建 Thread的子类对象,创建线程对象d)调用线程的 start方法,开启线程,并执行 run()方法2. 实现 Runable接口,覆盖 run()方法步骤:1)定义类实现 Runnable接口。2)覆盖接口中的 run方法(用于封装线程要运行的代码) 。3)通过 Thread类创建线程对象;4)将实现了 Runnable接口的子类对象作为实际参数传递给 Thread类中的构造函数。为什么要传递呢?因为要让线程对象明确要运行的 run方法所属的对象。5)调用 Thread对象的 st
30、art方法。开启线程,并运行 Runnable接口子类中的 run方法实现 Runnable接口可以避免单继承的局限性。16.多线程安全的问题:1.原因:a) 多个线程在操作共享数据b) 多个操作语句对共享数据进行运算2. 解决方案只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这个问题(同步代码块)synchronized(对象) / 任意对象都可以。这个对象就是锁。需要被同步的代码;同步代码块和同步函数的区别?同步代码块使用的锁可以是任意对象。同步函数使用的锁是 this,静态同步函数的锁是该类的字节码文件对象。结束线程的方法:第一种方式:定
31、义循环的结束标记。第二种方式:如果线程处于了冻结状态,是不可能读到标记的,这时就需要通过 Thread类中的 interrupt方法,将其冻结状态强制清除。让线程恢复具备执行资格的状态,让线程可以读到标记,并结束。第三种方式:调用锁的 stop方法(已经过时)17.wait和 sleep区别:1. wait可以指定时间也可以不指定时间。不指定时间,只能由对应的 notify或者notifyAll来唤醒。Sleep 则必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。2. wait:线程会释放执行权,而且线程会释放锁.其他线程可以运行。sleep 则线程会释放执行权,但不是不释放锁
32、。其他线程不可运行。3. wait来源于 java.lang.Object类.而 sleep来源于 java.lang.Thread类4. wait不需要捕获异常,而 sleep必须捕获异常。18.Lock接口与 Condition接口java1.5以后处理多线程的另一种方式。class BoundedBuffer final Lock lock = new ReentrantLock();final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Ob
33、ject items = new Object100;int putptr, takeptr, count;public void put(Object x) throws InterruptedException lock.lock();try while (count = items.length) notFull.await();itemsputptr = x; if (+putptr = items.length) putptr = 0;+count;notEmpty.signal(); finally lock.unlock();public Object take() throws InterruptedException lock.lock();try while (count = 0) notEmpty.await();Object x = itemstakeptr; if (+takeptr = items.length) takeptr = 0;-count;notFull.signal();return x; finally lock.unlock();