内部类是定义在另一个类体中的类的名称与定义它的类的名称可以相同?

可以有多个类但只能有一个public的类,并且public的类名必须与文件名相一致

一個文件中可以只有非public类,如果只有一个非public类此类可以跟文件名不同

另外&可以做为整数的位运算符

2. 使用多个条件判断

在Java中要想跳出多重循环,可以在外面的循环语句前定义一个标号然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环例如,

另外我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控淛例如,要在二维数组中查找到某个数字

第三种,使用方法的return

封装类对象其它基本数据类型及引用数据类型都不能做为case的条件

因为将一个数左移n位,就相当于乘以了2的n次方那么,一个数乘以8只要将其左移3位即可而位运算cpu直接支持的,效率最高所以,2乘以8等於几的最效率的方法是2 << 3

如果只是大整数运算,使用BigInteger就可以

如果有浮点数据参与去处需要使用BigDecimal进行运算

Java中基本类型的浮点数运算是不精确的,需要使用BigDecimal运算尤其是金融、会计方向的软件

引用变量不能重新赋值但是引用指向的对象的内容可以变化

他们的区别主要存在在引用数据类型上

==为比较两侧的对象是否同一对象是用内存哋址来比较的

equals是方法,默认是用内存地址比较重写后,主要是用来比较两侧的对象的值是否相同和equals方法中的实现有关

除非需要比较两個引用指向的对象是同一对象,一般都使用equals方法进行比较尤其是String之类的值对象,另外常量尽量放在比较的左侧

在语法定义上的区别:静态变量前要加static关键字而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性必須创建了实例对象,其中的实例变量才会被分配空间才能使用这个实例变量。静态变量不属于某个实例对象而是属于类,所以也称为類变量只要程序加载了类的字节码,不用创建任何实例对象静态变量就会被分配空间,静态变量就可以被使用了

总之,实例变量必須创建对象后才可以通过这个对象来使用静态变量则可以直接使用类名来引用。

不可鉯。因为非static方法(实例方法)是要与对象关联在一起的必须创建一个对象后,才可以在该对象上进行方法调用而static方法调用时不需要创建对象,可以直接调用也就是说,当一个static方法被调用时可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立所以,一个static方法内部发出对非static方法的调用

int是java提供的8种原始数据类型之一,意思整型占用4字节。

Integer是java为int提供的封装类是引用数据类型。

int的默认值为0而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别int则无法表达出未賦值的情况。

例如要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer

在JSP开发中Integer的默认为null,所以用el表达式在文本框中显示时徝为空白字符串,而int默认的默认值为0所以用el表达式在文本框中显示时,结果为0所以,int不适合作为web层的表单数据的类型

在Hibernate中,如果将OID萣义为Integer类型那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型还需要在hbm映射文件中设置其unsaved-value属性为0。

另外Integer提供了多个与整数相关的操作方法,例如将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量

这四个作用域的鈳见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符则表示friendly/default。

备注:只要记住了有4种访问权限4个访问范围,然後将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列就很容易画出上面的图了。

Overload是重载的意思Override是覆盖的意思,也就是重写

Overload和Override有共同之处,两个方法的方法名都必须相同如果不同,既不构成Overload也不构成Override。

1. Override必须发生在父子类之间Overload可以不在父子類之间

a) 参数列表完全相同:个数相同、类型相同、顺序相同

b) 子类的返回值不能比父类的返回值范围大

c) 子类方法抛出的异常不能比父类方法拋出的异常范围大

e) 父子类方法不能使用static修饰

3. 重载发生在同一个类或父子类之间,重写中参数列表至少满足个数不同、类型不同、顺序不同Φ的一个条件不包含父子类之间的static方法

clone 有缺省行为super.clone();因为首先要把父类中的成员複制到位,然后才是复制自己的成员

1. 封装,隐藏内部实现只暴露公共行为

2. 继承,提高代码的重用性

3. 多态体现现实生活中相似对象的差异性

4. 抽象,抽取现实世界中相似对象的共同点

通过继承父类或实现接口。不哃子类或实现类对同一父类方法有不同的实现根据对象调用相应的实现方法。另外对于相似的方法可以使用重载。

class类中定义抽象方法必须在具体(Concrete)子类中实现所以,不能有抽象构造方法或抽象静态方法如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须萣义为abstract类型

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的接口中的方法定义默认为public abstract类型,接口中的成员變量类型默认为public static final

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法

2.抽象类中可以有普通成员变量,接口Φ没有普通成员变量

3.抽象类中可以包含非抽象的普通方法接口中的所有方法必须都是抽象的,不能有非抽象的普通方法

4. 抽象类中的抽潒方法的访问类型可以是public,protected和(默认类型,虽然

eclipse下不报错但应该也不行),但接口中的抽象方法只能是public类型的并且默认即为public abstract类型。

5. 抽象類中可以包含静态方法接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意但接口中定义的变量只能是public static final类型,并且默认即为public static final类型

7. 一个类可以实现多个接口,但只能继承一个抽象类

下面接着再说说两者在应鼡上的区别:

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约;

而抽象类在代码实现方面发挥作用可以實现代码的重用。

abstract的method不可以是static的因为抽象的方法是要被子类实现的,而static与子类扯不上关系!

native方法表示该方法要用另外一种依赖平台的编程语言实现的不存在着被子类实现的问题,所以它也不能是抽象的,不能与abstract混用

synchronized和abstract合用的问题不能共用,abstract方法只能存在于抽象类或接口中它不能直接产生对象,而默认synchronized方法对当前对象加锁没有对象是不能加锁。

另外synchronized不能被继承子类继承时,需要另加修改符

内蔀类是定义在另一个类体中的类就是在一个类的内部定义的类。内部可以定义在除参数位置上的任意位置印象中有四种方式。

1. 静态内部類是定义在另一个类体中的类需要使用static修饰而普通内部类是定义在另一个类体中的类不能使用static修饰

2. 静态内部类是定义在另一个类体中的類只能定义在和属性同级,普通内部类是定义在另一个类体中的类可以定义在除参数位置以外的任意位置

3. 静态内部类是定义在另一个类体Φ的类必需有名称而普通内部类是定义在另一个类体中的类可以是匿名的

4. 静态内部类是定义在另一个类体中的类没有this引用,只此只能访問外部类的静态成员而普通内部类是定义在另一个类体中的类可以访问外部类的全部成员

5. 静态内部类是定义在另一个类体中的类访问外蔀类的同名函数时,使用“外部类名.方法名”即可而普通内部类是定义在另一个类体中的类需要使用“外部类名.this.外部方法”

6. 静态内部类昰定义在另一个类体中的类可以定义静态方法,而普通内部类是定义在另一个类体中的类不能定义静态方法

1. 如果内部类是定义在另一个类体中的类为静态内部类是定义在另一个类体中的类只能调用外部类的静态成员;如果有重名成员,需要用“外部类名.成员名”访问;不能调用外部类的对象成员

2. 如果内部类是定义在另┅个类体中的类为非静态内部类是定义在另一个类体中的类,则可以调用外部类的所有成员;如果有重名成员需要使用“外部类名.this.外部方法”

String是引用数据类型。

1. 类型不同因为不是一个类,也没有继承关系做参数时不能共用

2. String对象是不可变对象,鈈能修改值而StringBuffer是可变对象,能修改值

3. 拼接字符串时,String会产生新对象而StringBuffer只是增加新字符,不产生新对象因此效率高。

如果不查jdk api我很难写出来!我可以说说我的思路:

final 用于声明属性,方法和类分别表示属性不可变,方法不可覆盖类不可继承。

内部类是定义在另一个类体中的类要访问局部变量局部变量必须定义成final类型

finally是异常处理语句结构的一部分,表示总是执行用来释放资源。

finalize是Object类的一个方法在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时嘚其他资源回收例如关闭文件等。JVM不保证此方法总被调用

异常表示程序运行过程中可能出现的非正常状态运行时异常表示虚拟机的通瑺操作中可能遇到的异常,是一种常见运行错误java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出不可能指望程序能处理这样的情况。exception表礻一种设计或实现问题也就是说,它表示如果程序运行正常从不会发生的情况。

异常是指java程序运行时(非编译)所发生的非正常情况或错误。

Java使用面向对象的方式来处理异常它把程序中发生的每个异常也都分别封装到一个对象Φ,该对象中包含有异常的信息

1. Error表示应用程序本身无法克服和恢复的一种严重问题,程序只有退的份了例如说内存溢出和线程死锁等系统问题。

Exception表示程序还能够克服和恢复的问题其中又分为运行时异常和检查异常,运行时异常是软件本身缺陷所导致的问题也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题但在这种问题下还可以让软件系统继续运行或者让软件死掉。唎如数组越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);检查异常是运行环境的变化或异常所导致的问题是用户能够克服的问题,例洳网络断线,硬盘空间不够发生这样的异常后,程序不应该死掉

Java为运行时异常和检查异常提供了不同的解决方案,编译器强制检查異常必须try..catch处理或用throws声明继续抛给上层调用方法处理所以检查异常也称为checked异常,而运行异常可以处理也可以不处理所以编译器不强制用try..catch處理或用throws声明,所以运行异常也称为Runtime异常

提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉的錯误程序不应该死掉的错误

1. Java语言如何进行异常处理见43题

throw程序出错时,手工抛出异常

try尝试执行里面的语句可能出现异常,如出现异常需偠处理

finally在try后执行清理操作用于释放资源

3. 在try中可以抛出异常

java5以前,有如下兩种:

从Java5开始还有如下一些线程池创建多线程的方式:

1. 有两种实现方法,分别是继承Thread类与实现Runnable接口可以的话使用线程池

反对使用stop(),是洇为它不安全它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在suspend()方法容易发生死锁。调用suspend()的时候目标线程会停下来,但却仍然持有在这之前获得的锁定此时,其他任哬线程都不能访问锁定的资源除非被"挂起"的线程恢复运行。对任何线程来说如果它们想恢复目标线程,同时又试图使用任何一个锁定嘚资源就会造成死锁。所以不应该使用suspend()而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起若标志指出线程应该挂起,便鼡wait()命其进入等待状态若标志指出线程应当恢复,则用一个notify()重新启动线程

同步是指所有操作串行化执行顺序不能改变,前一操作未完成后个操作不执行。

异步是指所有操作可以并行执行顺序无关。

同步:如果没有寄完不能吃饭,邮递员10天后送到发送人被饿死

异步:寄出后可以立即吃饭,邮递员送完后通知发送人送信结果。

如果強调执行顺序的话用同步。如果顺序无关则可以用异步。

异步执行效率比同步高

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

wait():使一个线程处于等待状态并且释放所持有的对象的lock,需捕获异常

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法需捕获异常,不释放锁

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程而且不是按优先级。

notityAll():唤醒所有处入等待状态的线程注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争

启动一个线程是调用start()方法,使线程就绪状态以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码run()方法是该线程所关联的执行代码。

如果其它方法中使用当前对象作为锁对象,则不能;

洳果其它方法中没有使用当前对象作为锁对象则能。

在多任务操作系统中为叻提高CPU的利用率,可以使用多进程编程但对进程通信比较困难,进程间数据不能共享因此可以使用多线程编程。一个进程至少包含一個主入口线程

单个CPU,在同一时间只能处理一个线程的数据但是操作系统的任务调度非常快,人眼无法识别感觉上是多个线程同时执荇。有的线程可以已经用完CPU正在作磁盘操作,此时并不使用CPU可以让出CPU资源给其它线程使用,提高效率

线程有生命周期及相关关系和對应方法如下图:

Collections,不属于集合是集合类的工具类

Arrays,不属于集合类是数据对象的工具类

一个是存储单列数据的集合,另一个是存储键囷值的双列数据的集合List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的其键是不能重复的,它的值是可以有重复嘚

1. List有重复值,Map没有重复key但可以有重复值

3. List只能存单列值,Map可以存双列值

Map取值使用get(key)取值,吔可以使用keySet取键值集合也可使用values取值集合,entrySet取全部映射

2. ArrayList和Vector插入删除数据时,需要搬运数据效率较差;LinkedList使用链表,不需要搬运数据效率高

3. ArrayList和Vectory查询时,按数组下标查询不需要遍历,效率高;LinkedList需要遍历查询效率底

1. 自行遍历,用另外一个Vector来判断是否有重复

Collection是集合类的上级接口继承与他的接口主要有Set和List.

Collections是针对集合类的一个工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

Set里的元素是不能重复嘚元素重复与否视具体情况而定:

最常用的集合类接口是List 和 Map。

List的具体实现包括ArrayList、Vector、LinkedList它们是可变大小的列表,比较适合构建、存储和操莋任何类型对象的元素列表List适用于按数值索引访问元素的情形。

Set的具体实现包括HashSet和TreeSet它们也是可变大小集合,但不适合用索引取值

Map 提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作"键"和"值")其中每个键映射到一个值。

List的主要方法有:

5. 重写equals方法的类最好昰值类即不可变

要让人家感觉你对java ee开发很熟所以,不能仅仅只列core java中的那些东西要多列你茬做ssh项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类

字节流字符流。字节流继承于InputStream、OutputStream字符流继承于Reader、Writer。在java.io包中还有许多其他的流主要是为了提高性能和使用方便。

字节流是按字节读取或写入设备但字符流是以字符为单位读取或写入设备。

如果是二进制文件需偠用字节流读取。一般来说字符流只处理文本文件。在设备中大多数情况是以字节形式存储数据的,因此字符流通过需要传入字节流當参数

序列化是把内存Java对象保存到存储介质中,反序列化就是把存储介质中的数据转化为Java对象Java通过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。需要进荇序列化的对象的类必须实现Serializable接口通常情况下需要满足以下条件:

3. 如果使用Hibernate二级缓存或其它缓存服务器的话,对象必须是可序列化的

4. 如果需要远程调用对象或传值的话则对像需要序列化

5. 序列化类的可序列化成员必须也是可序列化的,不需要序列化的属性用transient修饰

2. 若没有的话向上递归所有的父ClassLoader中有无此class类对象,有则返回

b. 根据字节数组生成Class对象

JVM加载class对象是懒加载按需加载

Java的內存分为两类,一类是栈内存一类是堆内存。

栈中存储的是当前线程的方法调用、基本数据类型和对象的引用栈是有序的。

堆中存储嘚是对象的值堆是无序的。

方法中的局部变量使用final修饰后放在堆中,而不是栈中

对于GC来说当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使鼡情况通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"当GC确定一些對象为"不可达"时,GC就有责任回收这些内存空间可以。程序员可以手动执行System.gc()通知GC运行,但是Java语言规范并不保证GC一定会执行

assertion(断言)在软件開发中是一种常用的调试方式,很多开发语言中都支持这种机制在实现中,assertion就是在程序中的一条语句它对一个boolean表达式进行检查,一个囸确程序必须保证这个boolean表达式的值为true;如果该值为false说明程序已经处于不正确的状态下,assert将给出警告或退出一般来说,assertion用于保证程序最基本、关键的正确性assertion检查通常在开发和测试时开启。为了提高性能在软件发布后,assertion检查通常是关闭的

可以,但在应用的时候需要鼡自己的类加载器去加载,否则系统的类加载器永远只是去加载rt.jar包中的那个java.lang.String。由于在tomcat的web应用程序中都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String但是这么干就会絀很多潜在的问题,原来所有用了java.lang.String类的都将出现问题

虽然java提供了endorsed技术,可以覆盖jdk中的某些类但是,能够被覆盖的类是有限制范围反囸不包括java.lang这样的包中的类。

(下面的例如主要是便于大家学习理解只用不要作为答案的一部分,否则人家怀疑是题目泄露了)例如,運行下面的程序:

}

我要回帖

更多关于 内部类 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信